Browse Source

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).
pull/324/head
Vladimír Vondruš 7 years ago
parent
commit
796bdb6731
  1. 7
      doc/changelog.dox
  2. 3
      doc/opengl-support.dox
  3. 24
      src/Magnum/GL/Context.cpp
  4. 4
      src/Magnum/GL/Context.h
  5. 6
      src/Magnum/GL/Extensions.h
  6. 2
      src/Magnum/GL/Implementation/BufferState.cpp
  7. 13
      src/Magnum/GL/Implementation/driverSpecific.cpp

7
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

3
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

24
src/Magnum/GL/Context.cpp

@ -118,6 +118,7 @@ const std::vector<Extension>& 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<Extension> extensions310{
@ -247,13 +248,16 @@ const std::vector<Extension>& 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<Extension> 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>& Extension::extensions(Version version) {
_extension(OES,fbo_render_mipmap),
_extension(WEBGL,depth_texture),
_extension(WEBGL,color_buffer_float),
_extension(WEBGL,draw_buffers)};
_extension(WEBGL,draw_buffers)
#endif
};
#else
static const std::vector<Extension> extensions{
#ifndef MAGNUM_TARGET_GLES2
@ -309,8 +314,8 @@ const std::vector<Extension>& Extension::extensions(Version version) {
_extension(OES,stencil1),
_extension(OES,stencil4),
_extension(OES,texture_float_linear)};
#ifdef MAGNUM_TARGET_GLES2
static const std::vector<Extension> 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>& 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>& Extension::extensions(Version version) {
_extension(OES,standard_derivatives),
_extension(OES,vertex_array_object),
_extension(OES,required_internalformat),
_extension(OES,surfaceless_context)};
_extension(OES,surfaceless_context)
#endif
};
static const std::vector<Extension> extensionsES320{
_extension(EXT,color_buffer_half_float),
#ifndef MAGNUM_TARGET_GLES2
@ -418,12 +427,7 @@ const std::vector<Extension>& 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;

4
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
};
}

6
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

2
src/Magnum/GL/Implementation/BufferState.cpp

@ -182,7 +182,7 @@ BufferState::BufferState(Context& context, std::vector<std::string>& 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"))
{

13
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
}

Loading…
Cancel
Save