load_source(io, 0, src_name);
}
-void Compiler::compile()
+void Compiler::compile(Mode mode)
{
for(list<Stage>::iterator i=module->stages.begin(); i!=module->stages.end(); ++i)
- generate(*i);
+ generate(*i, mode);
for(list<Stage>::iterator i=module->stages.begin(); i!=module->stages.end(); )
{
if(optimize(*i))
++i;
}
for(list<Stage>::iterator i=module->stages.begin(); i!=module->stages.end(); ++i)
- finalize(*i);
+ finalize(*i, mode);
}
-void Compiler::add_shaders(Program &program)
+string Compiler::get_combined_glsl() const
{
- if(!module)
- throw invalid_operation("Compiler::add_shaders");
+ string glsl;
- try
- {
- for(list<Stage>::iterator i=module->stages.begin(); i!=module->stages.end(); ++i)
- {
- string stage_src = Formatter().apply(*i);
-
- if(i->type==Stage::VERTEX)
- {
- program.attach_shader_owned(new VertexShader(stage_src));
- for(map<string, unsigned>::iterator j=i->locations.begin(); j!=i->locations.end(); ++j)
- program.bind_attribute(j->second, j->first);
- }
- else if(i->type==Stage::GEOMETRY)
- program.attach_shader_owned(new GeometryShader(stage_src));
- else if(i->type==Stage::FRAGMENT)
- {
- program.attach_shader_owned(new FragmentShader(stage_src));
- if(EXT_gpu_shader4)
- {
- for(map<string, unsigned>::iterator j=i->locations.begin(); j!=i->locations.end(); ++j)
- program.bind_fragment_data(j->second, j->first);
- }
- }
- }
- }
- catch(const compile_error &e)
+ unsigned source_count = module->source_map.get_count();
+ for(unsigned i=1; i<source_count; ++i)
+ glsl += format("#pragma MSP source(%d, \"%s\")\n", i, module->source_map.get_name(i));
+ for(list<Stage>::iterator i=module->stages.begin(); i!=module->stages.end(); ++i)
{
- throw compile_error(module->source_map.translate_errors(e.what()));
+ glsl += format("#pragma MSP stage(%s)\n", Stage::get_stage_name(i->type));
+ glsl += Formatter().apply(*i, MODULE);
+ glsl += '\n';
}
+
+ return glsl;
+}
+
+vector<Stage::Type> Compiler::get_stages() const
+{
+ vector<Stage::Type> stage_types;
+ stage_types.reserve(module->stages.size());
+ for(list<Stage>::const_iterator i=module->stages.begin(); i!=module->stages.end(); ++i)
+ stage_types.push_back(i->type);
+ return stage_types;
+}
+
+string Compiler::get_stage_glsl(Stage::Type stage_type) const
+{
+ for(list<Stage>::iterator i=module->stages.begin(); i!=module->stages.end(); ++i)
+ if(i->type==stage_type)
+ return Formatter().apply(*i, PROGRAM);
+ throw key_error(Stage::get_stage_name(stage_type));
+}
+
+const map<string, unsigned> &Compiler::get_vertex_attributes() const
+{
+ for(list<Stage>::const_iterator i=module->stages.begin(); i!=module->stages.end(); ++i)
+ if(i->type==Stage::VERTEX)
+ return i->locations;
+ throw invalid_operation("Compiler::get_vertex_attributes");
+}
+
+const map<string, unsigned> &Compiler::get_fragment_outputs() const
+{
+ for(list<Stage>::const_iterator i=module->stages.begin(); i!=module->stages.end(); ++i)
+ if(i->type==Stage::FRAGMENT)
+ return i->locations;
+ throw invalid_operation("Compiler::get_fragment_outputs");
+}
+
+const SourceMap &Compiler::get_source_map() const
+{
+ return module->source_map;
}
void Compiler::append_module(Module &mod, DataFile::Collection *res)
append_module(import_parser.parse(*io, fn, module->source_map.get_count()), resources);
}
-void Compiler::generate(Stage &stage)
+void Compiler::generate(Stage &stage, Mode mode)
{
if(module->shared.required_version>stage.required_version)
stage.required_version = module->shared.required_version;
VariableResolver().apply(stage);
DeclarationReorderer().apply(stage);
FunctionResolver().apply(stage);
- LegacyConverter().apply(stage);
+ if(mode==PROGRAM)
+ LegacyConverter().apply(stage);
}
bool Compiler::optimize(Stage &stage)
return result;
}
-void Compiler::finalize(Stage &stage)
+void Compiler::finalize(Stage &stage, Mode mode)
{
- if(get_gl_api()==OPENGL_ES2)
+ if(get_gl_api()==OPENGL_ES2 && mode==PROGRAM)
DefaultPrecisionGenerator().apply(stage);
- else
+ else if(mode==MODULE)
PrecisionRemover().apply(stage);
}