113 lines
1.9 KiB
C++
113 lines
1.9 KiB
C++
#ifndef ARE_INCLUDE_RESOURCE_BUFFER_H
|
|
#define ARE_INCLUDE_RESOURCE_BUFFER_H
|
|
|
|
#include "basic/types.h"
|
|
|
|
namespace are {
|
|
|
|
// Buffer usage hint
|
|
enum class BufferUsage {
|
|
STATIC_DRAW,
|
|
DYNAMIC_DRAW,
|
|
STREAM_DRAW
|
|
};
|
|
|
|
// Buffer type
|
|
enum class BufferType {
|
|
VERTEX_BUFFER,
|
|
INDEX_BUFFER,
|
|
UNIFORM_BUFFER,
|
|
SHADER_STORAGE_BUFFER
|
|
};
|
|
|
|
// GPU buffer resource
|
|
class Buffer {
|
|
public:
|
|
// Constructor
|
|
Buffer();
|
|
|
|
Buffer(const Buffer &) = delete;
|
|
Buffer &operator=(const Buffer &) = delete;
|
|
|
|
Buffer(Buffer &&other) noexcept;
|
|
Buffer &operator=(Buffer &&other) noexcept;
|
|
|
|
// 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);
|
|
|
|
// 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;
|
|
|
|
// Unbind buffer
|
|
void unbind() const;
|
|
|
|
// 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
|