X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Fcompatibility.cpp;h=2e13a5f678eaa7592809fa292071b89cecf28beb;hb=c0be4e4ae1a8b6ac31ff6b7080e2242c13d947ff;hp=398a7bd30a76eaa4b141b400d9cd4e08d0e87958;hpb=1fa69bb8eec3070f5da296d6dd0bd67aea62d3bf;p=libs%2Fgl.git diff --git a/source/glsl/compatibility.cpp b/source/glsl/compatibility.cpp index 398a7bd3..2e13a5f6 100644 --- a/source/glsl/compatibility.cpp +++ b/source/glsl/compatibility.cpp @@ -1,10 +1,6 @@ #include #include -#include -#include -#include -#include -#include +#include #include "compatibility.h" using namespace std; @@ -14,25 +10,23 @@ namespace GL { namespace SL { DefaultPrecisionGenerator::DefaultPrecisionGenerator(): - stage_type(Stage::SHARED), - toplevel(true) + stage(0) { } -void DefaultPrecisionGenerator::apply(Stage &stage) +void DefaultPrecisionGenerator::apply(Stage &s) { - SetForScope set_stage(stage_type, stage.type); - visit(stage.content); + stage = &s; + visit(s.content); } void DefaultPrecisionGenerator::visit(Block &block) { - if(toplevel) + for(NodeList::iterator i=block.body.begin(); i!=block.body.end(); ++i) { - SetForScope set(toplevel, false); - BlockModifier::visit(block); + if(&block==&stage->content) + insert_point = i; + (*i)->visit(*this); } - else - TraversingVisitor::visit(block); } void DefaultPrecisionGenerator::visit(Precision &prec) @@ -56,21 +50,27 @@ void DefaultPrecisionGenerator::visit(VariableDeclaration &var) Precision *prec = new Precision; if(!type.compare(0, 7, "sampler")) prec->precision = "lowp"; - else if(stage_type==Stage::FRAGMENT) + else if(stage->type==Stage::FRAGMENT) prec->precision = "mediump"; else prec->precision = "highp"; prec->type = type; - insert_nodes.push_back(prec); + stage->content.body.insert(insert_point, prec); have_default.insert(type); } } -void PrecisionRemover::visit(Precision &) +void PrecisionRemover::apply(Stage &stage) +{ + visit(stage.content); + NodeRemover().apply(stage, nodes_to_remove); +} + +void PrecisionRemover::visit(Precision &prec) { - remove_node = true; + nodes_to_remove.insert(&prec); } void PrecisionRemover::visit(VariableDeclaration &var) @@ -80,48 +80,49 @@ void PrecisionRemover::visit(VariableDeclaration &var) LegacyConverter::LegacyConverter(): - target_api(get_gl_api()), - target_version(get_glsl_version()), frag_out(0) { } -LegacyConverter::LegacyConverter(const Version &v): - target_api(get_gl_api()), - target_version(v), - frag_out(0) -{ } +void LegacyConverter::apply(Stage &s, const Features &feat) +{ + stage = &s; + features = feat; + visit(s.content); +} + +void LegacyConverter::visit(Block &block) +{ + for(NodeList::iterator i=block.body.begin(); i!=block.body.end(); ++i) + { + if(&block==&stage->content) + uniform_insert_point = i; + (*i)->visit(*this); + } +} bool LegacyConverter::check_version(const Version &feature_version) const { - if(target_versionrequired_versionrequired_version = feature_version; + else if(stage->required_features.glsl_versionrequired_features.glsl_version = feature_version; return true; } -bool LegacyConverter::check_extension(const Extension &extension) const +bool LegacyConverter::check_extension(bool Features::*extension) const { - if(!extension) + if(!(features.*extension)) return false; - vector::iterator i = find(stage->required_extensions, &extension); - if(i==stage->required_extensions.end()) - stage->required_extensions.push_back(&extension); + stage->required_features.*extension = true; return true; } -void LegacyConverter::apply(Stage &s) -{ - SetForScope set_stage(stage, &s); - visit(s.content); -} - bool LegacyConverter::supports_unified_interface_syntax() const { - if(target_api==OPENGL_ES2) + if(features.gl_api==OPENGL_ES2) return check_version(Version(3, 0)); else return check_version(Version(1, 30)); @@ -150,7 +151,7 @@ void LegacyConverter::visit(Assignment &assign) bool LegacyConverter::supports_unified_sampling_functions() const { - if(target_api==OPENGL_ES2) + if(features.gl_api==OPENGL_ES2) return check_version(Version(3, 0)); else return check_version(Version(1, 30)); @@ -188,22 +189,22 @@ void LegacyConverter::visit(FunctionCall &call) call.name = "shadow2D"; else if(sampler_type=="sampler1DArray") { - check_extension(EXT_texture_array); + check_extension(&Features::ext_texture_array); call.name = "texture1DArray"; } else if(sampler_type=="sampler2DArray") { - check_extension(EXT_texture_array); + check_extension(&Features::ext_texture_array); call.name = "texture2DArray"; } else if(sampler_type=="sampler1DArrayShadow") { - check_extension(EXT_texture_array); + check_extension(&Features::ext_texture_array); call.name = "shadow1DArray"; } else if(sampler_type=="sampler2DArrayShadow") { - check_extension(EXT_texture_array); + check_extension(&Features::ext_texture_array); call.name = "shadow2DArray"; } } @@ -214,32 +215,32 @@ void LegacyConverter::visit(FunctionCall &call) bool LegacyConverter::supports_interface_layouts() const { - if(target_api==OPENGL_ES2) + if(features.gl_api==OPENGL_ES2) return check_version(Version(3, 0)); else if(check_version(Version(3, 30))) return true; else - return check_extension(ARB_explicit_attrib_location); + return check_extension(&Features::arb_explicit_attrib_location); } bool LegacyConverter::supports_centroid_sampling() const { - if(target_api==OPENGL_ES2) + if(features.gl_api==OPENGL_ES2) return check_version(Version(3, 0)); else if(check_version(Version(1, 20))) return true; else - return check_extension(EXT_gpu_shader4); + return check_extension(&Features::ext_gpu_shader4); } bool LegacyConverter::supports_sample_sampling() const { - if(target_api==OPENGL_ES2) + if(features.gl_api==OPENGL_ES2) return check_version(Version(3, 20)); else if(check_version(Version(4, 0))) return true; else - return check_extension(ARB_gpu_shader5); + return check_extension(&Features::arb_gpu_shader5); } void LegacyConverter::visit(VariableDeclaration &var) @@ -259,7 +260,7 @@ void LegacyConverter::visit(VariableDeclaration &var) else if(stage->type==Stage::FRAGMENT && var.interface=="out") { if(location!=0) - static Require _req(EXT_gpu_shader4); + check_extension(&Features::ext_gpu_shader4); stage->locations[var.name] = location; var.layout->qualifiers.erase(i); } @@ -285,7 +286,7 @@ void LegacyConverter::visit(VariableDeclaration &var) if(stage->type==Stage::FRAGMENT && var.interface=="out") { frag_out = &var; - remove_node = true; + nodes_to_remove.insert(&var); } } @@ -294,7 +295,7 @@ void LegacyConverter::visit(VariableDeclaration &var) bool LegacyConverter::supports_interface_blocks(const string &iface) const { - if(target_api==OPENGL_ES2) + if(features.gl_api==OPENGL_ES2) { if(iface=="uniform") return check_version(Version(3, 0)); @@ -304,7 +305,7 @@ bool LegacyConverter::supports_interface_blocks(const string &iface) const else if(check_version(Version(1, 50))) return true; else if(iface=="uniform") - return check_extension(ARB_uniform_buffer_object); + return check_extension(&Features::arb_uniform_buffer_object); else return false; } @@ -312,7 +313,10 @@ bool LegacyConverter::supports_interface_blocks(const string &iface) const void LegacyConverter::visit(InterfaceBlock &iface) { if(!supports_interface_blocks(iface.interface)) - flatten_block(iface.members); + { + stage->content.body.splice(uniform_insert_point, iface.members.body); + nodes_to_remove.insert(&iface); + } } } // namespace SL