140 lines
3.8 KiB
C++
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;
|
|
}
|