From 5ad9ef56f4488be254d278aeaab4a5d50c60ce47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 24 Aug 2014 18:39:57 +0200 Subject: [PATCH] Added Buffer::uniformOffsetAlignment() limit query. --- doc/opengl-mapping.dox | 2 +- src/Magnum/Buffer.cpp | 14 ++++++++++++++ src/Magnum/Buffer.h | 11 +++++++++++ src/Magnum/Implementation/BufferState.cpp | 2 +- src/Magnum/Implementation/BufferState.h | 1 + src/Magnum/Platform/magnum-info.cpp | 1 + 6 files changed, 29 insertions(+), 2 deletions(-) diff --git a/doc/opengl-mapping.dox b/doc/opengl-mapping.dox index 4fbb3b5cf..7f99a768d 100644 --- a/doc/opengl-mapping.dox +++ b/doc/opengl-mapping.dox @@ -377,7 +377,7 @@ OpenGL function | Matching API @def_gl{TEXTURE_BUFFER_OFFSET_ALIGNMENT} | @ref BufferTexture::offsetAlignment() @def_gl{TIMESTAMP} | | @def_gl{TRANSFORM_FEEDBACK_BUFFER_BINDING}, \n @def_gl{TRANSFORM_FEEDBACK_BUFFER_SIZE}, \n @def_gl{TRANSFORM_FEEDBACK_BUFFER_START} | not queryable -@def_gl{UNIFORM_BUFFER_OFFSET_ALIGNMENT} | | +@def_gl{UNIFORM_BUFFER_OFFSET_ALIGNMENT} | @ref Buffer::uniformOffsetAlignment() @def_gl{UNIFORM_BUFFER_BINDING}, \n @def_gl{UNIFORM_BUFFER_SIZE}, \n @def_gl{UNIFORM_BUFFER_START} | not queryable @def_gl{VERTEX_BINDING_DIVISOR}, \n @def_gl{VERTEX_BINDING_OFFSET}, \n @def_gl{VERTEX_BINDING_STRIDE} | not queryable @def_gl{VERTEX_PROGRAM_POINT_SIZE} | not queryable diff --git a/src/Magnum/Buffer.cpp b/src/Magnum/Buffer.cpp index 03696dc1b..b42b95d09 100644 --- a/src/Magnum/Buffer.cpp +++ b/src/Magnum/Buffer.cpp @@ -99,6 +99,20 @@ Int Buffer::shaderStorageOffsetAlignment() { return value; } +Int Buffer::uniformOffsetAlignment() { + #ifndef MAGNUM_TARGET_GLES + if(!Context::current()->isExtensionSupported()) + return 1; + #endif + + GLint& value = Context::current()->state().buffer->uniformOffsetAlignment; + + if(value == 0) + glGetIntegerv(GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT, &value); + + return value; +} + Int Buffer::maxUniformBindings() { #ifndef MAGNUM_TARGET_GLES if(!Context::current()->isExtensionSupported()) diff --git a/src/Magnum/Buffer.h b/src/Magnum/Buffer.h index af196e214..f04773764 100644 --- a/src/Magnum/Buffer.h +++ b/src/Magnum/Buffer.h @@ -471,6 +471,17 @@ class MAGNUM_EXPORT Buffer: public AbstractObject { */ static Int maxShaderStorageBindings(); + /** + * @brief Alignment of uniform buffer binding offset + * + * The result is cached, repeated queries don't result in repeated + * OpenGL calls. If extension @extension{ARB,uniform_buffer_object} + * (part of OpenGL 3.1) is not available, returns `1`. + * @see @fn_gl{Get} with @def_gl{UNIFORM_BUFFER_OFFSET_ALIGNMENT} + * @requires_gles30 Uniform buffers are not available in OpenGL ES 2.0 + */ + static Int uniformOffsetAlignment(); + /** * @brief Alignment of shader storage buffer binding offset * diff --git a/src/Magnum/Implementation/BufferState.cpp b/src/Magnum/Implementation/BufferState.cpp index 618dff7f0..7d285ed78 100644 --- a/src/Magnum/Implementation/BufferState.cpp +++ b/src/Magnum/Implementation/BufferState.cpp @@ -83,7 +83,7 @@ BufferState::BufferState(Context& context, std::vector& extensions) #ifndef MAGNUM_TARGET_GLES , minMapAlignment(0) #endif - , maxAtomicCounterBindings(0), maxShaderStorageBindings(0), shaderStorageOffsetAlignment(0), maxUniformBindings(0) + , maxAtomicCounterBindings{0}, maxShaderStorageBindings{0}, shaderStorageOffsetAlignment{0}, uniformOffsetAlignment{0}, maxUniformBindings{0} #endif { #ifndef MAGNUM_TARGET_GLES diff --git a/src/Magnum/Implementation/BufferState.h b/src/Magnum/Implementation/BufferState.h index 48ccba415..38d9e101e 100644 --- a/src/Magnum/Implementation/BufferState.h +++ b/src/Magnum/Implementation/BufferState.h @@ -74,6 +74,7 @@ struct BufferState { maxAtomicCounterBindings, maxShaderStorageBindings, shaderStorageOffsetAlignment, + uniformOffsetAlignment, maxUniformBindings; #endif }; diff --git a/src/Magnum/Platform/magnum-info.cpp b/src/Magnum/Platform/magnum-info.cpp index 52016ab2b..d36e4e059 100644 --- a/src/Magnum/Platform/magnum-info.cpp +++ b/src/Magnum/Platform/magnum-info.cpp @@ -513,6 +513,7 @@ MagnumInfo::MagnumInfo(const Arguments& arguments): Platform::WindowlessApplicat _h(ARB::uniform_buffer_object) #endif + _l(Buffer::uniformOffsetAlignment()) _l(Shader::maxUniformBlocks(Shader::Type::Vertex)) #ifndef MAGNUM_TARGET_GLES _l(Shader::maxUniformBlocks(Shader::Type::TessellationControl))