X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Fcompiler.cpp;h=b2c4f9ba2cbed88dee8b4e70f00d8a6c4afb5739;hb=577a93f39f9b4d0f5101cd2f539fc774e7b06825;hp=91a13f4398ed02af892f4f1db567b216fab5b5fa;hpb=c6b29fbf9927467b21dca65539a1fa2c98f96e0e;p=libs%2Fgl.git diff --git a/source/glsl/compiler.cpp b/source/glsl/compiler.cpp index 91a13f43..b2c4f9ba 100644 --- a/source/glsl/compiler.cpp +++ b/source/glsl/compiler.cpp @@ -78,6 +78,9 @@ void Compiler::specialize(const map &sv) void Compiler::compile(Mode mode) { + if(specialized && mode!=PROGRAM) + throw invalid_operation("Compiler::compile"); + for(list::iterator i=module->stages.begin(); i!=module->stages.end(); ++i) generate(*i); ConstantIdAssigner().apply(*module, features); @@ -93,7 +96,7 @@ void Compiler::compile(Mode mode) if(!valid) throw invalid_shader_source(get_diagnostics()); - if(mode==PROGRAM && specialized) + if(specialized) { for(list::iterator i=module->stages.begin(); i!=module->stages.end(); ++i) ConstantSpecializer().apply(*i, spec_values); @@ -107,7 +110,7 @@ void Compiler::compile(Mode mode) ++i; } - LocationAllocator().apply(*module); + LocationAllocator().apply(*module, features); for(list::iterator i=module->stages.begin(); i!=module->stages.end(); ++i) finalize(*i, mode); @@ -323,6 +326,7 @@ void Compiler::validate(Stage &stage) IdentifierValidator().apply(stage); ReferenceValidator().apply(stage); ExpressionValidator().apply(stage); + FlowControlValidator().apply(stage); StageInterfaceValidator().apply(stage); } @@ -372,7 +376,8 @@ Compiler::OptimizeResult Compiler::optimize(Stage &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);