Extra2D/Extra2D/include/extra2d/render/backends/opengl/gl_rhi_buffer.h

178 lines
6.2 KiB
C++

#pragma once
#include <extra2d/render/rhi/rhi_buffer.h>
#include <glad/glad.h>
#include <string>
namespace extra2d {
namespace rhi {
/**
* @brief OpenGL 缓冲区实现
*
* 使用 OpenGL 4.5 DSA (Direct State Access) 特性
*/
class GLRHIBuffer : public RHIBuffer {
public:
/**
* @brief 构造函数
*/
GLRHIBuffer();
/**
* @brief 析构函数
*/
~GLRHIBuffer() override;
/**
* @brief 初始化缓冲区
* @param desc 缓冲区描述
* @return 成功返回 true
*/
bool init(const BufferDesc& desc);
/**
* @brief 释放资源
*/
void shutdown();
// RHIBuffer 接口实现
BufferType getType() const override { return type_; }
size_t getSize() const override { return size_; }
BufferUsage getUsage() const override { return usage_; }
void setData(const void* data, size_t size, size_t offset = 0) override;
void getData(void* data, size_t size, size_t offset = 0) const override;
void* map(size_t offset, size_t size, bool read = false, bool write = true) override;
void unmap() override;
bool isValid() const override { return bufferID_ != 0; }
uintptr_t getNativeHandle() const override { return static_cast<uintptr_t>(bufferID_); }
const std::string& getDebugName() const override { return debugName_; }
void setDebugName(const std::string& name) override { debugName_ = name; }
/**
* @brief 获取 OpenGL 缓冲区 ID
*/
GLuint getBufferID() const { return bufferID_; }
/**
* @brief 获取 OpenGL 目标类型
*/
GLenum getTarget() const { return target_; }
/**
* @brief 绑定到指定绑定点
*/
void bindBase(uint32_t index);
private:
GLuint bufferID_ = 0;
GLenum target_ = GL_ARRAY_BUFFER;
size_t size_ = 0;
BufferType type_ = BufferType::Vertex;
BufferUsage usage_ = BufferUsage::Static;
std::string debugName_;
bool mapped_ = false;
void* mappedPtr_ = nullptr;
/**
* @brief 转换缓冲区类型到 OpenGL 目标
*/
static GLenum convertType(BufferType type);
/**
* @brief 转换使用方式到 OpenGL 枚举
*/
static GLenum convertUsage(BufferUsage usage);
};
/**
* @brief OpenGL 顶点缓冲区实现
*/
class GLRHIVertexBuffer : public RHIVertexBuffer {
public:
GLRHIVertexBuffer() = default;
~GLRHIVertexBuffer() override = default;
bool init(size_t size, BufferUsage usage, const void* data = nullptr);
void shutdown();
BufferType getType() const override { return BufferType::Vertex; }
size_t getSize() const override { return buffer_.getSize(); }
BufferUsage getUsage() const override { return buffer_.getUsage(); }
void setData(const void* data, size_t size, size_t offset = 0) override { buffer_.setData(data, size, offset); }
void getData(void* data, size_t size, size_t offset = 0) const override { buffer_.getData(data, size, offset); }
void* map(size_t offset, size_t size, bool read = false, bool write = true) override { return buffer_.map(offset, size, read, write); }
void unmap() override { buffer_.unmap(); }
bool isValid() const override { return buffer_.isValid(); }
uintptr_t getNativeHandle() const override { return buffer_.getNativeHandle(); }
const std::string& getDebugName() const override { return buffer_.getDebugName(); }
void setDebugName(const std::string& name) override { buffer_.setDebugName(name); }
GLuint getBufferID() const { return buffer_.getBufferID(); }
private:
GLRHIBuffer buffer_;
};
/**
* @brief OpenGL 索引缓冲区实现
*/
class GLRHIIndexBuffer : public RHIIndexBuffer {
public:
GLRHIIndexBuffer() = default;
~GLRHIIndexBuffer() override = default;
bool init(size_t size, BufferUsage usage, const void* data = nullptr);
void shutdown();
BufferType getType() const override { return BufferType::Index; }
size_t getSize() const override { return buffer_.getSize(); }
BufferUsage getUsage() const override { return buffer_.getUsage(); }
void setData(const void* data, size_t size, size_t offset = 0) override { buffer_.setData(data, size, offset); }
void getData(void* data, size_t size, size_t offset = 0) const override { buffer_.getData(data, size, offset); }
void* map(size_t offset, size_t size, bool read = false, bool write = true) override { return buffer_.map(offset, size, read, write); }
void unmap() override { buffer_.unmap(); }
bool isValid() const override { return buffer_.isValid(); }
uintptr_t getNativeHandle() const override { return buffer_.getNativeHandle(); }
const std::string& getDebugName() const override { return buffer_.getDebugName(); }
void setDebugName(const std::string& name) override { buffer_.setDebugName(name); }
GLuint getBufferID() const { return buffer_.getBufferID(); }
private:
GLRHIBuffer buffer_;
};
/**
* @brief OpenGL Uniform 缓冲区实现
*/
class GLRHIUniformBuffer : public RHIUniformBuffer {
public:
GLRHIUniformBuffer() = default;
~GLRHIUniformBuffer() override = default;
bool init(size_t size, BufferUsage usage);
void shutdown();
BufferType getType() const override { return BufferType::Uniform; }
size_t getSize() const override { return buffer_.getSize(); }
BufferUsage getUsage() const override { return buffer_.getUsage(); }
void setData(const void* data, size_t size, size_t offset = 0) override { buffer_.setData(data, size, offset); }
void getData(void* data, size_t size, size_t offset = 0) const override { buffer_.getData(data, size, offset); }
void* map(size_t offset, size_t size, bool read = false, bool write = true) override { return buffer_.map(offset, size, read, write); }
void unmap() override { buffer_.unmap(); }
bool isValid() const override { return buffer_.isValid(); }
uintptr_t getNativeHandle() const override { return buffer_.getNativeHandle(); }
const std::string& getDebugName() const override { return buffer_.getDebugName(); }
void setDebugName(const std::string& name) override { buffer_.setDebugName(name); }
GLuint getBufferID() const { return buffer_.getBufferID(); }
void bindBase(uint32_t index) { buffer_.bindBase(index); }
private:
GLRHIBuffer buffer_;
};
} // namespace rhi
} // namespace extra2d