#include <msp/core/raii.h>
+#include <msp/gl/extensions/ext_gpu_shader4.h>
#include <msp/strings/format.h>
#include <msp/strings/utils.h>
#include "error.h"
module(0)
{ }
-void ProgramCompiler::compile(const string &source)
+void ProgramCompiler::compile(const string &source, const string &src_name)
{
resources = 0;
- module = &parser.parse(source);
+ module = &parser.parse(source, src_name);
process();
}
-void ProgramCompiler::compile(IO::Base &io, Resources *res)
+void ProgramCompiler::compile(IO::Base &io, Resources *res, const string &src_name)
{
resources = res;
- module = &parser.parse(io);
+ module = &parser.parse(io, src_name);
process();
}
+void ProgramCompiler::compile(IO::Base &io, const string &src_name)
+{
+ compile(io, 0, src_name);
+}
+
void ProgramCompiler::add_shaders(Program &program)
{
if(!module)
else if(i->type==FRAGMENT)
{
program.attach_shader_owned(new FragmentShader(apply<Formatter>(*i)));
- for(map<string, unsigned>::iterator j=i->locations.begin(); j!=i->locations.end(); ++j)
- program.bind_fragment_data(j->second, j->first);
+ 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);
+ }
}
}
}
Module *ProgramCompiler::create_builtins_module()
{
ProgramParser parser;
- Module *module = new Module(parser.parse(builtins_src));
+ Module *module = new Module(parser.parse(builtins_src, "<builtin>"));
for(list<Stage>::iterator i=module->stages.begin(); i!=module->stages.end(); ++i)
{
VariableResolver resolver;
if(!io)
throw runtime_error(format("module %s not found", name));
ProgramParser import_parser;
- Module &imported_module = import_parser.parse(*io);
+ Module &imported_module = import_parser.parse(*io, fn);
inject_block(module->shared.content, imported_module.shared.content);
apply<DeclarationCombiner>(module->shared);
}
+ProgramCompiler::BlockModifier::BlockModifier():
+ remove_node(false)
+{ }
+
+void ProgramCompiler::BlockModifier::flatten_block(Block &block)
+{
+ insert_nodes.insert(insert_nodes.end(), block.body.begin(), block.body.end());
+ remove_node = true;
+}
+
+void ProgramCompiler::BlockModifier::apply_and_increment(Block &block, list<RefPtr<Node> >::iterator &i)
+{
+ block.body.insert(i, insert_nodes.begin(), insert_nodes.end());
+ insert_nodes.clear();
+
+ if(remove_node)
+ block.body.erase(i++);
+ else
+ ++i;
+ remove_node = false;
+}
+
+void ProgramCompiler::BlockModifier::visit(Block &block)
+{
+ for(list<RefPtr<Node> >::iterator i=block.body.begin(); i!=block.body.end(); )
+ {
+ (*i)->visit(*this);
+ apply_and_increment(block, i);
+ }
+}
+
+
ProgramCompiler::Formatter::Formatter():
indent(0),
parameter_list(false),
ProgramCompiler::DeclarationCombiner::DeclarationCombiner():
- toplevel(true),
- remove_node(false)
+ toplevel(true)
{ }
void ProgramCompiler::DeclarationCombiner::visit(Block &block)
return;
SetForScope<bool> set(toplevel, false);
- for(list<RefPtr<Node> >::iterator i=block.body.begin(); i!=block.body.end(); )
- {
- remove_node = false;
- (*i)->visit(*this);
- if(remove_node)
- block.body.erase(i++);
- else
- ++i;
- }
+ BlockModifier::visit(block);
}
void ProgramCompiler::DeclarationCombiner::visit(FunctionDeclaration &func)
}
-ProgramCompiler::BlockModifier::BlockModifier():
- remove_node(false)
-{ }
-
-void ProgramCompiler::BlockModifier::flatten_block(Block &block)
-{
- insert_nodes.insert(insert_nodes.end(), block.body.begin(), block.body.end());
- remove_node = true;
-}
-
-void ProgramCompiler::BlockModifier::apply_and_increment(Block &block, list<RefPtr<Node> >::iterator &i)
-{
- block.body.insert(i, insert_nodes.begin(), insert_nodes.end());
- insert_nodes.clear();
-
- if(remove_node)
- block.body.erase(i++);
- else
- ++i;
- remove_node = false;
-}
-
-void ProgramCompiler::BlockModifier::visit(Block &block)
-{
- for(list<RefPtr<Node> >::iterator i=block.body.begin(); i!=block.body.end(); )
- {
- (*i)->visit(*this);
- apply_and_increment(block, i);
- }
-}
-
-
ProgramCompiler::InterfaceGenerator::InterfaceGenerator():
scope_level(0)
{ }
}
else if(stage->type==FRAGMENT && var.interface=="out")
{
+ if(location!=0)
+ static Require _req(EXT_gpu_shader4);
stage->locations[var.name] = location;
var.layout->qualifiers.erase(i);
}