X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Fcompiler.cpp;h=d8b060ea4e3873285980373e45974ee1b6b84950;hb=3bb1cda37e23840236b46c4de20cab2c70b02327;hp=e9933e2f9b67c4ec414999438a9e8c1c0ec60ba9;hpb=5e4204ecaf54f49b63587ef5cd669a1b3838e0e9;p=libs%2Fgl.git diff --git a/source/glsl/compiler.cpp b/source/glsl/compiler.cpp index e9933e2f..d8b060ea 100644 --- a/source/glsl/compiler.cpp +++ b/source/glsl/compiler.cpp @@ -2,10 +2,10 @@ #include #include #include "builtin.h" -#include "compatibility.h" #include "compiler.h" #include "debug.h" #include "error.h" +#include "finalize.h" #include "generate.h" #include "glsl_error.h" #include "optimize.h" @@ -24,12 +24,14 @@ namespace SL { Compiler::Compiler(): features(Features::from_context()), module(0), + compiled(false), specialized(false) { } Compiler::Compiler(const Features &f): features(f), module(0), + compiled(false), specialized(false) { } @@ -96,10 +98,15 @@ void Compiler::compile(Mode mode) } for(list::iterator i=module->stages.begin(); i!=module->stages.end(); ++i) finalize(*i, mode); + + compiled = true; } string Compiler::get_combined_glsl() const { + if(!compiled) + throw invalid_operation("Compiler::get_combined_glsl"); + string glsl; unsigned source_count = module->source_map.get_count(); @@ -126,6 +133,8 @@ vector Compiler::get_stages() const string Compiler::get_stage_glsl(Stage::Type stage_type) const { + if(!compiled) + throw invalid_operation("Compiler::get_stage_glsl"); for(list::iterator i=module->stages.begin(); i!=module->stages.end(); ++i) if(i->type==stage_type) return Formatter().apply(*i); @@ -134,6 +143,8 @@ string Compiler::get_stage_glsl(Stage::Type stage_type) const const map &Compiler::get_vertex_attributes() const { + if(!compiled) + throw invalid_operation("Compiler::get_vertex_attributes"); for(list::const_iterator i=module->stages.begin(); i!=module->stages.end(); ++i) if(i->type==Stage::VERTEX) return i->locations; @@ -142,6 +153,8 @@ const map &Compiler::get_vertex_attributes() const const map &Compiler::get_fragment_outputs() const { + if(!compiled) + throw invalid_operation("Compiler::get_fragment_outputs"); for(list::const_iterator i=module->stages.begin(); i!=module->stages.end(); ++i) if(i->type==Stage::FRAGMENT) return i->locations; @@ -251,11 +264,6 @@ void Compiler::generate(Stage &stage, Mode mode) resolve(stage, RESOLVE_BLOCKS|RESOLVE_TYPES|RESOLVE_VARIABLES); ConstantSpecializer().apply(stage, (mode==PROGRAM && specialized ? &spec_values : 0)); - if(mode==PROGRAM) - { - LegacyConverter().apply(stage, features); - resolve(stage, RESOLVE_VARIABLES|RESOLVE_FUNCTIONS); - } } template @@ -287,8 +295,8 @@ void Compiler::resolve(Stage &stage, unsigned flags) bool Compiler::validate(Stage &stage) { - TypeValidator().apply(stage); DeclarationValidator().apply(stage); + IdentifierValidator().apply(stage); ReferenceValidator().apply(stage); ExpressionValidator().apply(stage); @@ -345,10 +353,12 @@ Compiler::OptimizeResult Compiler::optimize(Stage &stage) void Compiler::finalize(Stage &stage, Mode mode) { - if(get_gl_api()==OPENGL_ES2 && mode==PROGRAM) - DefaultPrecisionGenerator().apply(stage); - else if(mode==MODULE) - PrecisionRemover().apply(stage); + if(mode==PROGRAM) + { + LegacyConverter().apply(stage, features); + resolve(stage, RESOLVE_VARIABLES|RESOLVE_FUNCTIONS); + PrecisionConverter().apply(stage); + } } void Compiler::inject_block(Block &target, const Block &source)