From 7004ebdd50f18ec239a3ec3dc2bb58cc6b24e473 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 7 Oct 2012 19:55:26 +0200 Subject: [PATCH] Using EXT_direct_state_access also for Buffer::set*Data(). --- src/Buffer.cpp | 22 ++++++++++++++++++++++ src/Buffer.h | 24 ++++++++++++++++++------ 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/src/Buffer.cpp b/src/Buffer.cpp index 7c7a60e83..e5486e0db 100644 --- a/src/Buffer.cpp +++ b/src/Buffer.cpp @@ -23,12 +23,16 @@ namespace Magnum { Buffer::CopyImplementation Buffer::copyImplementation = &Buffer::copyImplementationDefault; +Buffer::SetDataImplementation Buffer::setDataImplementation = &Buffer::setDataImplementationDefault; +Buffer::SetSubDataImplementation Buffer::setSubDataImplementation = &Buffer::setSubDataImplementationDefault; void Buffer::initializeContextBasedFunctionality(Context* context) { if(context->isExtensionSupported()) { Debug() << "Buffer: using" << Extensions::GL::EXT::direct_state_access::string() << "features"; copyImplementation = &Buffer::copyImplementationDSA; + setDataImplementation = &Buffer::setDataImplementationDSA; + setSubDataImplementation = &Buffer::setSubDataImplementationDSA; } } @@ -42,4 +46,22 @@ void Buffer::copyImplementationDSA(Buffer* read, Buffer* write, GLintptr readOff glNamedCopyBufferSubDataEXT(read->_id, write->_id, readOffset, writeOffset, size); } +void Buffer::setDataImplementationDefault(GLsizeiptr size, const GLvoid* data, Buffer::Usage usage) { + bind(); + glBufferData(static_cast(_defaultTarget), size, data, static_cast(usage)); +} + +void Buffer::setDataImplementationDSA(GLsizeiptr size, const GLvoid* data, Buffer::Usage usage) { + glNamedBufferDataEXT(_id, size, data, static_cast(usage)); +} + +void Buffer::setSubDataImplementationDefault(GLintptr offset, GLsizeiptr size, const GLvoid* data) { + bind(); + glBufferSubData(static_cast(_defaultTarget), offset, size, data); +} + +void Buffer::setSubDataImplementationDSA(GLintptr offset, GLsizeiptr size, const GLvoid* data) { + glNamedBufferSubDataEXT(_id, offset, size, data); +} + } diff --git a/src/Buffer.h b/src/Buffer.h index 57b4eebe4..f14583c0c 100644 --- a/src/Buffer.h +++ b/src/Buffer.h @@ -311,11 +311,12 @@ class MAGNUM_EXPORT Buffer { * @param data Pointer to data * @param usage %Buffer usage * - * @see bind(), @fn_gl{BufferData} + * If @extension{EXT,direct_state_access} is not available, the buffer + * is bound to default target before the operation. + * @see bind(), @fn_gl{BufferData} or @fn_gl_extension{NamedBufferData,EXT,direct_state_access} */ inline void setData(GLsizeiptr size, const GLvoid* data, Usage usage) { - bind(); - glBufferData(static_cast(_defaultTarget), size, data, static_cast(usage)); + (this->*Magnum::Buffer::setDataImplementation)(size, data, usage); } /** @@ -351,11 +352,12 @@ class MAGNUM_EXPORT Buffer { * @param size Data size * @param data Pointer to data * - * @see bind(), @fn_gl{BufferSubData} + * If @extension{EXT,direct_state_access} is not available, the buffer + * is bound to default target before the operation. + * @see bind(), @fn_gl{BufferSubData} or @fn_gl_extension{NamedBufferSubData,EXT,direct_state_access} */ inline void setSubData(GLintptr offset, GLsizeiptr size, const GLvoid* data) { - bind(); - glBufferSubData(static_cast(_defaultTarget), offset, size, data); + (this->*setSubDataImplementation)(offset, size, data); } /** @@ -393,6 +395,16 @@ class MAGNUM_EXPORT Buffer { static void MAGNUM_LOCAL copyImplementationDSA(Buffer* read, Buffer* write, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); static CopyImplementation copyImplementation; + typedef void(Buffer::*SetDataImplementation)(GLsizeiptr, const GLvoid*, Usage); + void MAGNUM_LOCAL setDataImplementationDefault(GLsizeiptr size, const GLvoid* data, Usage usage); + void MAGNUM_LOCAL setDataImplementationDSA(GLsizeiptr size, const GLvoid* data, Usage usage); + static SetDataImplementation setDataImplementation; + + typedef void(Buffer::*SetSubDataImplementation)(GLintptr, GLsizeiptr, const GLvoid*); + void MAGNUM_LOCAL setSubDataImplementationDefault(GLintptr offset, GLsizeiptr size, const GLvoid* data); + void MAGNUM_LOCAL setSubDataImplementationDSA(GLintptr offset, GLsizeiptr size, const GLvoid* data); + static SetSubDataImplementation setSubDataImplementation; + GLuint _id; Target _defaultTarget; };