summaryrefslogtreecommitdiff
path: root/source/modules/asura-core/graphics/gpu_buffer.cpp
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2019-04-06 07:39:49 +0800
committerchai <chaifix@163.com>2019-04-06 07:39:49 +0800
commite47baca4f23db43ec91fbf64d5d06d7c0dbee495 (patch)
tree9e909413bbf61834570e7dbdbe37fc8705f12730 /source/modules/asura-core/graphics/gpu_buffer.cpp
parente13616b5c40f912853be99f0603f0e4c97b22062 (diff)
*misc
Diffstat (limited to 'source/modules/asura-core/graphics/gpu_buffer.cpp')
-rw-r--r--source/modules/asura-core/graphics/gpu_buffer.cpp94
1 files changed, 94 insertions, 0 deletions
diff --git a/source/modules/asura-core/graphics/gpu_buffer.cpp b/source/modules/asura-core/graphics/gpu_buffer.cpp
new file mode 100644
index 0000000..c796bb0
--- /dev/null
+++ b/source/modules/asura-core/graphics/gpu_buffer.cpp
@@ -0,0 +1,94 @@
+#include "gpu_buffer.h"
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ GPUBuffer::GPUBuffer(BufferType type, BufferUsage usage, size_t size)
+ : mTarget(GL_ZERO)
+ , mBuffer(GL_ZERO)
+ , mSize(0)
+#if ASURA_DEBUG
+ , mData(nullptr)
+#endif
+ {
+ switch (type)
+ {
+ case BUFFER_TYPE_VERTEX:
+ mTarget = GL_ARRAY_BUFFER;
+ break;
+ case BUFFER_TYPE_INDEX:
+ mTarget = GL_ELEMENT_ARRAY_BUFFER;
+ break;
+ }
+ switch (usage)
+ {
+ case BUFFER_USAGE_STREAM:
+ mUsage = GL_STREAM_DRAW;
+ break;
+ case BUFFER_USAGE_DYNAMIC:
+ mUsage = GL_DYNAMIC_DRAW;
+ break;
+ case BUFFER_USAGE_STATIC:
+ mUsage = GL_STATIC_DRAW;
+ break;
+ }
+ gl.WipeError();
+ glGenBuffers(1, &mBuffer);
+ if (mBuffer == 0)
+ throw Exception("OpenGL glGenBuffers failed.");
+ glBindBuffer(mTarget, mBuffer);
+ glBufferData(mTarget, size, NULL, mUsage); // ��ʼ����СΪsize�Ļ���
+ if (gl.HasError())
+ throw Exception("OpenGL glBufferData failed. Errorcode=%d.", gl.GetError());
+ glBindBuffer(mTarget, 0);
+#if ASURA_DEBUG
+ mData = (byte*)malloc(size);
+ memset(mData, 0, size);
+#endif
+ mSize = size;
+ }
+
+ GPUBuffer::~GPUBuffer()
+ {
+#if ASURA_DEBUG
+ if (mData)
+ free(mData);
+#endif
+ glDeleteBuffers(1, &mBuffer);
+ }
+
+ bool GPUBuffer::Fill(const void * data, size_t size, uint offset)
+ {
+ if (data == nullptr)
+ return false;
+ glBindBuffer(mTarget, mBuffer);
+ glBufferSubData(mTarget, offset, size, data);
+ if (gl.HasError())
+ throw Exception("OpenGL glBufferSubData failed. Errorcode=%d.", gl.GetError());
+ glBindBuffer(mTarget, 0);
+#if ASURA_DEBUG
+ // ����һ�ݣ�������
+ memcpy(mData + offset, data, size);
+#endif
+ return true;
+ }
+
+ void GPUBuffer::Bind()
+ {
+ glBindBuffer(mTarget, mBuffer);
+ }
+
+ void GPUBuffer::UnBind()
+ {
+ glBindBuffer(mTarget, 0);
+ }
+
+ uint GPUBuffer::GetBufferSize()
+ {
+ return mSize;
+ }
+
+ }
+} \ No newline at end of file