X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Fbuiltin.cpp;h=217509a20b74c61e83091feda6dc856dd9a3cfcc;hb=08d3b5a55fad7439b47fc93d8ba604cbeb7e19ca;hp=670cfc2d9f4878b1d55abca1cf453adf8c628816;hpb=4c805f55d89919d6971d600102ab4d6d65d56dc3;p=libs%2Fgl.git diff --git a/source/glsl/builtin.cpp b/source/glsl/builtin.cpp index 670cfc2d..217509a2 100644 --- a/source/glsl/builtin.cpp +++ b/source/glsl/builtin.cpp @@ -1,7 +1,7 @@ +#include #include #include #include "builtin.h" -#include "generate.h" #include "parser.h" using namespace std; @@ -10,6 +10,18 @@ namespace Msp { namespace GL { namespace SL { +void add_builtin_type(Stage &stage, const string &name, BasicTypeDeclaration::Kind kind, unsigned size, unsigned sign) +{ + RefPtr type = new BasicTypeDeclaration; + type->source = BUILTIN_SOURCE; + type->name = name; + type->kind = kind; + type->size = size; + type->sign = sign; + stage.content.body.push_back(type); + stage.types[name] = type.get(); +} + Module *get_builtins_module() { static RefPtr builtins_module; @@ -22,42 +34,23 @@ Module *get_builtins_module() if(!io) return 0; - Parser parser; - Module *module = new Module(parser.parse(*io, "", BUILTIN_SOURCE)); - - NodeList &shared_body = module->shared.content.body; - - RefPtr type = new BasicTypeDeclaration; - type->source = BUILTIN_SOURCE; - type->name = "void"; - type->kind = BasicTypeDeclaration::VOID; - shared_body.insert(shared_body.begin(), type); - - type = new BasicTypeDeclaration; - type->source = BUILTIN_SOURCE; - type->name = "bool"; - type->kind = BasicTypeDeclaration::BOOL; - shared_body.insert(shared_body.begin(), type); - - type = new BasicTypeDeclaration; - type->source = BUILTIN_SOURCE; - type->name = "int"; - type->size = 32; - type->kind = BasicTypeDeclaration::INT; - shared_body.insert(shared_body.begin(), type); - - type = new BasicTypeDeclaration; - type->source = BUILTIN_SOURCE; - type->name = "float"; - type->size = 32; - type->kind = BasicTypeDeclaration::FLOAT; - shared_body.insert(shared_body.begin(), type); - - TypeResolver().apply(module->shared); - for(list::iterator i=module->stages.begin(); i!=module->stages.end(); ++i) - TypeResolver().apply(*i); + builtins_module = new Module; + add_builtin_type(builtins_module->shared, "void", BasicTypeDeclaration::VOID, 0, true); + add_builtin_type(builtins_module->shared, "bool", BasicTypeDeclaration::BOOL, 1, true); + add_builtin_type(builtins_module->shared, "int", BasicTypeDeclaration::INT, 32, true); + add_builtin_type(builtins_module->shared, "uint", BasicTypeDeclaration::INT, 32, false); + add_builtin_type(builtins_module->shared, "float", BasicTypeDeclaration::FLOAT, 32, true); - builtins_module = module; + try + { + Parser parser(0); + parser.parse(*builtins_module, *io, "", BUILTIN_SOURCE); + } + catch(...) + { + builtins_module = 0; + throw; + } } return builtins_module.get(); } @@ -70,10 +63,8 @@ const Stage *get_builtins(Stage::Type type) if(type==Stage::SHARED) return &module->shared; - for(list::iterator i=module->stages.begin(); i!=module->stages.end(); ++i) - if(i->type==type) - return &*i; - return 0; + auto i = find_member(module->stages, type, &Stage::type); + return (i!=module->stages.end() ? &*i : 0); } } // namespace SL