From 9a7d3a1becb3b21212e6864f55cc83ea09078d1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 9 Oct 2016 19:33:53 +0200 Subject: [PATCH] Added TransformFeedback::maxVertexStreams() limit query. --- doc/opengl-mapping.dox | 1 + src/Magnum/Implementation/TransformFeedbackState.cpp | 2 +- src/Magnum/Implementation/TransformFeedbackState.h | 3 ++- src/Magnum/Platform/magnum-info.cpp | 1 + src/Magnum/TransformFeedback.cpp | 12 ++++++++++++ src/Magnum/TransformFeedback.h | 12 ++++++++++++ 6 files changed, 29 insertions(+), 2 deletions(-) diff --git a/doc/opengl-mapping.dox b/doc/opengl-mapping.dox index 4fd9ab6f0..6a0ca874c 100644 --- a/doc/opengl-mapping.dox +++ b/doc/opengl-mapping.dox @@ -478,6 +478,7 @@ OpenGL function | Matching API @def_gl{MAX_VERTEX_ATTRIB_STRIDE} | | @def_gl{MAX_VERTEX_ATTRIB_BINDINGS} | | @def_gl{MAX_VERTEX_ATTRIB_RELATIVE_OFFSET} | | +@def_gl{MAX_VERTEX_STREAMS} | @ref TransformFeedback::maxVertexStreams() @def_gl{MAX_VIEWPORTS} | | @def_gl{MAX_VIEWPORT_DIMS} | @ref AbstractFramebuffer::maxViewportSize() @def_gl{MIN_FRAGMENT_INTERPOLATION_OFFSET}, \n @def_gl{MAX_FRAGMENT_INTERPOLATION_OFFSET} | | diff --git a/src/Magnum/Implementation/TransformFeedbackState.cpp b/src/Magnum/Implementation/TransformFeedbackState.cpp index 020269ab8..4484cb837 100644 --- a/src/Magnum/Implementation/TransformFeedbackState.cpp +++ b/src/Magnum/Implementation/TransformFeedbackState.cpp @@ -10,7 +10,7 @@ namespace Magnum { namespace Implementation { TransformFeedbackState::TransformFeedbackState(Context& context, std::vector& extensions): maxInterleavedComponents{0}, maxSeparateAttributes{0}, maxSeparateComponents{0} #ifndef MAGNUM_TARGET_GLES - , maxBuffers{0} + , maxBuffers{0}, maxVertexStreams{0} #endif { #ifndef MAGNUM_TARGET_GLES diff --git a/src/Magnum/Implementation/TransformFeedbackState.h b/src/Magnum/Implementation/TransformFeedbackState.h index 93047d51a..e9cd227c6 100644 --- a/src/Magnum/Implementation/TransformFeedbackState.h +++ b/src/Magnum/Implementation/TransformFeedbackState.h @@ -53,7 +53,8 @@ struct TransformFeedbackState { maxSeparateAttributes, maxSeparateComponents; #ifndef MAGNUM_TARGET_GLES - GLint maxBuffers; + GLint maxBuffers, + maxVertexStreams; #endif GLuint binding; diff --git a/src/Magnum/Platform/magnum-info.cpp b/src/Magnum/Platform/magnum-info.cpp index 17bcc8cf9..630a6c81e 100644 --- a/src/Magnum/Platform/magnum-info.cpp +++ b/src/Magnum/Platform/magnum-info.cpp @@ -612,6 +612,7 @@ MagnumInfo::MagnumInfo(const Arguments& arguments): Platform::WindowlessApplicat _h(ARB::transform_feedback3) _l(TransformFeedback::maxBuffers()) + _l(TransformFeedback::maxVertexStreams()) } #endif diff --git a/src/Magnum/TransformFeedback.cpp b/src/Magnum/TransformFeedback.cpp index 1ec6160c0..89546dd50 100644 --- a/src/Magnum/TransformFeedback.cpp +++ b/src/Magnum/TransformFeedback.cpp @@ -94,6 +94,18 @@ Int TransformFeedback::maxBuffers() { return value; } + +Int TransformFeedback::maxVertexStreams() { + if(!Context::current().isExtensionSupported()) + return 1; + + GLint& value = Context::current().state().transformFeedback->maxVertexStreams; + + if(value == 0) + glGetIntegerv(GL_MAX_VERTEX_STREAMS, &value); + + return value; +} #endif TransformFeedback::TransformFeedback(): _flags{ObjectFlag::DeleteOnDestruction} { diff --git a/src/Magnum/TransformFeedback.h b/src/Magnum/TransformFeedback.h index 602d3ba2a..3e3fa5cd2 100644 --- a/src/Magnum/TransformFeedback.h +++ b/src/Magnum/TransformFeedback.h @@ -147,6 +147,18 @@ class MAGNUM_EXPORT TransformFeedback: public AbstractObject { * WebGL. */ static Int maxBuffers(); + + /** + * @brief Max supported vertex stream count + * + * The result is cached, repeated queries don't result in repeated + * OpenGL calls. If extension @extension{ARB,transform_feedback3} (part + * of OpenGL 4.0) is not available, returns `1`. + * @see @fn_gl{Get} with @def_gl{MAX_VERTEX_STREAMS} + * @requires_gl Multiple vertex streams are not available in OpenGL ES + * and WebGL. + */ + static Int maxVertexStreams(); #endif /**