diff --git a/src/DivaGL/gl_array_buffer.hpp b/src/DivaGL/gl_array_buffer.hpp index c36a32a..dc22386 100644 --- a/src/DivaGL/gl_array_buffer.hpp +++ b/src/DivaGL/gl_array_buffer.hpp @@ -104,6 +104,30 @@ public: return 0; } + inline void* MapMemory(size_t offset, size_t length) { + if (!buffer) + return 0; + + void* data; + if (GL_VERSION_4_5) + data = glMapNamedBufferRange(buffer, (GLintptr)offset, (GLsizeiptr)length, GL_WRITE_ONLY); + else { + gl_state_bind_array_buffer(buffer); + data = glMapBufferRange(GL_ARRAY_BUFFER, (GLintptr)offset, (GLsizeiptr)length, GL_WRITE_ONLY); + } + + if (data) + return data; + + if (GL_VERSION_4_5) + glUnmapNamedBuffer(buffer); + else { + glUnmapBuffer(GL_ARRAY_BUFFER); + gl_state_bind_array_buffer(0); + } + return 0; + } + inline bool NotNull() { return !!buffer; } diff --git a/src/DivaGL/gl_element_array_buffer.hpp b/src/DivaGL/gl_element_array_buffer.hpp index 4440028..c5b7326 100644 --- a/src/DivaGL/gl_element_array_buffer.hpp +++ b/src/DivaGL/gl_element_array_buffer.hpp @@ -100,6 +100,30 @@ public: return 0; } + inline void* MapMemory(size_t offset, size_t length) { + if (!buffer) + return 0; + + void* data; + if (GL_VERSION_4_5) + data = glMapNamedBufferRange(buffer, (GLintptr)offset, (GLsizeiptr)length, GL_WRITE_ONLY); + else { + gl_state_bind_element_array_buffer(buffer); + data = glMapBufferRange(GL_ELEMENT_ARRAY_BUFFER, (GLintptr)offset, (GLsizeiptr)length, GL_WRITE_ONLY); + } + + if (data) + return data; + + if (GL_VERSION_4_5) + glUnmapNamedBuffer(buffer); + else { + glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER); + gl_state_bind_element_array_buffer(0); + } + return 0; + } + inline bool NotNull() { return !!buffer; } diff --git a/src/DivaGL/gl_shader_storage_buffer.hpp b/src/DivaGL/gl_shader_storage_buffer.hpp index e7e4db7..4842d91 100644 --- a/src/DivaGL/gl_shader_storage_buffer.hpp +++ b/src/DivaGL/gl_shader_storage_buffer.hpp @@ -100,6 +100,30 @@ public: return 0; } + inline void* MapMemory(size_t offset, size_t length) { + if (!buffer) + return 0; + + void* data; + if (GL_VERSION_4_5) + data = glMapNamedBufferRange(buffer, (GLintptr)offset, (GLsizeiptr)length, GL_WRITE_ONLY); + else { + gl_state_bind_shader_storage_buffer(buffer); + data = glMapBufferRange(GL_SHADER_STORAGE_BUFFER, (GLintptr)offset, (GLsizeiptr)length, GL_WRITE_ONLY); + } + + if (data) + return data; + + if (GL_VERSION_4_5) + glUnmapNamedBuffer(buffer); + else { + glUnmapBuffer(GL_SHADER_STORAGE_BUFFER); + gl_state_bind_shader_storage_buffer(0); + } + return 0; + } + inline bool NotNull() { return !!buffer; } diff --git a/src/DivaGL/gl_uniform_buffer.hpp b/src/DivaGL/gl_uniform_buffer.hpp index 0da7adb..e1ca820 100644 --- a/src/DivaGL/gl_uniform_buffer.hpp +++ b/src/DivaGL/gl_uniform_buffer.hpp @@ -100,6 +100,30 @@ public: return 0; } + inline void* MapMemory(size_t offset, size_t length) { + if (!buffer) + return 0; + + void* data; + if (GL_VERSION_4_5) + data = glMapNamedBufferRange(buffer, (GLintptr)offset, (GLsizeiptr)length, GL_WRITE_ONLY); + else { + gl_state_bind_uniform_buffer(buffer); + data = glMapBufferRange(GL_UNIFORM_BUFFER, (GLintptr)offset, (GLsizeiptr)length, GL_WRITE_ONLY); + } + + if (data) + return data; + + if (GL_VERSION_4_5) + glUnmapNamedBuffer(buffer); + else { + glUnmapBuffer(GL_UNIFORM_BUFFER); + gl_state_bind_uniform_buffer(0); + } + return 0; + } + inline bool NotNull() { return !!buffer; } diff --git a/src/DivaGL/wrap.cpp b/src/DivaGL/wrap.cpp index ccfcd8e..7779511 100644 --- a/src/DivaGL/wrap.cpp +++ b/src/DivaGL/wrap.cpp @@ -2444,6 +2444,7 @@ typedef void (GLAPIENTRY* PFNGLCREATEBUFFERSPROC)(GLsizei n, GLuint* buffers); typedef void (GLAPIENTRY* PFNGLNAMEDBUFFERSTORAGEPROC)(GLuint buffer, GLsizeiptr size, const void* data, GLbitfield flags); typedef void (GLAPIENTRY* PFNGLNAMEDBUFFERSUBDATAPROC)(GLuint buffer, GLintptr offset, GLsizeiptr size, const void* data); typedef void* (GLAPIENTRY* PFNGLMAPNAMEDBUFFERPROC)(GLuint buffer, GLenum access); +typedef void* (GLAPIENTRY* PFNGLMAPNAMEDBUFFERRANGEPROC)(GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); typedef GLboolean (GLAPIENTRY* PFNGLUNMAPNAMEDBUFFERPROC)(GLuint buffer); typedef void (GLAPIENTRY* PFNGLTEXTURESUBIMAGE2DPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels); @@ -2463,6 +2464,7 @@ static PFNGLCREATEBUFFERSPROC _glCreateBuffers = 0; static PFNGLNAMEDBUFFERSTORAGEPROC _glNamedBufferStorage = 0; static PFNGLNAMEDBUFFERSUBDATAPROC _glNamedBufferSubData = 0; static PFNGLMAPNAMEDBUFFERPROC _glMapNamedBuffer = 0; +static PFNGLMAPNAMEDBUFFERRANGEPROC _glMapNamedBufferRange = 0; static PFNGLUNMAPNAMEDBUFFERPROC _glUnmapNamedBuffer = 0; static PFNGLTEXTURESUBIMAGE2DPROC _glTextureSubImage2D = 0; @@ -2537,6 +2539,12 @@ void* GLAPIENTRY glMapNamedBuffer(GLuint buffer, GLenum access) { return _glMapNamedBuffer(buffer, access); } +void* GLAPIENTRY glMapNamedBufferRange(GLuint buffer, GLintptr offset, GLsizeiptr length, GLenum access) { + if (!_glMapNamedBufferRange) + _glMapNamedBufferRange = (PFNGLMAPNAMEDBUFFERRANGEPROC)wglGetProcAddressDLL("glMapNamedBufferRange"); + return _glMapNamedBufferRange(buffer, offset, length, access); +} + GLboolean GLAPIENTRY glUnmapNamedBuffer(GLuint buffer) { if (!_glUnmapNamedBuffer) _glUnmapNamedBuffer = (PFNGLUNMAPNAMEDBUFFERPROC)wglGetProcAddressDLL("glUnmapNamedBuffer"); diff --git a/src/DivaGL/wrap.hpp b/src/DivaGL/wrap.hpp index 5990440..1de0fe5 100644 --- a/src/DivaGL/wrap.hpp +++ b/src/DivaGL/wrap.hpp @@ -3420,6 +3420,7 @@ extern void GLAPIENTRY glCreateBuffers(GLsizei n, GLuint* buffers); extern void GLAPIENTRY glNamedBufferStorage(GLuint buffer, GLsizeiptr size, const void* data, GLbitfield flags); extern void GLAPIENTRY glNamedBufferSubData(GLuint buffer, GLintptr offset, GLsizeiptr size, const void* data); extern void* GLAPIENTRY glMapNamedBuffer(GLuint buffer, GLenum access); +extern void* GLAPIENTRY glMapNamedBufferRange(GLuint buffer, GLintptr offset, GLsizeiptr length, GLenum access); extern GLboolean GLAPIENTRY glUnmapNamedBuffer(GLuint buffer); extern void GLAPIENTRY glTextureSubImage2D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels);