]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/compatibility.cpp
Rewrite syntax tree modifications
[libs/gl.git] / source / glsl / compatibility.cpp
index 1ada7b7c9acbd0f23fab28e868ca839621263b92..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)
 {
-       SetForScope<Stage::Type> set_stage(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)
 {
-       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)
@@ -85,18 +89,22 @@ 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)
 {
-       SetForScope<Stage *> set_stage(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
 {
        if(target_version<feature_version)
@@ -285,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);
                }
        }
 
@@ -312,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