class Module
{
-private:
- std::string prepared_source;
- SL::SourceMap source_map;
+public:
+ enum Format
+ {
+ GLSL,
+ };
+protected:
+ Module() { }
public:
- Module();
+ virtual ~Module() { }
+
+ virtual Format get_format() const = 0;
void set_source(const std::string &);
void load_source(IO::Base &, Resources *, const std::string &);
void load_source(IO::Base &, const std::string &);
private:
- void compile(SL::Compiler &);
+ virtual void compile(SL::Compiler &) = 0;
+};
+
+class GlslModule: public Module
+{
+private:
+ std::string prepared_source;
+ SL::SourceMap source_map;
+
+public:
+ virtual Format get_format() const { return GLSL; }
+
+private:
+ virtual void compile(SL::Compiler &);
public:
const std::string &get_prepared_source() const { return prepared_source; }
{
init();
- Module mod;
+ GlslModule mod;
mod.set_source(source);
add_stages(mod);
glDeleteProgram(id);
}
+void Program::add_stages(const Module &mod, const map<string, int> &spec_values)
+{
+ switch(mod.get_format())
+ {
+ case Module::GLSL: return add_glsl_stages(static_cast<const GlslModule &>(mod), spec_values);
+ default: throw invalid_argument("Program::add_stages");
+ }
+}
+
unsigned Program::add_stage(GLenum type)
{
switch(type)
return stage_id;
}
-void Program::add_stages(const Module &mod, const map<string, int> &spec_values)
+void Program::add_glsl_stages(const GlslModule &mod, const map<string, int> &spec_values)
{
module = &mod;
SL::Compiler compiler;
- compiler.set_source(module->get_prepared_source(), "<module>");
+ compiler.set_source(mod.get_prepared_source(), "<module>");
compiler.specialize(spec_values);
compiler.compile(SL::Compiler::PROGRAM);
#ifdef DEBUG
glBindFragDataLocation(id, j->second, j->first.c_str());
}
- compile_stage(stage_id);
+ compile_glsl_stage(stage_id);
}
}
-void Program::compile_stage(unsigned stage_id)
+void Program::compile_glsl_stage(unsigned stage_id)
{
glCompileShader(stage_id);
bool compiled = get_shader_i(stage_id, GL_COMPILE_STATUS);
string info_log(info_log_len+1, 0);
glGetShaderInfoLog(stage_id, info_log_len+1, &info_log_len, &info_log[0]);
info_log.erase(info_log_len);
- if(module)
- info_log = module->get_source_map().translate_errors(info_log);
+ if(module && module->get_format()==Module::GLSL)
+ info_log = static_cast<const GlslModule *>(module)->get_source_map().translate_errors(info_log);
if(!compiled)
throw compile_error(info_log);
if(!shader_id)
throw invalid_argument("Program::attach_shader");
stage_ids.push_back(shader_id);
- compile_stage(shader_id);
+ compile_glsl_stage(shader_id);
}
void Program::attach_shader_owned(Shader *shader)
string info_log(info_log_len+1, 0);
glGetProgramInfoLog(id, info_log_len+1, &info_log_len, &info_log[0]);
info_log.erase(info_log_len);
- info_log = module->get_source_map().translate_errors(info_log);
+ if(module && module->get_format()==Module::GLSL)
+ info_log = static_cast<const GlslModule *>(module)->get_source_map().translate_errors(info_log);
if(!linked)
throw compile_error(info_log);
namespace Msp {
namespace GL {
+class GlslModule;
class Module;
class Shader;
public:
virtual ~Program();
-private:
- unsigned add_stage(GLenum);
-public:
void add_stages(const Module &, const std::map<std::string, int> & = std::map<std::string, int>());
private:
- void compile_stage(unsigned);
+ unsigned add_stage(GLenum);
+ void add_glsl_stages(const GlslModule &, const std::map<std::string, int> &);
+ void compile_glsl_stage(unsigned);
public:
DEPRECATED void attach_shader(Shader &shader);
Module *Resources::create_module(const string &name)
{
+ string ext = FS::extpart(name);
+ if(ext!=".glsl")
+ return 0;
+
if(RefPtr<IO::Seekable> io = open_raw(name))
{
- RefPtr<Module> module = new Module;
- module->load_source(*io, this, name);
- return module.release();
+ if(ext==".glsl")
+ {
+ RefPtr<GlslModule> module = new GlslModule;
+ module->load_source(*io, this, name);
+ return module.release();
+ }
}
return 0;