X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;ds=inline;f=source%2Fglsl%2Fcompatibility.cpp;h=398a7bd30a76eaa4b141b400d9cd4e08d0e87958;hb=47d9d5d10469340af44909de9c8ab9fd4f1a19a1;hp=4e43ae9dcdd3b4241afe1d7c5c945db368834a49;hpb=7a16308e72aef363727b21348779673edf8e5c07;p=libs%2Fgl.git diff --git a/source/glsl/compatibility.cpp b/source/glsl/compatibility.cpp index 4e43ae9d..398a7bd3 100644 --- a/source/glsl/compatibility.cpp +++ b/source/glsl/compatibility.cpp @@ -14,9 +14,16 @@ namespace GL { namespace SL { DefaultPrecisionGenerator::DefaultPrecisionGenerator(): + stage_type(Stage::SHARED), toplevel(true) { } +void DefaultPrecisionGenerator::apply(Stage &stage) +{ + SetForScope set_stage(stage_type, stage.type); + visit(stage.content); +} + void DefaultPrecisionGenerator::visit(Block &block) { if(toplevel) @@ -25,7 +32,7 @@ void DefaultPrecisionGenerator::visit(Block &block) BlockModifier::visit(block); } else - StageVisitor::visit(block); + TraversingVisitor::visit(block); } void DefaultPrecisionGenerator::visit(Precision &prec) @@ -49,7 +56,7 @@ 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"; @@ -106,6 +113,12 @@ bool LegacyConverter::check_extension(const Extension &extension) const 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) @@ -145,47 +158,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