void Compiler::compile(Mode mode)
{
+ if(specialized && mode!=PROGRAM)
+ throw invalid_operation("Compiler::compile");
+
for(list<Stage>::iterator i=module->stages.begin(); i!=module->stages.end(); ++i)
generate(*i);
ConstantIdAssigner().apply(*module, features);
if(!valid)
throw invalid_shader_source(get_diagnostics());
- if(mode==PROGRAM && specialized)
+ if(specialized)
{
for(list<Stage>::iterator i=module->stages.begin(); i!=module->stages.end(); ++i)
ConstantSpecializer().apply(*i, spec_values);
++i;
}
- LocationAllocator().apply(*module);
+ LocationAllocator().apply(*module, features);
for(list<Stage>::iterator i=module->stages.begin(); i!=module->stages.end(); ++i)
finalize(*i, mode);
IdentifierValidator().apply(stage);
ReferenceValidator().apply(stage);
ExpressionValidator().apply(stage);
+ FlowControlValidator().apply(stage);
StageInterfaceValidator().apply(stage);
}
/* Removing variables or functions may cause things from the previous stage
to become unused. */
- bool any_removed = UnusedVariableRemover().apply(stage);
+ bool any_removed = UnreachableCodeRemover().apply(stage);
+ any_removed |= UnusedVariableRemover().apply(stage);
any_removed |= UnusedFunctionRemover().apply(stage);
any_removed |= UnusedTypeRemover().apply(stage);