summaryrefslogtreecommitdiff
path: root/Source/modules/asura-core/Graphics/GPUBuffer.cpp
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2019-08-07 21:08:47 +0800
committerchai <chaifix@163.com>2019-08-07 21:08:47 +0800
commit0c391fdbce5a079cf03e483eb6174dd47806163d (patch)
treeb06cd7a9d0ae0d9bb9e82f3dcb786dfce11f8628 /Source/modules/asura-core/Graphics/GPUBuffer.cpp
parent9686368e58e25cbd6dc37d686bdd2be3f80486d6 (diff)
*misc
Diffstat (limited to 'Source/modules/asura-core/Graphics/GPUBuffer.cpp')
-rw-r--r--Source/modules/asura-core/Graphics/GPUBuffer.cpp151
1 files changed, 151 insertions, 0 deletions
diff --git a/Source/modules/asura-core/Graphics/GPUBuffer.cpp b/Source/modules/asura-core/Graphics/GPUBuffer.cpp
new file mode 100644
index 0000000..f28b914
--- /dev/null
+++ b/Source/modules/asura-core/Graphics/GPUBuffer.cpp
@@ -0,0 +1,151 @@
+#include "GPUBuffer.h"
+
+namespace_begin(AsuraEngine)
+namespace_begin(Graphics)
+
+GPUBuffer::GPUBuffer(BufferType type, BufferUsage usage, BufferDataType dataType, size_t size)
+ : m_Target(GL_ZERO)
+ , m_Buffer(GL_ZERO)
+ , m_Size(0)
+#if ASURA_DEBUG
+ , m_Data(nullptr)
+#endif
+{
+ m_Target = ConvertBufferType(type);
+ m_Usage = ConvertBufferUsage(usage);
+ m_DataType = ConvertBufferDataType(dataType);
+ m_Size = size;
+}
+
+GPUBuffer::~GPUBuffer()
+{
+#if ASURA_DEBUG
+ if (m_Data)
+ free(m_Data);
+#endif
+ glDeleteBuffers(1, &m_Buffer);
+}
+
+GLenum GPUBuffer::ConvertBufferType(BufferType type)
+{
+ switch (type)
+ {
+ case BUFFER_TYPE_VERTEX:
+ return GL_ARRAY_BUFFER;
+ case BUFFER_TYPE_INDEX:
+ return GL_ELEMENT_ARRAY_BUFFER;
+ }
+}
+
+GLenum GPUBuffer::ConvertBufferUsage(BufferUsage usage)
+{
+ switch (usage)
+ {
+ case BUFFER_USAGE_STREAM:
+ return GL_STREAM_DRAW;
+ case BUFFER_USAGE_DYNAMIC:
+ return GL_DYNAMIC_DRAW;
+ case BUFFER_USAGE_STATIC:
+ return GL_STATIC_DRAW;
+ }
+}
+
+GLenum GPUBuffer::ConvertBufferDataType(BufferDataType type)
+{
+ 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)
+{
+ if (data == nullptr)
+ return false;
+ if (m_Buffer == 0)
+ {
+ g_Device.WipeError();
+ glGenBuffers(1, &m_Buffer);
+ if (m_Buffer == 0)
+ throw Exception("OpenGL glGenBuffers failed.");
+ glBindBuffer(m_Target, m_Buffer);
+ glBufferData(m_Target, m_Size, NULL, m_Usage);
+ if (g_Device.HasError())
+ {
+ glBindBuffer(m_Target, 0);
+ throw Exception("OpenGL glBufferData failed. Errorcode=%d.", g_Device.GetError());
+ }
+#if ASURA_DEBUG
+ m_Data = (byte*)malloc(size);
+ memset(m_Data, 0, size);
+#endif
+ }
+ else
+ glBindBuffer(m_Target, m_Buffer);
+ glBufferSubData(m_Target, offset, size, data);
+ if (g_Device.HasError())
+ {
+ glBindBuffer(m_Target, 0);
+ throw Exception("OpenGL glBufferSubData failed. Errorcode=%d.", g_Device.GetError());
+ }
+ glBindBuffer(m_Target, 0);
+#if ASURA_DEBUG
+ memcpy(m_Data + offset, data, size);
+#endif
+ return true;
+}
+
+void GPUBuffer::Bind()
+{
+ glBindBuffer(m_Target, m_Buffer);
+}
+
+void GPUBuffer::UnBind()
+{
+ glBindBuffer(m_Target, 0);
+}
+
+uint GPUBuffer::GetBufferSize()
+{
+ return m_Size;
+}
+
+GLenum GPUBuffer::GetDataType()
+{
+ return m_DataType;
+}
+
+size_t GPUBuffer::GetDataTypeSize()
+{
+ //https://blog.csdn.net/nklinux/article/details/16919017
+ switch (m_DataType)
+ {
+ case GL_UNSIGNED_BYTE:
+ return sizeof(GLbyte);
+ case GL_FLOAT :
+ return sizeof(GLfloat);
+ case GL_INT:
+ return sizeof(GLint);
+ }
+}
+
+size_t GPUBuffer::GetDataTypeSize(GLenum datatype)
+{
+ switch (datatype)
+ {
+ case GL_UNSIGNED_BYTE:
+ return sizeof(GLbyte);
+ case GL_FLOAT:
+ return sizeof(GLfloat);
+ case GL_INT:
+ return sizeof(GLint);
+ }
+}
+
+namespace_end
+namespace_end \ No newline at end of file