From 5367bef3ef81eb0c6f345ff3813985e62773e374 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Thu, 3 Jan 2013 00:35:03 +0100 Subject: [PATCH] Ability to specify buffer range in BufferTexture. Extension ARB_texture_buffer_range in OpenGL 4.3. --- src/BufferTexture.cpp | 16 ++++++++++++++-- src/BufferTexture.h | 25 ++++++++++++++++++++++++- 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/src/BufferTexture.cpp b/src/BufferTexture.cpp index 7fd4f6d50..621d4feee 100644 --- a/src/BufferTexture.cpp +++ b/src/BufferTexture.cpp @@ -23,23 +23,35 @@ namespace Magnum { BufferTexture::SetBufferImplementation BufferTexture::setBufferImplementation = &BufferTexture::setBufferImplementationDefault; +BufferTexture::SetBufferRangeImplementation BufferTexture::setBufferRangeImplementation = &BufferTexture::setBufferRangeImplementationDefault; void BufferTexture::initializeContextBasedFunctionality(Context* context) { if(context->isExtensionSupported()) { Debug() << "BufferTexture: using" << Extensions::GL::EXT::direct_state_access::string() << "features"; setBufferImplementation = &BufferTexture::setBufferImplementationDSA; + setBufferRangeImplementation = &BufferTexture::setBufferRangeImplementationDSA; } } -void BufferTexture::setBufferImplementationDefault(BufferTexture::InternalFormat internalFormat, Buffer* buffer) { +void BufferTexture::setBufferImplementationDefault(InternalFormat internalFormat, Buffer* buffer) { bindInternal(); glTexBuffer(GL_TEXTURE_BUFFER, GLenum(internalFormat), buffer->id()); } -void BufferTexture::setBufferImplementationDSA(BufferTexture::InternalFormat internalFormat, Buffer* buffer) { +void BufferTexture::setBufferImplementationDSA(InternalFormat internalFormat, Buffer* buffer) { glTextureBufferEXT(id(), GL_TEXTURE_BUFFER, GLenum(internalFormat), buffer->id()); } +void BufferTexture::setBufferRangeImplementationDefault(InternalFormat internalFormat, Buffer* buffer, GLintptr offset, GLsizeiptr size) { + bindInternal(); + glTexBufferRange(GL_TEXTURE_BUFFER, GLenum(internalFormat), buffer->id(), offset, size); +} + +void BufferTexture::setBufferRangeImplementationDSA(InternalFormat internalFormat, Buffer* buffer, GLintptr offset, GLsizeiptr size) { + glTextureBufferRangeEXT(id(), GL_TEXTURE_BUFFER, GLenum(internalFormat), buffer->id(), offset, size); +} + + } #endif diff --git a/src/BufferTexture.h b/src/BufferTexture.h index 37cc3c9a1..4a6130fb1 100644 --- a/src/BufferTexture.h +++ b/src/BufferTexture.h @@ -62,7 +62,7 @@ AbstractShaderProgram documentation for more information. @section BufferTexture-performance-optimization Performance optimizations If extension @extension{EXT,direct_state_access} is available, setBuffer() -uses DSA function to avoid unnecessary calls to @fn_gl{ActiveTexture} and +functions use DSA to avoid unnecessary calls to @fn_gl{ActiveTexture} and @fn_gl{BindTexture}. See @ref AbstractTexture-performance-optimization "relevant section in AbstractTexture documentation" and respective function documentation for more information. @@ -214,6 +214,24 @@ class MAGNUM_EXPORT BufferTexture: private AbstractTexture { (this->*setBufferImplementation)(internalFormat, buffer); } + /** + * @brief Set texture buffer + * @param internalFormat Internal format + * @param buffer %Buffer + * @param offset Offset + * @param size Data size + * + * Binds range of given buffer to this texture. The buffer itself can + * be then filled with data of proper format at any time using Buffer + * own data setting functions. + * @requires_gl43 %Extension @extension{ARB,texture_buffer_range} + * @see @fn_gl{ActiveTexture}, @fn_gl{BindTexture} and @fn_gl{TexBuffer} + * or @fn_gl_extension{TextureBufferRange,EXT,direct_state_access} + */ + inline void setBuffer(InternalFormat internalFormat, Buffer* buffer, GLintptr offset, GLsizeiptr size) { + (this->*setBufferRangeImplementation)(internalFormat, buffer, offset, size); + } + private: static void MAGNUM_LOCAL initializeContextBasedFunctionality(Context* context); @@ -221,6 +239,11 @@ class MAGNUM_EXPORT BufferTexture: private AbstractTexture { void MAGNUM_LOCAL setBufferImplementationDefault(InternalFormat internalFormat, Buffer* buffer); void MAGNUM_LOCAL setBufferImplementationDSA(InternalFormat internalFormat, Buffer* buffer); static SetBufferImplementation setBufferImplementation; + + typedef void(BufferTexture::*SetBufferRangeImplementation)(InternalFormat, Buffer*, GLintptr, GLsizeiptr); + void MAGNUM_LOCAL setBufferRangeImplementationDefault(InternalFormat internalFormat, Buffer* buffer, GLintptr offset, GLsizeiptr size); + void MAGNUM_LOCAL setBufferRangeImplementationDSA(InternalFormat internalFormat, Buffer* buffer, GLintptr offset, GLsizeiptr size); + static SetBufferRangeImplementation setBufferRangeImplementation; }; }