Browse Source

GL: wait, there's not just three ES instanced extensions, there's FIVE.

Like, why can't they just depend on each other or something?
pull/324/head
Vladimír Vondruš 7 years ago
parent
commit
f5e9ba7e8a
  1. 5
      doc/changelog.dox
  2. 14
      src/Magnum/GL/Implementation/MeshState.cpp
  3. 10
      src/Magnum/GL/Mesh.h
  4. 10
      src/Magnum/GL/MeshView.h
  5. 16
      src/Magnum/GL/Test/MeshGLTest.cpp

5
doc/changelog.dox

@ -116,6 +116,11 @@ See also:
- Fixed a bad interaction of @ref GL::Mesh and @ref GL::Buffer state trackers - Fixed a bad interaction of @ref GL::Mesh and @ref GL::Buffer state trackers
resulting in corrupted rendering on ES/WebGL platforms and systems without resulting in corrupted rendering on ES/WebGL platforms and systems without
@gl_extension{ARB,direct_state_access} / @gl_extension{EXT,direct_state_access} @gl_extension{ARB,direct_state_access} / @gl_extension{EXT,direct_state_access}
- Fixed @ref GL::Mesh instanced drawing to properly take into account all
five @gl_extension{ANGLE,instanced_arrays},
@gl_extension{EXT,instanced_arrays}, @gl_extension{EXT,draw_instanced},
@gl_extension{NV,instanced_arrays} and @gl_extension{NV,draw_instanced}
extensions
- Updated the `base-qt` bootstrap project to correctly reset state tracker - Updated the `base-qt` bootstrap project to correctly reset state tracker
when going from and back to Qt code, and to use the framebuffer provided by when going from and back to Qt code, and to use the framebuffer provided by
Qt instead of @ref GL::defaultFramebuffer (see Qt instead of @ref GL::defaultFramebuffer (see

14
src/Magnum/GL/Implementation/MeshState.cpp

@ -120,14 +120,20 @@ MeshState::MeshState(Context& context, ContextState& contextState, std::vector<s
drawElementsInstancedImplementation = &Mesh::drawElementsInstancedImplementationANGLE; drawElementsInstancedImplementation = &Mesh::drawElementsInstancedImplementationANGLE;
} }
#ifndef MAGNUM_TARGET_WEBGL #ifndef MAGNUM_TARGET_WEBGL
else if(context.isExtensionSupported<Extensions::EXT::draw_instanced>()) { else if(context.isExtensionSupported<Extensions::EXT::instanced_arrays>() ||
extensions.push_back(Extensions::EXT::draw_instanced::string()); context.isExtensionSupported<Extensions::EXT::draw_instanced>()) {
extensions.push_back(context.isExtensionSupported<Extensions::EXT::instanced_arrays>() ?
Extensions::EXT::instanced_arrays::string() :
Extensions::EXT::draw_instanced::string());
drawArraysInstancedImplementation = &Mesh::drawArraysInstancedImplementationEXT; drawArraysInstancedImplementation = &Mesh::drawArraysInstancedImplementationEXT;
drawElementsInstancedImplementation = &Mesh::drawElementsInstancedImplementationEXT; drawElementsInstancedImplementation = &Mesh::drawElementsInstancedImplementationEXT;
} else if(context.isExtensionSupported<Extensions::NV::draw_instanced>()) { } else if(context.isExtensionSupported<Extensions::NV::instanced_arrays>() ||
extensions.push_back(Extensions::NV::draw_instanced::string()); context.isExtensionSupported<Extensions::NV::draw_instanced>()) {
extensions.push_back(context.isExtensionSupported<Extensions::NV::instanced_arrays>() ?
Extensions::NV::instanced_arrays::string() :
Extensions::NV::draw_instanced::string());
drawArraysInstancedImplementation = &Mesh::drawArraysInstancedImplementationNV; drawArraysInstancedImplementation = &Mesh::drawArraysInstancedImplementationNV;
drawElementsInstancedImplementation = &Mesh::drawElementsInstancedImplementationNV; drawElementsInstancedImplementation = &Mesh::drawElementsInstancedImplementationNV;

10
src/Magnum/GL/Mesh.h

@ -618,7 +618,9 @@ class MAGNUM_GL_EXPORT Mesh: public AbstractObject {
* @requires_gl42 Extension @gl_extension{ARB,transform_feedback_instanced} * @requires_gl42 Extension @gl_extension{ARB,transform_feedback_instanced}
* if using @ref draw(AbstractShaderProgram&, TransformFeedback&, UnsignedInt) * if using @ref draw(AbstractShaderProgram&, TransformFeedback&, UnsignedInt)
* @requires_gles30 Extension @gl_extension{ANGLE,instanced_arrays}, * @requires_gles30 Extension @gl_extension{ANGLE,instanced_arrays},
* @gl_extension2{EXT,draw_instanced,draw_instanced} or * @gl_extension{EXT,instanced_arrays},
* @gl_extension{EXT,draw_instanced},
* @gl_extension{NV,instanced_arrays},
* @gl_extension{NV,draw_instanced} in OpenGL ES 2.0. * @gl_extension{NV,draw_instanced} in OpenGL ES 2.0.
* @requires_webgl20 Extension @webgl_extension{ANGLE,instanced_arrays} * @requires_webgl20 Extension @webgl_extension{ANGLE,instanced_arrays}
* in WebGL 1.0. * in WebGL 1.0.
@ -944,8 +946,10 @@ class MAGNUM_GL_EXPORT Mesh: public AbstractObject {
* @requires_gl42 Extension @gl_extension{ARB,base_instance} if * @requires_gl42 Extension @gl_extension{ARB,base_instance} if
* @ref baseInstance() is not `0`. * @ref baseInstance() is not `0`.
* @requires_gles30 Extension @gl_extension{ANGLE,instanced_arrays}, * @requires_gles30 Extension @gl_extension{ANGLE,instanced_arrays},
* @gl_extension{EXT,instanced_arrays} or * @gl_extension{EXT,instanced_arrays},
* @gl_extension{NV,instanced_arrays} in OpenGL ES 2.0 if * @gl_extension{EXT,draw_instanced},
* @gl_extension{NV,instanced_arrays},
* @gl_extension{NV,draw_instanced} in OpenGL ES 2.0 if
* @ref instanceCount() is more than `1`. * @ref instanceCount() is more than `1`.
* @requires_webgl20 Extension @webgl_extension{ANGLE,instanced_arrays} * @requires_webgl20 Extension @webgl_extension{ANGLE,instanced_arrays}
* in WebGL 1.0 if @ref instanceCount() is more than `1`. * in WebGL 1.0 if @ref instanceCount() is more than `1`.

10
src/Magnum/GL/MeshView.h

@ -204,7 +204,9 @@ class MAGNUM_GL_EXPORT MeshView {
* @requires_gl42 Extension @gl_extension{ARB,transform_feedback_instanced} * @requires_gl42 Extension @gl_extension{ARB,transform_feedback_instanced}
* if using @ref draw(AbstractShaderProgram&, TransformFeedback&, UnsignedInt) * if using @ref draw(AbstractShaderProgram&, TransformFeedback&, UnsignedInt)
* @requires_gles30 Extension @gl_extension{ANGLE,instanced_arrays}, * @requires_gles30 Extension @gl_extension{ANGLE,instanced_arrays},
* @gl_extension2{EXT,draw_instanced,draw_instanced} or * @gl_extension{EXT,instanced_arrays},
* @gl_extension{EXT,draw_instanced},
* @gl_extension{NV,instanced_arrays},
* @gl_extension{NV,draw_instanced} in OpenGL ES 2.0. * @gl_extension{NV,draw_instanced} in OpenGL ES 2.0.
* @requires_webgl20 Extension @webgl_extension{ANGLE,instanced_arrays} * @requires_webgl20 Extension @webgl_extension{ANGLE,instanced_arrays}
* in WebGL 1.0. * in WebGL 1.0.
@ -248,8 +250,10 @@ class MAGNUM_GL_EXPORT MeshView {
* @requires_gl42 Extension @gl_extension{ARB,base_instance} if * @requires_gl42 Extension @gl_extension{ARB,base_instance} if
* @ref baseInstance() is not `0`. * @ref baseInstance() is not `0`.
* @requires_gles30 Extension @gl_extension{ANGLE,instanced_arrays}, * @requires_gles30 Extension @gl_extension{ANGLE,instanced_arrays},
* @gl_extension{EXT,instanced_arrays} or * @gl_extension{EXT,instanced_arrays},
* @gl_extension{NV,instanced_arrays} in OpenGL ES 2.0 if * @gl_extension{EXT,draw_instanced},
* @gl_extension{NV,instanced_arrays},
* @gl_extension{NV,draw_instanced} in OpenGL ES 2.0 if
* @ref instanceCount() is more than `1`. * @ref instanceCount() is more than `1`.
* @requires_webgl20 Extension @webgl_extension{ANGLE,instanced_arrays} * @requires_webgl20 Extension @webgl_extension{ANGLE,instanced_arrays}
* in WebGL 1.0 if @ref instanceCount() is more than `1`. * in WebGL 1.0 if @ref instanceCount() is more than `1`.

16
src/Magnum/GL/Test/MeshGLTest.cpp

@ -2307,7 +2307,9 @@ void MeshGLTest::setInstanceCount() {
#elif defined(MAGNUM_TARGET_GLES2) #elif defined(MAGNUM_TARGET_GLES2)
#ifndef MAGNUM_TARGET_WEBGL #ifndef MAGNUM_TARGET_WEBGL
if(!Context::current().isExtensionSupported<Extensions::ANGLE::instanced_arrays>() && if(!Context::current().isExtensionSupported<Extensions::ANGLE::instanced_arrays>() &&
!Context::current().isExtensionSupported<Extensions::EXT::instanced_arrays>() &&
!Context::current().isExtensionSupported<Extensions::EXT::draw_instanced>() && !Context::current().isExtensionSupported<Extensions::EXT::draw_instanced>() &&
!Context::current().isExtensionSupported<Extensions::NV::instanced_arrays>() &&
!Context::current().isExtensionSupported<Extensions::NV::draw_instanced>()) !Context::current().isExtensionSupported<Extensions::NV::draw_instanced>())
CORRADE_SKIP("Required extension is not available."); CORRADE_SKIP("Required extension is not available.");
#else #else
@ -2353,7 +2355,9 @@ void MeshGLTest::setInstanceCountIndexed() {
#elif defined(MAGNUM_TARGET_GLES2) #elif defined(MAGNUM_TARGET_GLES2)
#ifndef MAGNUM_TARGET_WEBGL #ifndef MAGNUM_TARGET_WEBGL
if(!Context::current().isExtensionSupported<Extensions::ANGLE::instanced_arrays>() && if(!Context::current().isExtensionSupported<Extensions::ANGLE::instanced_arrays>() &&
!Context::current().isExtensionSupported<Extensions::EXT::instanced_arrays>() &&
!Context::current().isExtensionSupported<Extensions::EXT::draw_instanced>() && !Context::current().isExtensionSupported<Extensions::EXT::draw_instanced>() &&
!Context::current().isExtensionSupported<Extensions::NV::instanced_arrays>() &&
!Context::current().isExtensionSupported<Extensions::NV::draw_instanced>()) !Context::current().isExtensionSupported<Extensions::NV::draw_instanced>())
CORRADE_SKIP("Required extension is not available."); CORRADE_SKIP("Required extension is not available.");
#else #else
@ -2540,11 +2544,7 @@ void MeshGLTest::addVertexBufferInstancedFloat() {
if(!Context::current().isExtensionSupported<Extensions::ANGLE::instanced_arrays>() && if(!Context::current().isExtensionSupported<Extensions::ANGLE::instanced_arrays>() &&
!Context::current().isExtensionSupported<Extensions::EXT::instanced_arrays>() && !Context::current().isExtensionSupported<Extensions::EXT::instanced_arrays>() &&
!Context::current().isExtensionSupported<Extensions::NV::instanced_arrays>()) !Context::current().isExtensionSupported<Extensions::NV::instanced_arrays>())
CORRADE_SKIP("Required instancing extension is not available."); CORRADE_SKIP("Required extension is not available.");
if(!Context::current().isExtensionSupported<Extensions::ANGLE::instanced_arrays>() &&
!Context::current().isExtensionSupported<Extensions::EXT::draw_instanced>() &&
!Context::current().isExtensionSupported<Extensions::NV::draw_instanced>())
CORRADE_SKIP("Required drawing extension is not available.");
#else #else
if(!Context::current().isExtensionSupported<Extensions::ANGLE::instanced_arrays>()) if(!Context::current().isExtensionSupported<Extensions::ANGLE::instanced_arrays>())
CORRADE_SKIP(Extensions::ANGLE::instanced_arrays::string() + std::string(" is not available.")); CORRADE_SKIP(Extensions::ANGLE::instanced_arrays::string() + std::string(" is not available."));
@ -2664,11 +2664,7 @@ void MeshGLTest::resetDivisorAfterInstancedDraw() {
if(!Context::current().isExtensionSupported<Extensions::ANGLE::instanced_arrays>() && if(!Context::current().isExtensionSupported<Extensions::ANGLE::instanced_arrays>() &&
!Context::current().isExtensionSupported<Extensions::EXT::instanced_arrays>() && !Context::current().isExtensionSupported<Extensions::EXT::instanced_arrays>() &&
!Context::current().isExtensionSupported<Extensions::NV::instanced_arrays>()) !Context::current().isExtensionSupported<Extensions::NV::instanced_arrays>())
CORRADE_SKIP("Required instancing extension is not available."); CORRADE_SKIP("Required extension is not available.");
if(!Context::current().isExtensionSupported<Extensions::ANGLE::instanced_arrays>() &&
!Context::current().isExtensionSupported<Extensions::EXT::draw_instanced>() &&
!Context::current().isExtensionSupported<Extensions::NV::draw_instanced>())
CORRADE_SKIP("Required drawing extension is not available.");
#else #else
if(!Context::current().isExtensionSupported<Extensions::ANGLE::instanced_arrays>()) if(!Context::current().isExtensionSupported<Extensions::ANGLE::instanced_arrays>())
CORRADE_SKIP(Extensions::ANGLE::instanced_arrays::string() + std::string(" is not available.")); CORRADE_SKIP(Extensions::ANGLE::instanced_arrays::string() + std::string(" is not available."));

Loading…
Cancel
Save