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)
{ }
}
for(list<Stage>::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();
for(list<Stage>::iterator i=module->stages.begin(); i!=module->stages.end(); ++i)
{
glsl += format("#pragma MSP stage(%s)\n", Stage::get_stage_name(i->type));
- glsl += Formatter().apply(*i, MODULE);
+ glsl += Formatter().apply(*i);
glsl += '\n';
}
string Compiler::get_stage_glsl(Stage::Type stage_type) const
{
+ if(!compiled)
+ throw invalid_operation("Compiler::get_stage_glsl");
for(list<Stage>::iterator i=module->stages.begin(); i!=module->stages.end(); ++i)
if(i->type==stage_type)
- return Formatter().apply(*i, PROGRAM);
+ return Formatter().apply(*i);
throw key_error(Stage::get_stage_name(stage_type));
}
const map<string, unsigned> &Compiler::get_vertex_attributes() const
{
+ if(!compiled)
+ throw invalid_operation("Compiler::get_vertex_attributes");
for(list<Stage>::const_iterator i=module->stages.begin(); i!=module->stages.end(); ++i)
if(i->type==Stage::VERTEX)
return i->locations;
const map<string, unsigned> &Compiler::get_fragment_outputs() const
{
+ if(!compiled)
+ throw invalid_operation("Compiler::get_fragment_outputs");
for(list<Stage>::const_iterator i=module->stages.begin(); i!=module->stages.end(); ++i)
if(i->type==Stage::FRAGMENT)
return i->locations;
target->required_features.glsl_version = stage.required_features.glsl_version;
for(NodeList<Statement>::iterator i=stage.content.body.begin(); i!=stage.content.body.end(); ++i)
target->content.body.push_back(*i);
- DeclarationCombiner().apply(*target);
}
void Compiler::import(DataFile::Collection *resources, const string &name)
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<typename T>
else if(resolve<FunctionResolver>(stage, flags, RESOLVE_FUNCTIONS))
flags |= RESOLVE_EXPRESSIONS;
else if(resolve<ExpressionResolver>(stage, flags, RESOLVE_EXPRESSIONS))
- flags |= RESOLVE_VARIABLES;
+ flags |= RESOLVE_VARIABLES|RESOLVE_FUNCTIONS;
}
}
bool Compiler::validate(Stage &stage)
{
- TypeValidator().apply(stage);
DeclarationValidator().apply(stage);
+ IdentifierValidator().apply(stage);
ReferenceValidator().apply(stage);
ExpressionValidator().apply(stage);
Compiler::OptimizeResult Compiler::optimize(Stage &stage)
{
+ if(ConstantFolder().apply(stage))
+ resolve(stage, RESOLVE_EXPRESSIONS);
ConstantConditionEliminator().apply(stage);
bool any_inlined = false;
void Compiler::finalize(Stage &stage, Mode mode)
{
+ if(mode==PROGRAM)
+ {
+ LegacyConverter().apply(stage, features);
+ resolve(stage, RESOLVE_VARIABLES|RESOLVE_FUNCTIONS);
+ }
+
if(get_gl_api()==OPENGL_ES2 && mode==PROGRAM)
DefaultPrecisionGenerator().apply(stage);
else if(mode==MODULE)