X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Fgenerate.cpp;fp=source%2Fglsl%2Fgenerate.cpp;h=92d172c586469f78cd17c5d338700fc68e503c00;hb=c1b42fd479c5ca4cbab258ee0fa5c7cac319f928;hp=f345670b0451d462f0b1083eb047b605e4a006bb;hpb=d9d7ab44d5f88c4537906e77c49db06d6bdc099c;p=libs%2Fgl.git diff --git a/source/glsl/generate.cpp b/source/glsl/generate.cpp index f345670b..92d172c5 100644 --- a/source/glsl/generate.cpp +++ b/source/glsl/generate.cpp @@ -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::iterator i=module.stages.begin(); i!=module.stages.end(); ++i) + i->content.visit(*this); + + unsigned max_id = features.max_constant_id; + for(vector::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 &qualifiers = (*i)->layout->qualifiers; + for(vector::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; } }