2026-03-16 17:22:45 +08:00
|
|
|
#include "XCEngine/RHI/OpenGL/OpenGLBuffer.h"
|
2026-03-25 19:01:36 +08:00
|
|
|
#include "XCEngine/RHI/OpenGL/OpenGLEnums.h"
|
2026-03-16 16:11:24 +08:00
|
|
|
#include <glad/glad.h>
|
|
|
|
|
|
|
|
|
|
namespace XCEngine {
|
|
|
|
|
namespace RHI {
|
|
|
|
|
|
|
|
|
|
OpenGLBuffer::OpenGLBuffer()
|
|
|
|
|
: m_buffer(0)
|
|
|
|
|
, m_size(0)
|
2026-03-17 02:08:49 +08:00
|
|
|
, m_isIndexBuffer(false)
|
|
|
|
|
, m_dynamic(false)
|
|
|
|
|
, m_type(OpenGLBufferType::Vertex) {
|
2026-03-16 16:11:24 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
OpenGLBuffer::~OpenGLBuffer() {
|
|
|
|
|
Shutdown();
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-17 02:08:49 +08:00
|
|
|
bool OpenGLBuffer::Initialize(OpenGLBufferType type, size_t size, const void* data, bool dynamic) {
|
|
|
|
|
m_type = type;
|
2026-03-16 16:11:24 +08:00
|
|
|
m_size = size;
|
2026-03-17 02:08:49 +08:00
|
|
|
m_dynamic = dynamic;
|
|
|
|
|
m_isIndexBuffer = (type == OpenGLBufferType::Index);
|
|
|
|
|
|
2026-03-25 19:01:36 +08:00
|
|
|
unsigned int target = ToOpenGL(type);
|
2026-03-17 02:08:49 +08:00
|
|
|
GLenum usage = dynamic ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW;
|
|
|
|
|
|
|
|
|
|
glGenBuffers(1, &m_buffer);
|
|
|
|
|
glBindBuffer(target, m_buffer);
|
|
|
|
|
glBufferData(target, size, data, usage);
|
|
|
|
|
glBindBuffer(target, 0);
|
|
|
|
|
|
2026-03-16 16:11:24 +08:00
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-17 02:08:49 +08:00
|
|
|
bool OpenGLBuffer::InitializeVertexBuffer(const void* data, size_t size) {
|
|
|
|
|
return Initialize(OpenGLBufferType::Vertex, size, data, false);
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-16 16:11:24 +08:00
|
|
|
bool OpenGLBuffer::InitializeIndexBuffer(const void* data, size_t size) {
|
2026-03-17 02:08:49 +08:00
|
|
|
return Initialize(OpenGLBufferType::Index, size, data, false);
|
2026-03-16 16:11:24 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void OpenGLBuffer::Shutdown() {
|
|
|
|
|
if (m_buffer) {
|
|
|
|
|
glDeleteBuffers(1, &m_buffer);
|
|
|
|
|
m_buffer = 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void OpenGLBuffer::Bind() const {
|
2026-03-25 19:01:36 +08:00
|
|
|
unsigned int target = ToOpenGL(m_type);
|
2026-03-17 02:08:49 +08:00
|
|
|
glBindBuffer(target, m_buffer);
|
2026-03-16 16:11:24 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void OpenGLBuffer::Unbind() const {
|
2026-03-25 19:01:36 +08:00
|
|
|
unsigned int target = ToOpenGL(m_type);
|
2026-03-17 02:08:49 +08:00
|
|
|
glBindBuffer(target, 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void OpenGLBuffer::BindBase(unsigned int target, unsigned int index) const {
|
|
|
|
|
glBindBufferBase(target, index, m_buffer);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void* OpenGLBuffer::Map() {
|
2026-03-25 19:01:36 +08:00
|
|
|
unsigned int target = ToOpenGL(m_type);
|
2026-03-17 02:08:49 +08:00
|
|
|
glBindBuffer(target, m_buffer);
|
|
|
|
|
void* ptr = glMapBuffer(target, GL_WRITE_ONLY);
|
|
|
|
|
glBindBuffer(target, 0);
|
|
|
|
|
return ptr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void OpenGLBuffer::Unmap() {
|
2026-03-25 19:01:36 +08:00
|
|
|
unsigned int target = ToOpenGL(m_type);
|
2026-03-17 02:08:49 +08:00
|
|
|
glBindBuffer(target, m_buffer);
|
|
|
|
|
glUnmapBuffer(target);
|
|
|
|
|
glBindBuffer(target, 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void OpenGLBuffer::SetData(const void* data, size_t size, size_t offset) {
|
2026-03-25 19:01:36 +08:00
|
|
|
unsigned int target = ToOpenGL(m_type);
|
2026-03-17 02:08:49 +08:00
|
|
|
glBindBuffer(target, m_buffer);
|
|
|
|
|
if (offset == 0 && size == m_size) {
|
|
|
|
|
glBufferData(target, size, data, m_dynamic ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW);
|
2026-03-16 16:11:24 +08:00
|
|
|
} else {
|
2026-03-17 02:08:49 +08:00
|
|
|
glBufferSubData(target, offset, size, data);
|
2026-03-16 16:11:24 +08:00
|
|
|
}
|
2026-03-17 02:08:49 +08:00
|
|
|
glBindBuffer(target, 0);
|
2026-03-16 16:11:24 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} // namespace RHI
|
|
|
|
|
} // namespace XCEngine
|