X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Ffinalize.cpp;h=030cb432a4a0c835b2485773ffa8b92fb36b705d;hb=9c1035c136c7c78f0cbf0205ec48befc49219de7;hp=532e2ffcbb3914fd2d7e81dafab0f784e0b52daf;hpb=6ff7aea73057e4a650d8b0ac659d9bba05ba02e2;p=libs%2Fgl.git diff --git a/source/glsl/finalize.cpp b/source/glsl/finalize.cpp index 532e2ffc..030cb432 100644 --- a/source/glsl/finalize.cpp +++ b/source/glsl/finalize.cpp @@ -91,6 +91,7 @@ void LegacyConverter::apply(Stage &s, const Features &feat) if(supports_stage(s.type)) { s.content.visit(*this); + NodeRemover().apply(s, nodes_to_remove); if(!stage->required_features.glsl_version) stage->required_features.glsl_version = Version(1, (stage->required_features.gl_api==OPENGL_ES2 ? 0 : 10)); @@ -227,8 +228,10 @@ bool LegacyConverter::supports_interface_layouts() const return check_version(Version(3, 0)); else if(check_version(Version(3, 30))) return true; - else + else if(check_version(Version(1, 30))) return check_extension(&Features::arb_explicit_attrib_location); + else + return false; } bool LegacyConverter::supports_centroid_sampling() const @@ -253,29 +256,30 @@ bool LegacyConverter::supports_sample_sampling() const void LegacyConverter::visit(VariableDeclaration &var) { - if(var.layout && !supports_interface_layouts()) + if(var.layout) { - vector::iterator i; - for(i=var.layout->qualifiers.begin(); (i!=var.layout->qualifiers.end() && i->name!="location"); ++i) ; - if(i!=var.layout->qualifiers.end()) + for(vector::const_iterator i=var.layout->qualifiers.begin(); i!=var.layout->qualifiers.end(); ) { - if(stage->type==Stage::VERTEX && var.interface=="in") - { - stage->locations[var.name] = i->value; - var.layout->qualifiers.erase(i); - } - else if(stage->type==Stage::FRAGMENT && var.interface=="out") + if(i->name=="location" && !supports_interface_layouts()) { - if(check_extension(&Features::ext_gpu_shader4)) + if(stage->type==Stage::VERTEX && var.interface=="in") stage->locations[var.name] = i->value; - else if(i->value!=0) - unsupported("EXT_gpu_shader4 required for multiple fragment shader outputs"); - var.layout->qualifiers.erase(i); - } + else if(stage->type==Stage::FRAGMENT && var.interface=="out") + { + if(check_extension(&Features::ext_gpu_shader4)) + stage->locations[var.name] = i->value; + else if(i->value!=0) + unsupported("EXT_gpu_shader4 required for multiple fragment shader outputs"); + } - if(var.layout->qualifiers.empty()) - var.layout = 0; + i = var.layout->qualifiers.erase(i); + } + else + ++i; } + + if(var.layout->qualifiers.empty()) + var.layout = 0; } if(var.sampling=="centroid")