namespace GL {
namespace SL {
-ConstantSpecializer::ConstantSpecializer():
- values(0)
-{ }
-
-void ConstantSpecializer::apply(Stage &stage, const map<string, int> *v)
+void ConstantIdAssigner::apply(Stage &stage)
{
- values = v;
stage.content.visit(*this);
}
-void ConstantSpecializer::visit(VariableDeclaration &var)
+void ConstantIdAssigner::visit(VariableDeclaration &var)
{
- bool specializable = false;
if(var.layout)
{
vector<Layout::Qualifier> &qualifiers = var.layout->qualifiers;
for(vector<Layout::Qualifier>::iterator i=qualifiers.begin(); i!=qualifiers.end(); ++i)
- if(i->name=="constant_id")
+ if(i->name=="constant_id" && i->has_value)
{
- specializable = true;
- if(values)
- qualifiers.erase(i);
- else if(i->value==-1)
+ if(i->value==-1)
i->value = hash32(var.name)&0x7FFFFFFF;
break;
}
-
- if(qualifiers.empty())
- var.layout = 0;
- }
-
- if(specializable && values)
- {
- 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;
- }
}
}