void Compiler::compile(Mode mode)
{
for(list<Stage>::iterator i=module->stages.begin(); i!=module->stages.end(); ++i)
- generate(*i, mode);
+ generate(*i);
+ ConstantIdAssigner().apply(*module, features);
+
+ for(list<Stage>::iterator i=module->stages.begin(); i!=module->stages.end(); ++i)
+ validate(*i);
+ GlobalInterfaceValidator().apply(*module);
bool valid = true;
for(list<Stage>::iterator i=module->stages.begin(); i!=module->stages.end(); ++i)
- if(!validate(*i))
+ if(!check_errors(*i))
valid = false;
if(!valid)
throw invalid_shader_source(get_diagnostics());
- unsigned n = 0;
- for(list<Stage>::iterator i=module->stages.begin(); i!=module->stages.end(); ++n)
+ if(mode==PROGRAM && specialized)
+ {
+ for(list<Stage>::iterator i=module->stages.begin(); i!=module->stages.end(); ++i)
+ ConstantSpecializer().apply(*i, spec_values);
+ }
+ for(list<Stage>::iterator i=module->stages.begin(); i!=module->stages.end(); )
{
OptimizeResult result = optimize(*i);
if(result==REDO_PREVIOUS)
else if(result!=REDO_STAGE)
++i;
}
+
+ LocationAllocator().apply(*module);
for(list<Stage>::iterator i=module->stages.begin(); i!=module->stages.end(); ++i)
finalize(*i, mode);
append_module(import_parser.parse(*io, fn, module->source_map.get_count()), resources);
}
-void Compiler::generate(Stage &stage, Mode mode)
+void Compiler::generate(Stage &stage)
{
stage.required_features.gl_api = features.gl_api;
if(module->shared.required_features.glsl_version>stage.required_features.glsl_version)
variables through interfaces. */
InterfaceGenerator().apply(stage);
resolve(stage, RESOLVE_BLOCKS|RESOLVE_TYPES|RESOLVE_VARIABLES);
-
- ConstantSpecializer().apply(stage, (mode==PROGRAM && specialized ? &spec_values : 0));
}
template<typename T>
}
}
-bool Compiler::validate(Stage &stage)
+void Compiler::validate(Stage &stage)
{
DeclarationValidator().apply(stage);
IdentifierValidator().apply(stage);
ReferenceValidator().apply(stage);
ExpressionValidator().apply(stage);
+ StageInterfaceValidator().apply(stage);
+}
+bool Compiler::check_errors(Stage &stage)
+{
stable_sort(stage.diagnostics, &diagnostic_line_order);
for(vector<Diagnostic>::const_iterator i=stage.diagnostics.begin(); i!=stage.diagnostics.end(); ++i)