diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2015-12-08 12:25:38 +0100 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2016-01-13 14:02:44 +0000 |
commit | 8a8746f7011ce6a831df715120cbd54a3938e2a4 (patch) | |
tree | 2a7f36758089970d046f1239c430e0a3d46145b2 /src/render/io | |
parent | 45e8d67176b37c56c0403590a5f721e980101148 (diff) |
GLBuffer: modified to be used as a generic GL buffer
Change-Id: I6e3b763864587ac4b12f6a458f84d3642f20b32c
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Diffstat (limited to 'src/render/io')
-rw-r--r-- | src/render/io/glbuffer.cpp | 42 | ||||
-rw-r--r-- | src/render/io/glbuffer_p.h | 13 |
2 files changed, 48 insertions, 7 deletions
diff --git a/src/render/io/glbuffer.cpp b/src/render/io/glbuffer.cpp index 763b21d15..bff4cb3e4 100644 --- a/src/render/io/glbuffer.cpp +++ b/src/render/io/glbuffer.cpp @@ -40,6 +40,21 @@ #if !defined(GL_UNIFORM_BUFFER) #define GL_UNIFORM_BUFFER 0x8A11 #endif +#if !defined(GL_ARRAY_BUFFER) +#define GL_ARRAY_BUFFER 0x8892 +#endif +#if !defined(GL_ELEMENT_ARRAY_BUFFER) +#define GL_ELEMENT_ARRAY_BUFFER 0x8893 +#endif +#if !defined(GL_SHADER_STORAGE_BUFFER) +#define GL_SHADER_STORAGE_BUFFER 0x90D2 +#endif +#if !defined(GL_PIXEL_PACK_BUFFER) +#define GL_PIXEL_PACK_BUFFER 0x88EB +#endif +#if !defined(GL_PIXEL_UNPACK_BUFFER) +#define GL_PIXEL_UNPACK_BUFFER 0x88EC +#endif QT_BEGIN_NAMESPACE @@ -50,23 +65,38 @@ namespace Render { // A UBO is created for each ShaderData Shader Pair // That means a UBO is unique to a shader/shaderdata +namespace { + +GLenum glBufferTypes[] = { + GL_ARRAY_BUFFER, + GL_UNIFORM_BUFFER, + GL_ELEMENT_ARRAY_BUFFER, + GL_SHADER_STORAGE_BUFFER, + GL_PIXEL_PACK_BUFFER, + GL_PIXEL_UNPACK_BUFFER +}; + +} // anonymous + GLBuffer::GLBuffer() : m_bufferId(~0) , m_isCreated(false) , m_bound(false) + , m_lastTarget(GL_ARRAY_BUFFER) { } -void GLBuffer::bind(GraphicsContext *ctx) +void GLBuffer::bind(GraphicsContext *ctx, Type t) { - ctx->openGLContext()->functions()->glBindBuffer(GL_UNIFORM_BUFFER, m_bufferId); + m_lastTarget = glBufferTypes[t]; + ctx->openGLContext()->functions()->glBindBuffer(m_lastTarget, m_bufferId); m_bound = true; } void GLBuffer::release(GraphicsContext *ctx) { m_bound = false; - ctx->openGLContext()->functions()->glBindBuffer(GL_UNIFORM_BUFFER, 0); + ctx->openGLContext()->functions()->glBindBuffer(m_lastTarget, 0); } void GLBuffer::create(GraphicsContext *ctx) @@ -85,17 +115,17 @@ void GLBuffer::allocate(GraphicsContext *ctx, uint size, bool dynamic) { // Either GL_STATIC_DRAW OR GL_DYNAMIC_DRAW depending on the use case // TO DO: find a way to know how a buffer/QShaderData will be used to use the right usage - ctx->openGLContext()->functions()->glBufferData(GL_UNIFORM_BUFFER, size, NULL, dynamic ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW); + ctx->openGLContext()->functions()->glBufferData(m_lastTarget, size, NULL, dynamic ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW); } void GLBuffer::update(GraphicsContext *ctx, const void *data, uint size, int offset) { - ctx->openGLContext()->functions()->glBufferSubData(GL_UNIFORM_BUFFER, offset, size, data); + ctx->openGLContext()->functions()->glBufferSubData(m_lastTarget, offset, size, data); } void GLBuffer::bindToUniformBlock(GraphicsContext *ctx, int bindingPoint) { - ctx->bindBufferBase(GL_UNIFORM_BUFFER, bindingPoint, m_bufferId); + ctx->bindBufferBase(m_lastTarget, bindingPoint, m_bufferId); } } // namespace Render diff --git a/src/render/io/glbuffer_p.h b/src/render/io/glbuffer_p.h index ca4798806..b89c9f7e0 100644 --- a/src/render/io/glbuffer_p.h +++ b/src/render/io/glbuffer_p.h @@ -66,7 +66,17 @@ class GLBuffer public: GLBuffer(); - void bind(GraphicsContext *ctx); + enum Type + { + ArrayBuffer = 0, + UniformBuffer, + IndexBuffer, + ShaderStorageBuffer, + PixelPackBuffer, + PixelUnpackBuffer + }; + + void bind(GraphicsContext *ctx, Type t); void release(GraphicsContext *ctx); void create(GraphicsContext *ctx); void destroy(GraphicsContext *ctx); @@ -82,6 +92,7 @@ private: GLuint m_bufferId; bool m_isCreated; bool m_bound; + GLenum m_lastTarget; }; } // namespace Render |