summaryrefslogtreecommitdiffstats
path: root/src/render/io
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2015-12-08 12:25:38 +0100
committerPaul Lemire <paul.lemire@kdab.com>2016-01-13 14:02:44 +0000
commit8a8746f7011ce6a831df715120cbd54a3938e2a4 (patch)
tree2a7f36758089970d046f1239c430e0a3d46145b2 /src/render/io
parent45e8d67176b37c56c0403590a5f721e980101148 (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.cpp42
-rw-r--r--src/render/io/glbuffer_p.h13
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