aurora-rendering-engine/include/resource/buffer.h

91 lines
2.1 KiB
C++

#ifndef ARE_INCLUDE_RESOURCE_BUFFER_H
#define ARE_INCLUDE_RESOURCE_BUFFER_H
#include "basic/types.h"
namespace are {
/// @brief Buffer usage hint
enum class BufferUsage {
STATIC_DRAW,
DYNAMIC_DRAW,
STREAM_DRAW
};
/// @brief Buffer type
enum class BufferType {
VERTEX_BUFFER,
INDEX_BUFFER,
UNIFORM_BUFFER,
SHADER_STORAGE_BUFFER
};
/// @brief GPU buffer resource
class Buffer {
public:
/// @brief Constructor
Buffer();
Buffer(const Buffer&) = delete;
Buffer& operator=(const Buffer&) = delete;
Buffer(Buffer&& other) noexcept;
Buffer& operator=(Buffer&& other) noexcept;
/// @brief Destructor
~Buffer();
/// @brief Create buffer
/// @param type Buffer type
/// @param size Buffer size in bytes
/// @param data Initial data (nullptr for empty buffer)
/// @param usage Usage hint
/// @return True if creation succeeded
bool create(BufferType type, size_t size, const void* data, BufferUsage usage);
/// @brief Update buffer data
/// @param offset Offset in bytes
/// @param size Size in bytes
/// @param data Data to upload
void update(size_t offset, size_t size, const void* data);
/// @brief Bind buffer
void bind() const;
/// @brief Bind buffer to binding point (for UBO/SSBO)
/// @param binding_point Binding point index
void bind_base(uint binding_point) const;
/// @brief Unbind buffer
void unbind() const;
/// @brief Release buffer resources
void release();
/// @brief Get buffer handle
/// @return Buffer handle
BufferHandle get_handle() const { return handle_; }
/// @brief Get buffer size
/// @return Size in bytes
size_t get_size() const { return size_; }
/// @brief Get buffer type
/// @return Buffer type
BufferType get_type() const { return type_; }
/// @brief Check if buffer is valid
/// @return True if valid
bool is_valid() const { return handle_ != INVALID_HANDLE; }
private:
BufferHandle handle_;
BufferType type_;
size_t size_;
BufferUsage usage_;
};
} // namespace are
#endif // ARE_INCLUDE_RESOURCE_BUFFER_H