2026-07-17 15:30:29 +01:00
|
|
|
#include "HydraMaterialBufferManager.h"
|
2026-08-28 16:36:25 +01:00
|
|
|
#include "../engine/HydraEngine.h"
|
|
|
|
|
#include "../ecs/HydraECS.h"
|
|
|
|
|
#include "../ecs/components/HydraMaterialComponent.h"
|
|
|
|
|
|
|
|
|
|
#include "../buffer/HydraMaterialBufferManager.h"
|
|
|
|
|
#include "../buffer/HydraTextureBufferManager.h"
|
|
|
|
|
|
|
|
|
|
#include "../scheduler/HydraTaskScheduler.h"
|
|
|
|
|
#include "../task/buffer/HydraCreateGPUBufferTask.hpp"
|
|
|
|
|
#include "../task/buffer/HydraDeleteGPUBufferTask.hpp"
|
|
|
|
|
#include "../task/buffer/HydraUpdateWholeGPUBufferTask.hpp"
|
|
|
|
|
#include "../actor/HydraActorManager.h"
|
2026-07-17 15:30:29 +01:00
|
|
|
|
|
|
|
|
void HydraMaterialBufferManager::Intialise()
|
|
|
|
|
{
|
|
|
|
|
m_material.resize(MAX_MATERIALS);
|
|
|
|
|
for(uint32_t mat_idx = 0; mat_idx < MAX_MATERIALS; mat_idx++)
|
|
|
|
|
{
|
|
|
|
|
m_available_material_ids.push(mat_idx);
|
|
|
|
|
}
|
2026-08-28 16:36:25 +01:00
|
|
|
|
|
|
|
|
HydraTaskScheduler *task_scheduler = GetEngine()->TaskScheduler();
|
|
|
|
|
|
|
|
|
|
HydraID create_gpu_buffer_task_id = task_scheduler->CreateTask<HydraCreateGPUBufferTask>(HydraThreadAffinity::Render);
|
|
|
|
|
HydraCreateGPUBufferTask *task = static_cast<HydraCreateGPUBufferTask *>(task_scheduler->GetTask(create_gpu_buffer_task_id));
|
|
|
|
|
task->Intialise("MaterialBuffer", 1, MAX_MATERIALS * sizeof(HydraMaterialBuffer), &m_material_buffer_id, HYDRA_BUFFER_TYPE::HYDRA_SSBO_BUFFER);
|
|
|
|
|
task_scheduler->WaitForTask(create_gpu_buffer_task_id);
|
|
|
|
|
|
|
|
|
|
create_gpu_buffer_task_id = task_scheduler->CreateTask<HydraCreateGPUBufferTask>(HydraThreadAffinity::Render);
|
|
|
|
|
task = static_cast<HydraCreateGPUBufferTask *>(task_scheduler->GetTask(create_gpu_buffer_task_id));
|
|
|
|
|
task->Intialise("TextureBuffer", 1, MAX_TEXTURES * sizeof(uint64_t), &m_texture_buffer_id, HYDRA_BUFFER_TYPE::HYDRA_SSBO_BUFFER);
|
|
|
|
|
task_scheduler->WaitForTask(create_gpu_buffer_task_id);
|
2026-07-17 15:30:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void HydraMaterialBufferManager::Shutdown()
|
|
|
|
|
{
|
2026-08-28 16:36:25 +01:00
|
|
|
HydraTaskScheduler *task_scheduler = GetEngine()->TaskScheduler();
|
|
|
|
|
|
|
|
|
|
HydraID delete_gpu_buffer_task_id = task_scheduler->CreateTask<HydraDeleteGPUBufferTask>(HydraThreadAffinity::Render);
|
|
|
|
|
HydraDeleteGPUBufferTask *task = static_cast<HydraDeleteGPUBufferTask *>(task_scheduler->GetTask(delete_gpu_buffer_task_id));
|
|
|
|
|
task->Intialise(m_material_buffer_id);
|
|
|
|
|
task_scheduler->WaitForTask(delete_gpu_buffer_task_id);
|
|
|
|
|
|
|
|
|
|
delete_gpu_buffer_task_id = task_scheduler->CreateTask<HydraDeleteGPUBufferTask>(HydraThreadAffinity::Render);
|
|
|
|
|
task = static_cast<HydraDeleteGPUBufferTask *>(task_scheduler->GetTask(delete_gpu_buffer_task_id));
|
|
|
|
|
task->Intialise(m_texture_buffer_id);
|
|
|
|
|
task_scheduler->WaitForTask(delete_gpu_buffer_task_id);
|
2026-07-17 15:30:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
HydraID HydraMaterialBufferManager::CreateMaterial(const HydraMaterialBuffer &material)
|
|
|
|
|
{
|
|
|
|
|
std::lock_guard<std::mutex> lock(m_mutex);
|
|
|
|
|
if(m_available_material_ids.size() == 0)
|
|
|
|
|
{
|
|
|
|
|
return INVALID_HYDRA_ID;
|
|
|
|
|
}
|
|
|
|
|
HydraID mat_id = m_available_material_ids.front();
|
|
|
|
|
m_available_material_ids.pop();
|
|
|
|
|
m_material[mat_id] = material;
|
|
|
|
|
return mat_id;
|
|
|
|
|
}
|
|
|
|
|
|
2026-08-28 16:36:25 +01:00
|
|
|
void HydraMaterialBufferManager::DeleteMaterial(HydraID material_id)
|
|
|
|
|
{
|
|
|
|
|
std::lock_guard<std::mutex> lock(m_mutex);
|
|
|
|
|
if(material_id < MAX_MATERIALS)
|
|
|
|
|
{
|
|
|
|
|
m_material[material_id] = {};
|
|
|
|
|
m_available_material_ids.push(material_id);
|
|
|
|
|
}
|
|
|
|
|
}
|
2026-07-17 15:30:29 +01:00
|
|
|
|
|
|
|
|
void *HydraMaterialBufferManager::GetMaterialBuffer()
|
|
|
|
|
{
|
|
|
|
|
return &m_material[0];
|
|
|
|
|
}
|
2026-08-28 16:36:25 +01:00
|
|
|
|
|
|
|
|
void HydraMaterialBufferManager::UpdateBuffer()
|
|
|
|
|
{
|
|
|
|
|
void* buffer = GetEngine()->MaterialBufferManager()->GetMaterialBuffer();
|
|
|
|
|
|
|
|
|
|
HydraTaskScheduler *task_scheduler = GetEngine()->TaskScheduler();
|
|
|
|
|
|
|
|
|
|
HydraID update_buffer_task_id = task_scheduler->CreateTask<HydraUpdateWholeGPUBufferTask>(HydraThreadAffinity::Render);
|
|
|
|
|
HydraUpdateWholeGPUBufferTask *task = static_cast<HydraUpdateWholeGPUBufferTask *>(task_scheduler->GetTask(update_buffer_task_id));
|
|
|
|
|
task->Intialise(m_material_buffer_id, buffer);
|
|
|
|
|
task_scheduler->WaitForTask(update_buffer_task_id);
|
|
|
|
|
|
|
|
|
|
buffer = GetEngine()->TextureBufferManager()->GetTextureBuffer();
|
|
|
|
|
update_buffer_task_id = task_scheduler->CreateTask<HydraUpdateWholeGPUBufferTask>(HydraThreadAffinity::Render);
|
|
|
|
|
task = static_cast<HydraUpdateWholeGPUBufferTask *>(task_scheduler->GetTask(update_buffer_task_id));
|
|
|
|
|
task->Intialise(m_texture_buffer_id, buffer);
|
|
|
|
|
task_scheduler->WaitForTask(update_buffer_task_id);
|
|
|
|
|
}
|