178 lines
6.2 KiB
C++
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
|