]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/compatibility.cpp
Rewrite syntax tree modifications
[libs/gl.git] / source / glsl / compatibility.cpp
index 692db972b56491eca5de797ae0f79bec61995754..a9f38a35cda42481935864b5bbd97285bbf63462 100644 (file)
@@ -14,25 +14,23 @@ namespace GL {
 namespace SL {
 
 DefaultPrecisionGenerator::DefaultPrecisionGenerator():
-       stage_type(Stage::SHARED),
-       toplevel(true)
+       stage(0)
 { }
 
-void DefaultPrecisionGenerator::apply(Stage &stage)
+void DefaultPrecisionGenerator::apply(Stage &s)
 {
-       stage_type = stage.type;
-       visit(stage.content);
+       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
-               TraversingVisitor::visit(block);
 }
 
 void DefaultPrecisionGenerator::visit(Precision &prec)
@@ -56,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==Stage::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)
+{
+       visit(stage.content);
+       NodeRemover().apply(stage, nodes_to_remove);
+}
+
+void PrecisionRemover::visit(Precision &prec)
 {
-       remove_node = true;
+       nodes_to_remove.insert(&prec);
 }
 
 void PrecisionRemover::visit(VariableDeclaration &var)
@@ -91,6 +95,16 @@ void LegacyConverter::apply(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
 {
        if(target_version<feature_version)
@@ -279,7 +293,7 @@ void LegacyConverter::visit(VariableDeclaration &var)
                if(stage->type==Stage::FRAGMENT && var.interface=="out")
                {
                        frag_out = &var;
-                       remove_node = true;
+                       nodes_to_remove.insert(&var);
                }
        }
 
@@ -306,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