From: Mikko Rasa Date: Sun, 16 Oct 2016 11:30:51 +0000 (+0300) Subject: Add a geometry flag to ProgramBuilder X-Git-Url: http://git.tdb.fi/?a=commitdiff_plain;h=f9d27a44f11dcb2980ea7c65d410e9002098487f;p=libs%2Fgl.git Add a geometry flag to ProgramBuilder It does not generate a geometry shader yet but allows one to be manually inserted into the program. --- diff --git a/source/programbuilder.cpp b/source/programbuilder.cpp index 829691b6..affc4cc3 100644 --- a/source/programbuilder.cpp +++ b/source/programbuilder.cpp @@ -162,11 +162,12 @@ const ProgramBuilder::VariableDefinition ProgramBuilder::standard_variables[] = { NO_SCOPE, 0, 0, 0, 0 } }; -const char ProgramBuilder::interfaces[] = { 0, 0, 0, 0, 0, 'v', 0 }; +const char ProgramBuilder::interfaces[] = { 0, 0, 0, 0, 0, 'v', 'g', 0 }; ProgramBuilder::ProgramBuilder(const StandardFeatures &f): features(f), feature_flags(features.create_flags()), + enabled_scopes((1< &variables, Va if(iface&INPUT) { const char *qualifier = (features.legacy ? scope==VERTEX ? "attribute" : "varying" : "in"); - source += format("%s %s;\n", qualifier, (*i)->create_declaration(interfaces[scope-1])); + source += format("%s %s;\n", qualifier, (*i)->create_declaration(interfaces[previous_scope(scope, enabled_scopes)])); } if(iface&OUTPUT) @@ -743,9 +747,21 @@ string ProgramBuilder::replace_identifiers(const char *expression, const map(scope-1); + if(enabled_scopes&(1<=Version(3, 0)); @@ -1075,18 +1092,19 @@ string ProgramBuilder::ShaderVariable::create_declaration(char iface, bool loop) return format("%s %s%s", variable->type, resolved_name, array); } -string ProgramBuilder::ShaderVariable::create_replacement(VariableScope from_scope, const char *loop) const +string ProgramBuilder::ShaderVariable::create_replacement(VariableScope from_scope, unsigned enabled_scopes, const char *loop) const { string replacement = resolved_name; InterfaceFlags iface = NO_INTERFACE; if(variable) { iface = get_interface_flags(from_scope); - if((iface&INPUT) && interfaces[from_scope-1]) - replacement = format("%c_%s", interfaces[from_scope-1], replacement); + VariableScope prev_scope = previous_scope(from_scope, enabled_scopes); + if((iface&INPUT) && interfaces[prev_scope]) + replacement = format("%c_%s", interfaces[prev_scope], replacement); else if(inlined) { - replacement = create_expression(loop); + replacement = create_expression(enabled_scopes, loop); if(inline_parens) replacement = "("+replacement+")"; return replacement; @@ -1105,12 +1123,12 @@ string ProgramBuilder::ShaderVariable::create_replacement(VariableScope from_sco return replacement; } -string ProgramBuilder::ShaderVariable::create_expression(const char *loop) const +string ProgramBuilder::ShaderVariable::create_expression(unsigned enabled_scopes, const char *loop) const { map replace_map; for(list::const_iterator i=referenced_vars.begin(); i!=referenced_vars.end(); ++i) { - string replacement = (*i)->create_replacement(variable->scope, loop); + string replacement = (*i)->create_replacement(variable->scope, enabled_scopes, loop); if(replacement!=(*i)->name) replace_map[(*i)->name] = replacement; } @@ -1128,6 +1146,7 @@ ProgramBuilder::StandardFeatures::Loader::Loader(StandardFeatures &f): add("clipping", &StandardFeatures::clipping); add("custom", &StandardFeatures::custom); add("fog", &StandardFeatures::fog); + add("geometry", &StandardFeatures::geometry); add("lighting", &StandardFeatures::lighting); add("material", &StandardFeatures::material); add("max_clip_planes", &StandardFeatures::max_clip_planes); diff --git a/source/programbuilder.h b/source/programbuilder.h index f2046e45..053eb567 100644 --- a/source/programbuilder.h +++ b/source/programbuilder.h @@ -104,6 +104,9 @@ public: /** Number of clipping planes to process. */ unsigned max_clip_planes; + /** Use a geometry shader. */ + bool geometry; + /** Force the use of legacy shaders conforming to GLSL 1.10. Defaults to true if the version of GLSL is less than 1.30, false otherwise. */ bool legacy; @@ -125,7 +128,9 @@ private: UNIFORM, ATTRIBUTE, VERTEX, - FRAGMENT + GEOMETRY, + FRAGMENT, + N_SCOPES }; enum InterfaceFlags @@ -177,8 +182,8 @@ private: InterfaceFlags get_interface_flags(VariableScope) const; std::string create_type_declaration() const; std::string create_declaration(char = 0, bool = false) const; - std::string create_replacement(VariableScope, const char * = 0) const; - std::string create_expression(const char * = 0) const; + std::string create_replacement(VariableScope, unsigned, const char * = 0) const; + std::string create_expression(unsigned, const char * = 0) const; }; enum MatchType @@ -192,6 +197,7 @@ private: StandardFeatures features; std::list custom_variables; std::string feature_flags; + unsigned enabled_scopes; std::map aliases; bool optimize; @@ -218,6 +224,7 @@ private: static bool parse_identifier(const char *, unsigned &, unsigned &); static std::vector extract_identifiers(const char *); static std::string replace_identifiers(const char *, const std::map &, bool = false); + static VariableScope previous_scope(VariableScope, unsigned); std::string create_expression(const ShaderVariable &, const char * = 0) const; };