Files
HydraV3/HydraEngine/source/buffer/HydraBufferManager.cpp
T
2026-07-28 19:02:45 +01:00

140 lines
3.8 KiB
C++

#include "HydraBufferManager.h"
#include "../GlewIncludes.h"
#include "../mesh/StandardVertex.h"
void HydraBufferManager::Initialise()
{
m_buffers.resize(MAX_BUFFERS);
for(uint32_t i = 0; i < MAX_BUFFERS; i++)
{
m_available_buffer_ids.push(i);
}
}
void HydraBufferManager::Shutdown()
{
for(uint32_t i = 0; i < MAX_BUFFERS; i++)
{
if(m_buffers[i].buffer_id != INVALID_HYDRA_ID)
{
DeleteBuffer(m_buffers[i].buffer_id);
}
}
}
HydraID HydraBufferManager::CreateGPUBuffer(std::string buffer_name,
uint32_t buffer_size_bytes,
uint32_t binding,
HYDRA_BUFFER_TYPE buffer_type)
{
HydraID buffer_id = _GetBufferID();
HydraBuffer buffer = {};
buffer.buffer_id = buffer_id;
buffer.size_bytes = buffer_size_bytes;
buffer.buffer_name = buffer_name;
buffer.buffer_type = buffer_type;
uint32_t gl_buffer_type = _DecodeBufferType(buffer_type);
//Create the buffer
glCreateBuffers(1, &buffer.gpu_buffer_id);
glNamedBufferStorage(
buffer.gpu_buffer_id,
buffer_size_bytes,
NULL,
GL_DYNAMIC_STORAGE_BIT
);
glBindBufferBase(gl_buffer_type, binding, buffer.gpu_buffer_id);
m_buffers[buffer_id] = buffer;
return buffer_id;
}
void HydraBufferManager::DeleteBuffer(HydraID buffer_id)
{
std::lock_guard<std::mutex> lock(m_mutex);
if(buffer_id < MAX_BUFFERS)
{
if(m_buffers[buffer_id].buffer_id != INVALID_HYDRA_ID)
{
glDeleteBuffers(0, &m_buffers[buffer_id].gpu_buffer_id);
m_buffers[buffer_id].buffer_id = INVALID_HYDRA_ID;
m_available_buffer_ids.push(buffer_id);
}
}
}
void HydraBufferManager::UpdatePartialBuffer(HydraID buffer_id, uint32_t start, uint32_t size, void *data)
{
if(buffer_id >= MAX_BUFFERS)
{
return;
}
if(m_buffers[buffer_id].buffer_id == INVALID_HYDRA_ID)
{
return;
}
glNamedBufferSubData(m_buffers[buffer_id].gpu_buffer_id, start, size, data);
//glBindBuffer(GL_UNIFORM_BUFFER, m_buffers[buffer_id].gpu_buffer_id);
//glBufferSubData(GL_UNIFORM_BUFFER, 0, m_buffers[buffer_id].size_bytes, data);
}
void HydraBufferManager::UpdateWholeBuffer(HydraID buffer_id, void *data)
{
if(buffer_id >= MAX_BUFFERS)
{
return;
}
if(m_buffers[buffer_id].buffer_id == INVALID_HYDRA_ID)
{
return;
}
glNamedBufferSubData(m_buffers[buffer_id].gpu_buffer_id, 0, m_buffers[buffer_id].size_bytes, data);
//glBindBuffer(GL_UNIFORM_BUFFER, m_buffers[buffer_id].gpu_buffer_id);
//glBufferSubData(GL_UNIFORM_BUFFER, 0, m_buffers[buffer_id].size_bytes, data);
}
HydraID HydraBufferManager::FindBuffer(std::string buffer_name)
{
for(uint32_t buffer_idx = 0; buffer_idx < m_buffers.size(); buffer_idx++)
{
if(m_buffers[buffer_idx].buffer_name == buffer_name)
{
return buffer_idx;
}
}
return INVALID_HYDRA_ID;
}
const HydraBuffer &HydraBufferManager::GetBuffer(HydraID buffer_id)
{
return m_buffers[buffer_id];
}
HydraID HydraBufferManager::_GetBufferID()
{
HydraID buffer_id = INVALID_HYDRA_ID;
{
std::lock_guard<std::mutex> lock(m_mutex);
if(m_available_buffer_ids.size() == 0)
{
return INVALID_HYDRA_ID;
}
buffer_id = m_available_buffer_ids.front();
m_available_buffer_ids.pop();
}
return buffer_id;
}
uint32_t HydraBufferManager::_DecodeBufferType(HYDRA_BUFFER_TYPE buffer_type)
{
switch(buffer_type)
{
case HYDRA_BUFFER_TYPE::HYDRA_UBO_BUFFER:
return GL_UNIFORM_BUFFER;
case HYDRA_BUFFER_TYPE::HYDRA_SSBO_BUFFER:
return GL_SHADER_STORAGE_BUFFER;
}
return 0;
}