]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/compatibility.cpp
Rewrite syntax tree modifications
[libs/gl.git] / source / glsl / compatibility.cpp
index 0c312d022ca20f71da5818863136614647e47fd7..a9f38a35cda42481935864b5bbd97285bbf63462 100644 (file)
@@ -14,18 +14,23 @@ namespace GL {
 namespace SL {
 
 DefaultPrecisionGenerator::DefaultPrecisionGenerator():
-       toplevel(true)
+       stage(0)
 { }
 
+void DefaultPrecisionGenerator::apply(Stage &s)
+{
+       stage = &s;
+       visit(s.content);
+}
+
 void DefaultPrecisionGenerator::visit(Block &block)
 {
-       if(toplevel)
+       for(NodeList<Statement>::iterator i=block.body.begin(); i!=block.body.end(); ++i)
        {
-               SetForScope<bool> set(toplevel, false);
-               BlockModifier::visit(block);
+               if(&block==&stage->content)
+                       insert_point = i;
+               (*i)->visit(*this);
        }
-       else
-               StageVisitor::visit(block);
 }
 
 void DefaultPrecisionGenerator::visit(Precision &prec)
@@ -49,21 +54,27 @@ void DefaultPrecisionGenerator::visit(VariableDeclaration &var)
                Precision *prec = new Precision;
                if(!type.compare(0, 7, "sampler"))
                        prec->precision = "lowp";
-               else if(stage->type==FRAGMENT)
+               else if(stage->type==Stage::FRAGMENT)
                        prec->precision = "mediump";
                else
                        prec->precision = "highp";
                prec->type = type;
-               insert_nodes.push_back(prec);
+               stage->content.body.insert(insert_point, prec);
 
                have_default.insert(type);
        }
 }
 
 
-void PrecisionRemover::visit(Precision &)
+void PrecisionRemover::apply(Stage &stage)
 {
-       remove_node = true;
+       visit(stage.content);
+       NodeRemover().apply(stage, nodes_to_remove);
+}
+
+void PrecisionRemover::visit(Precision &prec)
+{
+       nodes_to_remove.insert(&prec);
 }
 
 void PrecisionRemover::visit(VariableDeclaration &var)
@@ -78,11 +89,21 @@ LegacyConverter::LegacyConverter():
        frag_out(0)
 { }
 
-LegacyConverter::LegacyConverter(const Version &v):
-       target_api(get_gl_api()),
-       target_version(v),
-       frag_out(0)
-{ }
+void LegacyConverter::apply(Stage &s)
+{
+       stage = &s;
+       visit(s.content);
+}
+
+void LegacyConverter::visit(Block &block)
+{
+       for(NodeList<Statement>::iterator i=block.body.begin(); i!=block.body.end(); ++i)
+       {
+               if(&block==&stage->content)
+                       uniform_insert_point = i;
+               (*i)->visit(*this);
+       }
+}
 
 bool LegacyConverter::check_version(const Version &feature_version) const
 {
@@ -145,47 +166,54 @@ bool LegacyConverter::supports_unified_sampling_functions() const
 
 void LegacyConverter::visit(FunctionCall &call)
 {
-       if(call.name=="texture" && !call.declaration && !supports_unified_sampling_functions())
+       if(call.name=="texture")
        {
+               string sampler_type;
+               type = string();
                NodeArray<Expression>::iterator i = call.arguments.begin();
                if(i!=call.arguments.end())
                {
                        (*i)->visit(*this);
-                       if(type=="sampler1D")
+                       sampler_type = type;
+
+                       for(; i!=call.arguments.end(); ++i)
+                               (*i)->visit(*this);
+               }
+
+               if(!supports_unified_sampling_functions())
+               {
+                       if(sampler_type=="sampler1D")
                                call.name = "texture1D";
-                       else if(type=="sampler2D")
+                       else if(sampler_type=="sampler2D")
                                call.name = "texture2D";
-                       else if(type=="sampler3D")
+                       else if(sampler_type=="sampler3D")
                                call.name = "texture3D";
-                       else if(type=="samplerCube")
+                       else if(sampler_type=="samplerCube")
                                call.name = "textureCube";
-                       else if(type=="sampler1DShadow")
+                       else if(sampler_type=="sampler1DShadow")
                                call.name = "shadow1D";
-                       else if(type=="sampler2DShadow")
+                       else if(sampler_type=="sampler2DShadow")
                                call.name = "shadow2D";
-                       else if(type=="sampler1DArray")
+                       else if(sampler_type=="sampler1DArray")
                        {
                                check_extension(EXT_texture_array);
                                call.name = "texture1DArray";
                        }
-                       else if(type=="sampler2DArray")
+                       else if(sampler_type=="sampler2DArray")
                        {
                                check_extension(EXT_texture_array);
                                call.name = "texture2DArray";
                        }
-                       else if(type=="sampler1DArrayShadow")
+                       else if(sampler_type=="sampler1DArrayShadow")
                        {
                                check_extension(EXT_texture_array);
                                call.name = "shadow1DArray";
                        }
-                       else if(type=="sampler2DArrayShadow")
+                       else if(sampler_type=="sampler2DArrayShadow")
                        {
                                check_extension(EXT_texture_array);
                                call.name = "shadow2DArray";
                        }
-
-                       for(; i!=call.arguments.end(); ++i)
-                               (*i)->visit(*this);
                }
        }
        else
@@ -231,12 +259,12 @@ void LegacyConverter::visit(VariableDeclaration &var)
                if(i!=var.layout->qualifiers.end())
                {
                        unsigned location = lexical_cast<unsigned>(i->value);
-                       if(stage->type==VERTEX && var.interface=="in")
+                       if(stage->type==Stage::VERTEX && var.interface=="in")
                        {
                                stage->locations[var.name] = location;
                                var.layout->qualifiers.erase(i);
                        }
-                       else if(stage->type==FRAGMENT && var.interface=="out")
+                       else if(stage->type==Stage::FRAGMENT && var.interface=="out")
                        {
                                if(location!=0)
                                        static Require _req(EXT_gpu_shader4);
@@ -262,10 +290,10 @@ void LegacyConverter::visit(VariableDeclaration &var)
 
        if((var.interface=="in" || var.interface=="out") && !supports_unified_interface_syntax())
        {
-               if(stage->type==FRAGMENT && var.interface=="out")
+               if(stage->type==Stage::FRAGMENT && var.interface=="out")
                {
                        frag_out = &var;
-                       remove_node = true;
+                       nodes_to_remove.insert(&var);
                }
        }
 
@@ -292,7 +320,10 @@ bool LegacyConverter::supports_interface_blocks(const string &iface) const
 void LegacyConverter::visit(InterfaceBlock &iface)
 {
        if(!supports_interface_blocks(iface.interface))
-               flatten_block(iface.members);
+       {
+               stage->content.body.splice(uniform_insert_point, iface.members.body);
+               nodes_to_remove.insert(&iface);
+       }
 }
 
 } // namespace SL