X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Fcompatibility.cpp;h=a9f38a35cda42481935864b5bbd97285bbf63462;hb=ab5f2e6f1ddd35f8f117460530d76c0ba0c9bc87;hp=4e43ae9dcdd3b4241afe1d7c5c945db368834a49;hpb=7a16308e72aef363727b21348779673edf8e5c07;p=libs%2Fgl.git diff --git a/source/glsl/compatibility.cpp b/source/glsl/compatibility.cpp index 4e43ae9d..a9f38a35 100644 --- a/source/glsl/compatibility.cpp +++ b/source/glsl/compatibility.cpp @@ -14,18 +14,23 @@ namespace GL { namespace SL { DefaultPrecisionGenerator::DefaultPrecisionGenerator(): - toplevel(true) + stage(0) { } +void DefaultPrecisionGenerator::apply(Stage &s) +{ + 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 - StageVisitor::visit(block); } void DefaultPrecisionGenerator::visit(Precision &prec) @@ -54,16 +59,22 @@ void DefaultPrecisionGenerator::visit(VariableDeclaration &var) 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) { - remove_node = true; + visit(stage.content); + NodeRemover().apply(stage, nodes_to_remove); +} + +void PrecisionRemover::visit(Precision &prec) +{ + nodes_to_remove.insert(&prec); } void PrecisionRemover::visit(VariableDeclaration &var) @@ -78,11 +89,21 @@ LegacyConverter::LegacyConverter(): frag_out(0) { } -LegacyConverter::LegacyConverter(const Version &v): - target_api(get_gl_api()), - target_version(v), - frag_out(0) -{ } +void LegacyConverter::apply(Stage &s) +{ + stage = &s; + 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 { @@ -145,47 +166,54 @@ bool LegacyConverter::supports_unified_sampling_functions() const void LegacyConverter::visit(FunctionCall &call) { - if(call.name=="texture" && !call.declaration && !supports_unified_sampling_functions()) + if(call.name=="texture") { + string sampler_type; + type = string(); NodeArray::iterator i = call.arguments.begin(); if(i!=call.arguments.end()) { (*i)->visit(*this); - if(type=="sampler1D") + sampler_type = type; + + for(; i!=call.arguments.end(); ++i) + (*i)->visit(*this); + } + + if(!supports_unified_sampling_functions()) + { + if(sampler_type=="sampler1D") call.name = "texture1D"; - else if(type=="sampler2D") + else if(sampler_type=="sampler2D") call.name = "texture2D"; - else if(type=="sampler3D") + else if(sampler_type=="sampler3D") call.name = "texture3D"; - else if(type=="samplerCube") + else if(sampler_type=="samplerCube") call.name = "textureCube"; - else if(type=="sampler1DShadow") + else if(sampler_type=="sampler1DShadow") call.name = "shadow1D"; - else if(type=="sampler2DShadow") + else if(sampler_type=="sampler2DShadow") call.name = "shadow2D"; - else if(type=="sampler1DArray") + else if(sampler_type=="sampler1DArray") { check_extension(EXT_texture_array); call.name = "texture1DArray"; } - else if(type=="sampler2DArray") + else if(sampler_type=="sampler2DArray") { check_extension(EXT_texture_array); call.name = "texture2DArray"; } - else if(type=="sampler1DArrayShadow") + else if(sampler_type=="sampler1DArrayShadow") { check_extension(EXT_texture_array); call.name = "shadow1DArray"; } - else if(type=="sampler2DArrayShadow") + else if(sampler_type=="sampler2DArrayShadow") { check_extension(EXT_texture_array); call.name = "shadow2DArray"; } - - for(; i!=call.arguments.end(); ++i) - (*i)->visit(*this); } } else @@ -265,7 +293,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); } } @@ -292,7 +320,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