diff options
Diffstat (limited to 'source/modules/asura-core/graphics/gpu_buffer.cpp')
-rw-r--r-- | source/modules/asura-core/graphics/gpu_buffer.cpp | 256 |
1 files changed, 127 insertions, 129 deletions
diff --git a/source/modules/asura-core/graphics/gpu_buffer.cpp b/source/modules/asura-core/graphics/gpu_buffer.cpp index 4d59009..bf5ac6a 100644 --- a/source/modules/asura-core/graphics/gpu_buffer.cpp +++ b/source/modules/asura-core/graphics/gpu_buffer.cpp @@ -1,153 +1,151 @@ #include "gpu_buffer.h" -namespace AsuraEngine -{ - namespace Graphics - { +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) +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) + , m_Data(nullptr) #endif - { - m_Target = ConvertBufferType(type); - m_Usage = ConvertBufferUsage(usage); - m_DataType = ConvertBufferDataType(dataType); - m_Size = size; - } +{ + m_Target = ConvertBufferType(type); + m_Usage = ConvertBufferUsage(usage); + m_DataType = ConvertBufferDataType(dataType); + m_Size = size; +} - GPUBuffer::~GPUBuffer() - { +GPUBuffer::~GPUBuffer() +{ #if ASURA_DEBUG - if (m_Data) - free(m_Data); + if (m_Data) + free(m_Data); #endif - glDeleteBuffers(1, &m_Buffer); - } + 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::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::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; - } - } +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) +bool GPUBuffer::Fill(const void * data, size_t size, uint offset) +{ + if (data == nullptr) + return false; + if (m_Buffer == 0) + { + gfx.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 (gfx.HasError()) { - if (data == nullptr) - return false; - if (m_Buffer == 0) - { - gfx.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 (gfx.HasError()) - { - glBindBuffer(m_Target, 0); - throw Exception("OpenGL glBufferData failed. Errorcode=%d.", gfx.GetError()); - } + glBindBuffer(m_Target, 0); + throw Exception("OpenGL glBufferData failed. Errorcode=%d.", gfx.GetError()); + } #if ASURA_DEBUG - m_Data = (byte*)malloc(size); - memset(m_Data, 0, size); + m_Data = (byte*)malloc(size); + memset(m_Data, 0, size); #endif - } - else - glBindBuffer(m_Target, m_Buffer); - glBufferSubData(m_Target, offset, size, data); - if (gfx.HasError()) - { - glBindBuffer(m_Target, 0); - throw Exception("OpenGL glBufferSubData failed. Errorcode=%d.", gfx.GetError()); - } - glBindBuffer(m_Target, 0); + } + else + glBindBuffer(m_Target, m_Buffer); + glBufferSubData(m_Target, offset, size, data); + if (gfx.HasError()) + { + glBindBuffer(m_Target, 0); + throw Exception("OpenGL glBufferSubData failed. Errorcode=%d.", gfx.GetError()); + } + glBindBuffer(m_Target, 0); #if ASURA_DEBUG - memcpy(m_Data + offset, data, size); + memcpy(m_Data + offset, data, size); #endif - return true; - } + return true; +} - void GPUBuffer::Bind() - { - glBindBuffer(m_Target, m_Buffer); - } +void GPUBuffer::Bind() +{ + glBindBuffer(m_Target, m_Buffer); +} - void GPUBuffer::UnBind() - { - glBindBuffer(m_Target, 0); - } - - uint GPUBuffer::GetBufferSize() - { - return m_Size; - } +void GPUBuffer::UnBind() +{ + glBindBuffer(m_Target, 0); +} - GLenum GPUBuffer::GetDataType() - { - return m_DataType; - } +uint GPUBuffer::GetBufferSize() +{ + return m_Size; +} - 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); - } - } +GLenum GPUBuffer::GetDataType() +{ + return m_DataType; +} - 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); - } - } +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); } -}
\ No newline at end of file +} + +namespace_end +namespace_end
\ No newline at end of file |