for(list<Stage>::iterator i=module->stages.begin(); i!=module->stages.end(); ++i)
{
if(i->type==VERTEX)
+ {
program.attach_shader_owned(new VertexShader(apply<Formatter>(*i)));
+ for(map<string, unsigned>::iterator j=i->locations.begin(); j!=i->locations.end(); ++j)
+ program.bind_attribute(j->second, j->first);
+ }
else if(i->type==GEOMETRY)
program.attach_shader_owned(new GeometryShader(apply<Formatter>(*i)));
else if(i->type==FRAGMENT)
+ {
program.attach_shader_owned(new FragmentShader(apply<Formatter>(*i)));
+ for(map<string, unsigned>::iterator j=i->locations.begin(); j!=i->locations.end(); ++j)
+ program.bind_fragment_data(j->second, j->first);
+ }
}
-
- program.bind_attribute(VERTEX4, "vertex");
- program.bind_attribute(NORMAL3, "normal");
- program.bind_attribute(COLOR4_FLOAT, "color");
- program.bind_attribute(TEXCOORD4, "texcoord");
}
Module *ProgramCompiler::create_builtins_module()
{
stage->in_variables.erase(var.name);
stage->out_variables.erase(var.name);
+ stage->locations.erase(var.name);
if(var.linked_declaration)
var.linked_declaration->linked_declaration = 0;
}
void ProgramCompiler::LegacyConverter::visit(VariableDeclaration &var)
{
- if(var.interface=="in" || var.interface=="out")
- if(!check_version(Version(1, 30)))
+ if(var.layout && !check_version(Version(3, 30)))
+ {
+ vector<Layout::Qualifier>::iterator i;
+ for(i=var.layout->qualifiers.begin(); (i!=var.layout->qualifiers.end() && i->identifier!="location"); ++i) ;
+ if(i!=var.layout->qualifiers.end())
{
+ unsigned location = lexical_cast<unsigned>(i->value);
if(stage->type==VERTEX && var.interface=="in")
- var.interface = "attribute";
- else if((stage->type==VERTEX && var.interface=="out") || (stage->type==FRAGMENT && var.interface=="in"))
- var.interface = "varying";
+ {
+ stage->locations[var.name] = location;
+ var.layout->qualifiers.erase(i);
+ }
else if(stage->type==FRAGMENT && var.interface=="out")
{
- frag_out_name = var.name;
- remove_node = true;
+ stage->locations[var.name] = location;
+ var.layout->qualifiers.erase(i);
}
+
+ if(var.layout->qualifiers.empty())
+ var.layout = 0;
+ }
+ }
+
+ if((var.interface=="in" || var.interface=="out") && !check_version(Version(1, 30)))
+ {
+ if(stage->type==VERTEX && var.interface=="in")
+ var.interface = "attribute";
+ else if((stage->type==VERTEX && var.interface=="out") || (stage->type==FRAGMENT && var.interface=="in"))
+ var.interface = "varying";
+ else if(stage->type==FRAGMENT && var.interface=="out")
+ {
+ frag_out_name = var.name;
+ remove_node = true;
}
+ }
TraversingVisitor::visit(var);
}