]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/optimize.cpp
Rearrange some utility struct constructors
[libs/gl.git] / source / glsl / optimize.cpp
index 7b3f8f28c8ad00007b520446ed5c2cc1180c49d0..43f94e8d4da10422be8a8047c238d9c61b9b6a9a 100644 (file)
@@ -8,6 +8,55 @@ namespace Msp {
 namespace GL {
 namespace SL {
 
+ConstantSpecializer::ConstantSpecializer():
+       values(0)
+{ }
+
+void ConstantSpecializer::apply(Stage &stage, const map<string, int> &v)
+{
+       values = &v;
+       stage.content.visit(*this);
+}
+
+void ConstantSpecializer::visit(VariableDeclaration &var)
+{
+       bool specializable = false;
+       if(var.layout)
+       {
+               vector<Layout::Qualifier> &qualifiers = var.layout->qualifiers;
+               for(vector<Layout::Qualifier>::iterator i=qualifiers.begin(); (!specializable && i!=qualifiers.end()); ++i)
+                       if(i->name=="constant_id")
+                       {
+                               specializable = true;
+                               qualifiers.erase(i);
+                       }
+
+               if(qualifiers.empty())
+                       var.layout = 0;
+       }
+
+       if(specializable)
+       {
+               map<string, int>::const_iterator i = values->find(var.name);
+               if(i!=values->end())
+               {
+                       RefPtr<Literal> literal = new Literal;
+                       if(var.type=="bool")
+                       {
+                               literal->token = (i->second ? "true" : "false");
+                               literal->value = static_cast<bool>(i->second);
+                       }
+                       else if(var.type=="int")
+                       {
+                               literal->token = lexical_cast<string>(i->second);
+                               literal->value = i->second;
+                       }
+                       var.init_expression = literal;
+               }
+       }
+}
+
+
 InlineableFunctionLocator::InlineableFunctionLocator():
        current_function(0),
        return_count(0)
@@ -319,15 +368,6 @@ void FunctionInliner::visit(Iteration &iter)
 }
 
 
-ExpressionInliner::ExpressionInfo::ExpressionInfo():
-       expression(0),
-       assign_scope(0),
-       inline_point(0),
-       trivial(false),
-       available(true)
-{ }
-
-
 ExpressionInliner::ExpressionInliner():
        r_ref_info(0),
        r_any_inlined(false),