]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/generate.cpp
Make constant id range configurable and avoid duplicates
[libs/gl.git] / source / glsl / generate.cpp
index f345670b0451d462f0b1083eb047b605e4a006bb..92d172c586469f78cd17c5d338700fc68e503c00 100644 (file)
@@ -8,9 +8,28 @@ namespace Msp {
 namespace GL {
 namespace SL {
 
-void ConstantIdAssigner::apply(Stage &stage)
+void ConstantIdAssigner::apply(Module &module, const Features &features)
 {
-       stage.content.visit(*this);
+       for(list<Stage>::iterator i=module.stages.begin(); i!=module.stages.end(); ++i)
+               i->content.visit(*this);
+
+       unsigned max_id = features.max_constant_id;
+       for(vector<VariableDeclaration *>::iterator i=auto_constants.begin(); i!=auto_constants.end(); ++i)
+       {
+               unsigned id = hash32((*i)->name)%(max_id+1);
+               while(used_ids.count(id))
+                       ++id;
+
+               vector<Layout::Qualifier> &qualifiers = (*i)->layout->qualifiers;
+               for(vector<Layout::Qualifier>::iterator j=qualifiers.begin(); j!=qualifiers.end(); ++j)
+                       if(j->name=="constant_id")
+                       {
+                               j->value = id;
+                               break;
+                       }
+
+               used_ids.insert(id);
+       }
 }
 
 void ConstantIdAssigner::visit(VariableDeclaration &var)
@@ -22,7 +41,9 @@ void ConstantIdAssigner::visit(VariableDeclaration &var)
                        if(i->name=="constant_id" && i->has_value)
                        {
                                if(i->value==-1)
-                                       i->value = hash32(var.name)&0x7FFFFFFF;
+                                       auto_constants.push_back(&var);
+                               else
+                                       used_ids.insert(i->value);
                                break;
                        }
        }