X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Fcompiler.cpp;h=803862cb45787974a21a50628d9495009eb2fbca;hb=1f09306906fbf57c05dccb27189264706cc64cfa;hp=7fe608bf6b0c80cce51a987f79ea4be225632494;hpb=b67e8c366cb53505c55a83cd8dc46c6f5da05d93;p=libs%2Fgl.git diff --git a/source/glsl/compiler.cpp b/source/glsl/compiler.cpp index 7fe608bf..803862cb 100644 --- a/source/glsl/compiler.cpp +++ b/source/glsl/compiler.cpp @@ -6,9 +6,11 @@ #include "debug.h" #include "error.h" #include "generate.h" +#include "glsl_error.h" #include "optimize.h" #include "output.h" #include "resources.h" +#include "validate.h" #undef interface @@ -74,6 +76,14 @@ void Compiler::compile(Mode mode) { for(list::iterator i=module->stages.begin(); i!=module->stages.end(); ++i) generate(*i, mode); + + bool valid = true; + for(list::iterator i=module->stages.begin(); i!=module->stages.end(); ++i) + if(!validate(*i)) + valid = false; + if(!valid) + throw invalid_shader_source(get_diagnostics()); + unsigned n = 0; for(list::iterator i=module->stages.begin(); (i!=module->stages.end() && n<10000); ++n) { @@ -150,6 +160,15 @@ string Compiler::get_stage_debug(Stage::Type stage_type) const throw key_error(Stage::get_stage_name(stage_type)); } +string Compiler::get_diagnostics() const +{ + string combined; + for(list::const_iterator i=module->stages.begin(); i!=module->stages.end(); ++i) + for(vector::const_iterator j=i->diagnostics.begin(); j!=i->diagnostics.end(); ++j) + combined += format("%s:%d: %s\n", module->source_map.get_name(j->source), j->line, j->message); + return combined; +} + void Compiler::append_module(Module &mod, DataFile::Collection *res) { module->source_map.merge_from(mod.source_map); @@ -237,6 +256,17 @@ void Compiler::generate(Stage &stage, Mode mode) LegacyConverter().apply(stage, features); } +bool Compiler::validate(Stage &stage) +{ + DeclarationValidator().apply(stage); + + for(vector::const_iterator i=stage.diagnostics.begin(); i!=stage.diagnostics.end(); ++i) + if(i->severity==Diagnostic::ERR) + return false; + + return true; +} + Compiler::OptimizeResult Compiler::optimize(Stage &stage) { ConstantConditionEliminator().apply(stage);