From 796bdb673164bb7759b8259cd6cc2aadf14de2e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sat, 2 Mar 2019 18:42:51 +0100 Subject: [PATCH] GL: new pseudo-extension MAGNUM_shader_vertex_id. Will be used to distinguish if the driver supports gl_VertexID. This is not the case on SwiftShader ES3 contexts (and could be elsewhere, probably). --- doc/changelog.dox | 7 +++++ doc/opengl-support.dox | 3 ++ src/Magnum/GL/Context.cpp | 28 +++++++++++-------- src/Magnum/GL/Context.h | 4 +-- src/Magnum/GL/Extensions.h | 6 ++++ src/Magnum/GL/Implementation/BufferState.cpp | 2 +- .../GL/Implementation/driverSpecific.cpp | 13 +++++++++ 7 files changed, 48 insertions(+), 15 deletions(-) diff --git a/doc/changelog.dox b/doc/changelog.dox index 4a614986c..d39ec2ae5 100644 --- a/doc/changelog.dox +++ b/doc/changelog.dox @@ -64,6 +64,13 @@ See also: that's fixing misbehaving buffers when using @ref GL::Buffer::TargetHint::TransformFeedback. See @ref opengl-workarounds for more information. +- New pseudo-extension `GL_MAGNUM_shader_vertex_id` denoting support of the + @glsl gl_VertexID @ce shader builtin. Present on all GL 3.0+, GLES 3.0+ and + WebGL 2 contexts, but disabled for SwiftShader as its support is broken + (see the @cpp "swiftshader-broken-shader-vertex-id" @ce workaround in + @ref opengl-workarounds for more information). This pseudo-extension can be + also explicitly disabled using the usual `--magnum-disable-extensions` + @ref GL-Context-command-line "command-line option" for testing purposes. - New `--magnum-gpu-validation` @ref GL-Context-command-line "command-line option" and a corresponding environment variable to conveniently enable @gl_extension{KHR,debug} debug output diff --git a/doc/opengl-support.dox b/doc/opengl-support.dox index a2ddaf0d6..c2d603bea 100644 --- a/doc/opengl-support.dox +++ b/doc/opengl-support.dox @@ -81,6 +81,7 @@ GLSL 1.30 | done @gl_extension{EXT,draw_buffers2} | | @gl_extension{EXT,texture_integer} | done (GL 3.0 subset) @gl_extension{EXT,transform_feedback} | done +`MAGNUM_shader_vertex_id` \n @m_span{m-text m-dim} Pseudo-extension denoting support for the @glsl gl_VertexID @ce GLSL builtin. @m_endspan | done @gl_extension{NV,depth_buffer_float} | | @gl_extension{NV,conditional_render} | done @@ -399,6 +400,7 @@ Extension | Status @gl_extension{EXT,draw_buffers} | done @gl_extension{EXT,instanced_arrays} | done @gl_extension{EXT,draw_instanced} | done +`MAGNUM_shader_vertex_id` \n @m_span{m-text m-dim} Pseudo-extension denoting support for the @glsl gl_VertexID @ce \n GLSL builtin. Exposed on ES3 builds as well. @m_endspan | done @gl_extension{NV,draw_buffers} | done @gl_extension{NV,fbo_color_attachments} | done @gl_extension{NV,read_buffer} | done @@ -495,6 +497,7 @@ Extension | Status @webgl_extension{EXT,color_buffer_half_float} | | @webgl_extension{EXT,blend_minmax} | done @webgl_extension{EXT,shader_texture_lod} | done (shading language only) +`MAGNUM_shader_vertex_id` \n @m_span{m-text m-dim} Pseudo-extension denoting support for the @glsl gl_VertexID @ce \n GLSL builtin. Exposed on WebGL 2 builds as well. @m_endspan | done @webgl_extension{OES,texture_float} | done @webgl_extension{OES,texture_half_float} | done @webgl_extension{OES,standard_derivatives} | done diff --git a/src/Magnum/GL/Context.cpp b/src/Magnum/GL/Context.cpp index 67f1f0084..f662ee25b 100644 --- a/src/Magnum/GL/Context.cpp +++ b/src/Magnum/GL/Context.cpp @@ -118,6 +118,7 @@ const std::vector& Extension::extensions(Version version) { _extension(EXT,draw_buffers2), _extension(EXT,texture_integer), _extension(EXT,transform_feedback), + _extension(MAGNUM,shader_vertex_id), _extension(NV,depth_buffer_float), _extension(NV,conditional_render)}; static const std::vector extensions310{ @@ -247,13 +248,16 @@ const std::vector& Extension::extensions(Version version) { _extension(EXT,color_buffer_float), _extension(OES,texture_float_linear), _extension(WEBGL,compressed_texture_s3tc)}; - #ifdef MAGNUM_TARGET_GLES2 static const std::vector extensionsES300{ + #ifdef MAGNUM_TARGET_GLES2 _extension(ANGLE,instanced_arrays), _extension(EXT,color_buffer_half_float), _extension(EXT,sRGB), _extension(EXT,blend_minmax), _extension(EXT,shader_texture_lod), + #endif + _extension(MAGNUM,shader_vertex_id), + #ifdef MAGNUM_TARGET_GLES2 _extension(OES,texture_float), _extension(OES,texture_half_float), _extension(OES,standard_derivatives), @@ -263,8 +267,9 @@ const std::vector& Extension::extensions(Version version) { _extension(OES,fbo_render_mipmap), _extension(WEBGL,depth_texture), _extension(WEBGL,color_buffer_float), - _extension(WEBGL,draw_buffers)}; - #endif + _extension(WEBGL,draw_buffers) + #endif + }; #else static const std::vector extensions{ #ifndef MAGNUM_TARGET_GLES2 @@ -309,8 +314,8 @@ const std::vector& Extension::extensions(Version version) { _extension(OES,stencil1), _extension(OES,stencil4), _extension(OES,texture_float_linear)}; - #ifdef MAGNUM_TARGET_GLES2 static const std::vector extensionsES300{ + #ifdef MAGNUM_TARGET_GLES2 _extension(ANGLE,framebuffer_blit), _extension(ANGLE,framebuffer_multisample), _extension(ANGLE,instanced_arrays), @@ -332,6 +337,9 @@ const std::vector& Extension::extensions(Version version) { _extension(EXT,draw_buffers), _extension(EXT,instanced_arrays), _extension(EXT,draw_instanced), + #endif + _extension(MAGNUM,shader_vertex_id), + #ifdef MAGNUM_TARGET_GLES2 _extension(NV,draw_buffers), _extension(NV,fbo_color_attachments), _extension(NV,read_buffer), @@ -357,8 +365,9 @@ const std::vector& Extension::extensions(Version version) { _extension(OES,standard_derivatives), _extension(OES,vertex_array_object), _extension(OES,required_internalformat), - _extension(OES,surfaceless_context)}; - #endif + _extension(OES,surfaceless_context) + #endif + }; static const std::vector extensionsES320{ _extension(EXT,color_buffer_half_float), #ifndef MAGNUM_TARGET_GLES2 @@ -418,12 +427,7 @@ const std::vector& Extension::extensions(Version version) { case Version::GLES320: return empty; #else case Version::GLES200: return empty; - case Version::GLES300: - #ifdef MAGNUM_TARGET_GLES2 - return extensionsES300; - #else - return empty; - #endif + case Version::GLES300: return extensionsES300; #ifndef MAGNUM_TARGET_WEBGL case Version::GLES310: return empty; case Version::GLES320: return extensionsES320; diff --git a/src/Magnum/GL/Context.h b/src/Magnum/GL/Context.h index 7bdf1ed5c..3d3c6ea42 100644 --- a/src/Magnum/GL/Context.h +++ b/src/Magnum/GL/Context.h @@ -58,9 +58,9 @@ namespace Implementation { #ifndef MAGNUM_TARGET_GLES 192 #elif !defined(MAGNUM_TARGET_WEBGL) - 128 + 144 #else - 24 + 32 #endif }; } diff --git a/src/Magnum/GL/Extensions.h b/src/Magnum/GL/Extensions.h index 2125e7a50..f183ddad4 100644 --- a/src/Magnum/GL/Extensions.h +++ b/src/Magnum/GL/Extensions.h @@ -255,6 +255,8 @@ namespace AMD { _extension(170,NV,depth_buffer_float, GL210, GL300) // #334 _extension(171,NV,conditional_render, GL210, GL300) // #346 /* NV_draw_texture not supported */ // #430 +} namespace MAGNUM { + _extension(180,MAGNUM,shader_vertex_id, GL300, GL300) } #elif defined(MAGNUM_TARGET_WEBGL) namespace ANGLE { @@ -295,6 +297,8 @@ namespace ANGLE { _extension(19,WEBGL,color_buffer_float, GLES200, None) // #14 _extension(20,WEBGL,draw_buffers, GLES200, GLES300) // #18 #endif +} namespace MAGNUM { + _extension(30,MAGNUM,shader_vertex_id, GLES300, GLES300) } #else namespace ANDROID { @@ -465,6 +469,8 @@ namespace ANDROID { #ifndef MAGNUM_TARGET_GLES2 _extension(126,OES,texture_storage_multisample_2d_array, GLES310, GLES320) // #174 #endif +} namespace MAGNUM { + _extension(130,MAGNUM,shader_vertex_id, GLES300, GLES300) } #endif #undef _extension diff --git a/src/Magnum/GL/Implementation/BufferState.cpp b/src/Magnum/GL/Implementation/BufferState.cpp index 6d280c83f..b27bb8d68 100644 --- a/src/Magnum/GL/Implementation/BufferState.cpp +++ b/src/Magnum/GL/Implementation/BufferState.cpp @@ -182,7 +182,7 @@ BufferState::BufferState(Context& context, std::vector& extensions) } #endif - #ifdef MAGNUM_TARGET_GLES + #if defined(MAGNUM_TARGET_GLES) && !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) if((context.detectedDriver() & Context::DetectedDriver::SwiftShader) && !context.isDriverWorkaroundDisabled("swiftshader-broken-xfb-buffer-binding-target")) { diff --git a/src/Magnum/GL/Implementation/driverSpecific.cpp b/src/Magnum/GL/Implementation/driverSpecific.cpp index 9e724d6e6..74c801cba 100644 --- a/src/Magnum/GL/Implementation/driverSpecific.cpp +++ b/src/Magnum/GL/Implementation/driverSpecific.cpp @@ -168,6 +168,13 @@ namespace { workaround, setting Buffer::TargetHint::TransformFeedback will make it use Buffer::TargetHint::Array instead, as that works okay. */ "swiftshader-broken-xfb-buffer-binding-target", + + /* SwiftShader 4.1.0 does implement gl_VertexID for ES3 contexts, but + in practice it doesn't work, returning a constant value. In order to + make this easier to check, there's a dummy MAGNUM_shader_vertex_id + extension that's defined on all GL 3.0+ and GLES 3.0+ / WebGL 2+ + contexts *except* for SwiftShader. */ + "swiftshader-broken-shader-vertex-id", #endif #ifndef MAGNUM_TARGET_GLES @@ -356,6 +363,12 @@ void Context::setupDriverWorkarounds() { } #endif + #if defined(MAGNUM_TARGET_GLES) && !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) + if((detectedDriver() & Context::DetectedDriver::SwiftShader) && + !isDriverWorkaroundDisabled("swiftshader-broken-shader-vertex-id")) + _setRequiredVersion(MAGNUM::shader_vertex_id, None); + #endif + #undef _setRequiredVersion }