From 841a8703ced1031aab1996a6323c229ccc09760c Mon Sep 17 00:00:00 2001 From: Kbz-8 Date: Thu, 22 May 2025 15:58:42 +0200 Subject: [PATCH] fixing render semaphore issue --- .../Runtime/Includes/Renderer/Renderer.h | 7 +--- .../Runtime/Sources/Renderer/Renderer.cpp | 41 ++++++++++++++----- 2 files changed, 32 insertions(+), 16 deletions(-) diff --git a/ScopEngine/Runtime/Includes/Renderer/Renderer.h b/ScopEngine/Runtime/Includes/Renderer/Renderer.h index 1455c6c..883e8ca 100644 --- a/ScopEngine/Runtime/Includes/Renderer/Renderer.h +++ b/ScopEngine/Runtime/Includes/Renderer/Renderer.h @@ -15,8 +15,6 @@ namespace Scop { - constexpr std::uint32_t SEMAPHORE_COUNT = 4; - class Renderer { public: @@ -43,13 +41,12 @@ namespace Scop private: Swapchain m_swapchain; - std::array m_image_available_semaphores; - std::array m_render_finished_semaphores; + std::vector m_render_finished_semaphores; + std::array m_image_available_semaphores; std::array m_cmd_buffers; std::array m_cmd_fences; NonOwningPtr p_window; std::uint32_t m_current_frame_index = 0; - std::uint32_t m_current_semaphore_index = 0; std::size_t m_polygons_drawn = 0; std::size_t m_drawcalls = 0; }; diff --git a/ScopEngine/Runtime/Sources/Renderer/Renderer.cpp b/ScopEngine/Runtime/Sources/Renderer/Renderer.cpp index 96d3bf1..e5751b8 100644 --- a/ScopEngine/Runtime/Sources/Renderer/Renderer.cpp +++ b/ScopEngine/Runtime/Sources/Renderer/Renderer.cpp @@ -16,13 +16,30 @@ namespace Scop void Renderer::Init(NonOwningPtr window) { + std::function functor = [this](const EventBase& event) + { + if(event.What() == Event::ResizeEventCode) + { + for(std::size_t i = 0; i < m_render_finished_semaphores.size(); i++) + { + kvfDestroySemaphore(RenderCore::Get().GetDevice(), m_render_finished_semaphores[i]); + Message("Vulkan: render finished semaphore destroyed"); + } + m_render_finished_semaphores.clear(); + for(std::size_t i = 0; i < m_swapchain.GetImagesCount(); i++) + { + m_render_finished_semaphores.push_back(kvfCreateSemaphore(RenderCore::Get().GetDevice())); + Message("Vulkan: render finished semaphore created"); + } + } + }; + + EventBus::RegisterListener({ functor, "__ScopRenderer" }); p_window = window; m_swapchain.Init(p_window); - for(std::size_t i = 0; i < SEMAPHORE_COUNT; i++) + for(std::size_t i = 0; i < m_swapchain.GetImagesCount(); i++) { - m_image_available_semaphores[i] = kvfCreateSemaphore(RenderCore::Get().GetDevice()); - Message("Vulkan: image available semaphore created"); - m_render_finished_semaphores[i] = kvfCreateSemaphore(RenderCore::Get().GetDevice()); + m_render_finished_semaphores.push_back(kvfCreateSemaphore(RenderCore::Get().GetDevice())); Message("Vulkan: render finished semaphore created"); } for(std::size_t i = 0; i < MAX_FRAMES_IN_FLIGHT; i++) @@ -31,13 +48,15 @@ namespace Scop Message("Vulkan: command buffer created"); m_cmd_fences[i] = kvfCreateFence(RenderCore::Get().GetDevice()); Message("Vulkan: fence created"); + m_image_available_semaphores[i] = kvfCreateSemaphore(RenderCore::Get().GetDevice()); + Message("Vulkan: image available semaphore created"); } } void Renderer::BeginFrame() { kvfWaitForFence(RenderCore::Get().GetDevice(), m_cmd_fences[m_current_frame_index]); - m_swapchain.AquireFrame(m_image_available_semaphores[m_current_semaphore_index]); + m_swapchain.AquireFrame(m_image_available_semaphores[m_current_frame_index]); RenderCore::Get().vkResetCommandBuffer(m_cmd_buffers[m_current_frame_index], 0); kvfBeginCommandBuffer(m_cmd_buffers[m_current_frame_index], 0); m_drawcalls = 0; @@ -49,24 +68,24 @@ namespace Scop { VkPipelineStageFlags wait_stages[] = { VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT }; kvfEndCommandBuffer(m_cmd_buffers[m_current_frame_index]); - kvfSubmitCommandBuffer(RenderCore::Get().GetDevice(), m_cmd_buffers[m_current_frame_index], KVF_GRAPHICS_QUEUE, m_render_finished_semaphores[m_current_semaphore_index], m_image_available_semaphores[m_current_semaphore_index], m_cmd_fences[m_current_frame_index], wait_stages); - m_swapchain.Present(m_render_finished_semaphores[m_current_semaphore_index]); + kvfSubmitCommandBuffer(RenderCore::Get().GetDevice(), m_cmd_buffers[m_current_frame_index], KVF_GRAPHICS_QUEUE, m_render_finished_semaphores[m_swapchain.GetImageIndex()], m_image_available_semaphores[m_current_frame_index], m_cmd_fences[m_current_frame_index], wait_stages); + m_swapchain.Present(m_render_finished_semaphores[m_swapchain.GetImageIndex()]); m_current_frame_index = (m_current_frame_index + 1) % MAX_FRAMES_IN_FLIGHT; - m_current_semaphore_index = (m_current_semaphore_index + 1) % SEMAPHORE_COUNT; } void Renderer::Destroy() noexcept { RenderCore::Get().WaitDeviceIdle(); - for(std::size_t i = 0; i < SEMAPHORE_COUNT; i++) + for(std::size_t i = 0; i < m_render_finished_semaphores.size(); i++) { - kvfDestroySemaphore(RenderCore::Get().GetDevice(), m_image_available_semaphores[i]); - Message("Vulkan: image available semaphore destroyed"); kvfDestroySemaphore(RenderCore::Get().GetDevice(), m_render_finished_semaphores[i]); Message("Vulkan: render finished semaphore destroyed"); } + m_render_finished_semaphores.clear(); for(std::size_t i = 0; i < MAX_FRAMES_IN_FLIGHT; i++) { + kvfDestroySemaphore(RenderCore::Get().GetDevice(), m_image_available_semaphores[i]); + Message("Vulkan: image available semaphore destroyed"); kvfDestroyCommandBuffer(RenderCore::Get().GetDevice(), m_cmd_buffers[i]); Message("Vulkan: command buffer destroyed"); kvfDestroyFence(RenderCore::Get().GetDevice(), m_cmd_fences[i]);