X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Fcompatibility.cpp;h=128902f3b9f473bb9df87559d40a231c139ac55e;hb=30465dd3b9f55ec42c4b19c3c2077eede7237a26;hp=3407386248210035c8a6dee75fee815a9987696f;hpb=836eeb313874d4f0c406f154ecb0dff366f362c4;p=libs%2Fgl.git diff --git a/source/glsl/compatibility.cpp b/source/glsl/compatibility.cpp index 34073862..128902f3 100644 --- a/source/glsl/compatibility.cpp +++ b/source/glsl/compatibility.cpp @@ -17,7 +17,7 @@ DefaultPrecisionGenerator::DefaultPrecisionGenerator(): void DefaultPrecisionGenerator::apply(Stage &s) { stage = &s; - visit(s.content); + s.content.visit(*this); } void DefaultPrecisionGenerator::visit(Block &block) @@ -65,7 +65,7 @@ void DefaultPrecisionGenerator::visit(VariableDeclaration &var) void PrecisionRemover::apply(Stage &stage) { - visit(stage.content); + stage.content.visit(*this); NodeRemover().apply(stage, nodes_to_remove); } @@ -88,7 +88,9 @@ void LegacyConverter::apply(Stage &s, const Features &feat) { stage = &s; features = feat; - visit(s.content); + if(!supports_stage(s.type)) + throw unsupported_shader(format("Stage %s is not supported", Stage::get_stage_name(s.type))); + s.content.visit(*this); } void LegacyConverter::visit(Block &block) @@ -121,6 +123,19 @@ bool LegacyConverter::check_extension(bool Features::*extension) const return true; } +bool LegacyConverter::supports_stage(Stage::Type st) const +{ + if(st==Stage::GEOMETRY) + { + if(features.gl_api==OPENGL_ES2) + return check_version(Version(3, 20)); + else + return check_version(Version(1, 50)); + } + else + return true; +} + bool LegacyConverter::supports_unified_interface_syntax() const { if(features.gl_api==OPENGL_ES2) @@ -249,20 +264,19 @@ void LegacyConverter::visit(VariableDeclaration &var) if(var.layout && !supports_interface_layouts()) { vector::iterator i; - for(i=var.layout->qualifiers.begin(); (i!=var.layout->qualifiers.end() && i->identifier!="location"); ++i) ; + for(i=var.layout->qualifiers.begin(); (i!=var.layout->qualifiers.end() && i->name!="location"); ++i) ; if(i!=var.layout->qualifiers.end()) { - unsigned location = lexical_cast(i->value); if(stage->type==Stage::VERTEX && var.interface=="in") { - stage->locations[var.name] = location; + stage->locations[var.name] = i->value; var.layout->qualifiers.erase(i); } else if(stage->type==Stage::FRAGMENT && var.interface=="out") { - if(location!=0 && !check_extension(&Features::ext_gpu_shader4)) + if(i->value!=0 && !check_extension(&Features::ext_gpu_shader4)) throw unsupported_shader("EXT_gpu_shader4 is required"); - stage->locations[var.name] = location; + stage->locations[var.name] = i->value; var.layout->qualifiers.erase(i); }