summaryrefslogtreecommitdiff
path: root/source/modules/asura-core/graphics/gpu_buffer.cpp
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2019-04-10 09:03:57 +0800
committerchai <chaifix@163.com>2019-04-10 09:03:57 +0800
commitb5b43bac50ad58949e70bcd1a34b1e6c4765fd51 (patch)
tree32e8655bf48ca059d818501c8d95fc92ae97b318 /source/modules/asura-core/graphics/gpu_buffer.cpp
parent200f710983fd54b23437cb78d5a03c90b5a47523 (diff)
*misc
Diffstat (limited to 'source/modules/asura-core/graphics/gpu_buffer.cpp')
-rw-r--r--source/modules/asura-core/graphics/gpu_buffer.cpp76
1 files changed, 57 insertions, 19 deletions
diff --git a/source/modules/asura-core/graphics/gpu_buffer.cpp b/source/modules/asura-core/graphics/gpu_buffer.cpp
index 6e6aead..aecfa51 100644
--- a/source/modules/asura-core/graphics/gpu_buffer.cpp
+++ b/source/modules/asura-core/graphics/gpu_buffer.cpp
@@ -5,7 +5,7 @@ namespace AsuraEngine
namespace Graphics
{
- GPUBuffer::GPUBuffer(BufferType type, BufferUsage usage, size_t size)
+ GPUBuffer::GPUBuffer(BufferType type, BufferUsage usage, BufferDataType dataType, size_t size)
: mTarget(GL_ZERO)
, mBuffer(GL_ZERO)
, mSize(0)
@@ -13,37 +13,56 @@ namespace AsuraEngine
, mData(nullptr)
#endif
{
+ mTarget = ConvertBufferType(type);
+ mUsage = ConvertBufferUsage(usage);
+ mDataType = ConvertBufferDataType(dataType);
+ mSize = size;
+ }
+
+ GPUBuffer::~GPUBuffer()
+ {
+#if ASURA_DEBUG
+ if (mData)
+ free(mData);
+#endif
+ glDeleteBuffers(1, &mBuffer);
+ }
+
+ GLenum GPUBuffer::ConvertBufferType(BufferType type)
+ {
switch (type)
{
case BUFFER_TYPE_VERTEX:
- mTarget = GL_ARRAY_BUFFER;
- break;
+ return GL_ARRAY_BUFFER;
case BUFFER_TYPE_INDEX:
- mTarget = GL_ELEMENT_ARRAY_BUFFER;
- break;
+ return GL_ELEMENT_ARRAY_BUFFER;
}
+ }
+
+ GLenum GPUBuffer::ConvertBufferUsage(BufferUsage usage)
+ {
switch (usage)
{
case BUFFER_USAGE_STREAM:
- mUsage = GL_STREAM_DRAW;
- break;
+ return GL_STREAM_DRAW;
case BUFFER_USAGE_DYNAMIC:
- mUsage = GL_DYNAMIC_DRAW;
- break;
+ return GL_DYNAMIC_DRAW;
case BUFFER_USAGE_STATIC:
- mUsage = GL_STATIC_DRAW;
- break;
+ return GL_STATIC_DRAW;
}
- mSize = size;
}
- GPUBuffer::~GPUBuffer()
+ GLenum GPUBuffer::ConvertBufferDataType(BufferDataType type)
{
-#if ASURA_DEBUG
- if (mData)
- free(mData);
-#endif
- glDeleteBuffers(1, &mBuffer);
+ switch (type)
+ {
+ case BUFFER_DATA_TYPE_INT:
+ return GL_INT;
+ case BUFFER_DATA_TYPE_FLOAT:
+ return GL_FLOAT;
+ case BUFFER_DATA_TYPE_UNSIGNED_BYTE:
+ return GL_UNSIGNED_BYTE;
+ }
}
bool GPUBuffer::Fill(const void * data, size_t size, uint offset)
@@ -58,7 +77,7 @@ namespace AsuraEngine
if (mBuffer == 0)
throw Exception("OpenGL glGenBuffers failed.");
glBindBuffer(mTarget, mBuffer);
- glBufferData(mTarget, mSize, NULL, mUsage); // ʼСΪsizeĻ
+ glBufferData(mTarget, mSize, NULL, mUsage); // ʼСΪsizeĻ壬usageŵӦԴ
if (gl.HasError())
{
glBindBuffer(mTarget, 0);
@@ -100,5 +119,24 @@ namespace AsuraEngine
return mSize;
}
+ GLenum GPUBuffer::GetDataType()
+ {
+ return mDataType;
+ }
+
+ size_t GPUBuffer::GetDataTypeSize()
+ {
+ //https://blog.csdn.net/nklinux/article/details/16919017
+ switch (mDataType)
+ {
+ case GL_UNSIGNED_BYTE:
+ return sizeof(GLbyte);
+ case GL_FLOAT :
+ return sizeof(GLfloat);
+ case GL_INT:
+ return sizeof(GLint);
+ }
+ }
+
}
} \ No newline at end of file