Browse Source

Added Buffer::uniformOffsetAlignment() limit query.

pull/68/head
Vladimír Vondruš 12 years ago
parent
commit
5ad9ef56f4
  1. 2
      doc/opengl-mapping.dox
  2. 14
      src/Magnum/Buffer.cpp
  3. 11
      src/Magnum/Buffer.h
  4. 2
      src/Magnum/Implementation/BufferState.cpp
  5. 1
      src/Magnum/Implementation/BufferState.h
  6. 1
      src/Magnum/Platform/magnum-info.cpp

2
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

14
src/Magnum/Buffer.cpp

@ -99,6 +99,20 @@ Int Buffer::shaderStorageOffsetAlignment() {
return value;
}
Int Buffer::uniformOffsetAlignment() {
#ifndef MAGNUM_TARGET_GLES
if(!Context::current()->isExtensionSupported<Extensions::GL::ARB::uniform_buffer_object>())
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<Extensions::GL::ARB::uniform_buffer_object>())

11
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
*

2
src/Magnum/Implementation/BufferState.cpp

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

1
src/Magnum/Implementation/BufferState.h

@ -74,6 +74,7 @@ struct BufferState {
maxAtomicCounterBindings,
maxShaderStorageBindings,
shaderStorageOffsetAlignment,
uniformOffsetAlignment,
maxUniformBindings;
#endif
};

1
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))

Loading…
Cancel
Save