#include "HydraMaterialBufferManager.h" #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" 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); } HydraTaskScheduler *task_scheduler = GetEngine()->TaskScheduler(); HydraID create_gpu_buffer_task_id = task_scheduler->CreateTask(HydraThreadAffinity::Render); HydraCreateGPUBufferTask *task = static_cast(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(HydraThreadAffinity::Render); task = static_cast(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); } void HydraMaterialBufferManager::Shutdown() { HydraTaskScheduler *task_scheduler = GetEngine()->TaskScheduler(); HydraID delete_gpu_buffer_task_id = task_scheduler->CreateTask(HydraThreadAffinity::Render); HydraDeleteGPUBufferTask *task = static_cast(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(HydraThreadAffinity::Render); task = static_cast(task_scheduler->GetTask(delete_gpu_buffer_task_id)); task->Intialise(m_texture_buffer_id); task_scheduler->WaitForTask(delete_gpu_buffer_task_id); } HydraID HydraMaterialBufferManager::CreateMaterial(const HydraMaterialBuffer &material) { std::lock_guard 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; } void HydraMaterialBufferManager::DeleteMaterial(HydraID material_id) { std::lock_guard lock(m_mutex); if(material_id < MAX_MATERIALS) { m_material[material_id] = {}; m_available_material_ids.push(material_id); } } void *HydraMaterialBufferManager::GetMaterialBuffer() { return &m_material[0]; } void HydraMaterialBufferManager::UpdateBuffer() { void* buffer = GetEngine()->MaterialBufferManager()->GetMaterialBuffer(); HydraTaskScheduler *task_scheduler = GetEngine()->TaskScheduler(); HydraID update_buffer_task_id = task_scheduler->CreateTask(HydraThreadAffinity::Render); HydraUpdateWholeGPUBufferTask *task = static_cast(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(HydraThreadAffinity::Render); task = static_cast(task_scheduler->GetTask(update_buffer_task_id)); task->Intialise(m_texture_buffer_id, buffer); task_scheduler->WaitForTask(update_buffer_task_id); }