#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
{
for(list<Stage>::iterator i=module->stages.begin(); i!=module->stages.end(); ++i)
generate(*i, mode);
+
+ bool valid = true;
+ for(list<Stage>::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<Stage>::iterator i=module->stages.begin(); (i!=module->stages.end() && n<10000); ++n)
{
throw key_error(Stage::get_stage_name(stage_type));
}
+string Compiler::get_diagnostics() const
+{
+ string combined;
+ for(list<Stage>::const_iterator i=module->stages.begin(); i!=module->stages.end(); ++i)
+ for(vector<Diagnostic>::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);
LegacyConverter().apply(stage, features);
}
+bool Compiler::validate(Stage &stage)
+{
+ DeclarationValidator().apply(stage);
+
+ for(vector<Diagnostic>::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);