From 66a756a9581d3182557167074cd0158c5f8f414b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Thu, 19 Sep 2013 13:35:52 +0200 Subject: [PATCH] Shaders: extension queries depending on GLSL version in MeshVisualizer. The geometry shader implementation somehow expects GLSL 1.50 and is not working on GLSL 1.40 (probably inconsistent variable naming in extension and core specification). Added checks for that. Might fix this properly someday when there is need for geometry shader in GL 3.1. --- src/Shaders/MeshVisualizer.cpp | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/Shaders/MeshVisualizer.cpp b/src/Shaders/MeshVisualizer.cpp index 0ad479de6..2baeef4a8 100644 --- a/src/Shaders/MeshVisualizer.cpp +++ b/src/Shaders/MeshVisualizer.cpp @@ -34,8 +34,10 @@ namespace Magnum { namespace Shaders { MeshVisualizer::MeshVisualizer(const Flags flags): flags(flags), transformationProjectionMatrixUniform(0), viewportSizeUniform(1), colorUniform(2), wireframeColorUniform(3), wireframeWidthUniform(4), smoothnessUniform(5) { #ifndef MAGNUM_TARGET_GLES - if(flags & Flag::Wireframe && !(flags & Flag::NoGeometryShader)) + if(flags & Flag::Wireframe && !(flags & Flag::NoGeometryShader)) { + MAGNUM_ASSERT_VERSION_SUPPORTED(Version::GL320); MAGNUM_ASSERT_EXTENSION_SUPPORTED(Extensions::GL::ARB::geometry_shader4); + } #elif defined(MAGNUM_TARGET_GLES2) if(flags & Flag::Wireframe) MAGNUM_ASSERT_EXTENSION_SUPPORTED(Extensions::GL::OES::standard_derivatives); @@ -44,12 +46,13 @@ MeshVisualizer::MeshVisualizer(const Flags flags): flags(flags), transformationP Utility::Resource rs("MagnumShaders"); #ifndef MAGNUM_TARGET_GLES - const Version v = Context::current()->supportedVersion({Version::GL320, Version::GL310, Version::GL210}); + const Version version = Context::current()->supportedVersion({Version::GL320, Version::GL310, Version::GL300, Version::GL210}); + CORRADE_INTERNAL_ASSERT_OUTPUT(flags & Flag::NoGeometryShader || version >= Version::GL320); #else - const Version v = Context::current()->supportedVersion({Version::GLES300, Version::GLES200}); + const Version version = Context::current()->supportedVersion({Version::GLES300, Version::GLES200}); #endif - Shader vert(v, Shader::Type::Vertex); + Shader vert(version, Shader::Type::Vertex); vert.addSource(flags & Flag::Wireframe ? "#define WIREFRAME_RENDERING\n" : "") .addSource(flags & Flag::NoGeometryShader ? "#define NO_GEOMETRY_SHADER\n" : "") .addSource(rs.get("compatibility.glsl")) @@ -60,7 +63,7 @@ MeshVisualizer::MeshVisualizer(const Flags flags): flags(flags), transformationP #ifndef MAGNUM_TARGET_GLES if(flags & Flag::Wireframe && !(flags & Flag::NoGeometryShader)) { - Shader geom(v, Shader::Type::Geometry); + Shader geom(version, Shader::Type::Geometry); geom.addSource(rs.get("compatibility.glsl")) .addSource(rs.get("MeshVisualizer.geom")); CORRADE_INTERNAL_ASSERT_OUTPUT(geom.compile()); @@ -69,7 +72,7 @@ MeshVisualizer::MeshVisualizer(const Flags flags): flags(flags), transformationP } #endif - Shader frag(v, Shader::Type::Fragment); + Shader frag(version, Shader::Type::Fragment); frag.addSource(flags & Flag::Wireframe ? "#define WIREFRAME_RENDERING\n" : "") .addSource(flags & Flag::NoGeometryShader ? "#define NO_GEOMETRY_SHADER\n" : "") .addSource(rs.get("compatibility.glsl")) @@ -79,8 +82,7 @@ MeshVisualizer::MeshVisualizer(const Flags flags): flags(flags), transformationP attachShader(frag); #ifndef MAGNUM_TARGET_GLES - if(!Context::current()->isExtensionSupported() || - Context::current()->version() == Version::GL210) + if(!Context::current()->isExtensionSupported(version)) #else if(!Context::current()->isVersionSupported(Version::GLES300)) #endif @@ -99,7 +101,7 @@ MeshVisualizer::MeshVisualizer(const Flags flags): flags(flags), transformationP link(); #ifndef MAGNUM_TARGET_GLES - if(!Context::current()->isExtensionSupported()) + if(!Context::current()->isExtensionSupported(version)) #endif { transformationProjectionMatrixUniform = uniformLocation("transformationProjectionMatrix");