mirror of
https://github.com/Kbz-8/42_vox.git
synced 2026-01-11 14:43:34 +00:00
fixing render semaphore issue
This commit is contained in:
@@ -15,8 +15,6 @@
|
|||||||
|
|
||||||
namespace Scop
|
namespace Scop
|
||||||
{
|
{
|
||||||
constexpr std::uint32_t SEMAPHORE_COUNT = 4;
|
|
||||||
|
|
||||||
class Renderer
|
class Renderer
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -43,13 +41,12 @@ namespace Scop
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
Swapchain m_swapchain;
|
Swapchain m_swapchain;
|
||||||
std::array<VkSemaphore, SEMAPHORE_COUNT> m_image_available_semaphores;
|
std::vector<VkSemaphore> m_render_finished_semaphores;
|
||||||
std::array<VkSemaphore, SEMAPHORE_COUNT> m_render_finished_semaphores;
|
std::array<VkSemaphore, MAX_FRAMES_IN_FLIGHT> m_image_available_semaphores;
|
||||||
std::array<VkCommandBuffer, MAX_FRAMES_IN_FLIGHT> m_cmd_buffers;
|
std::array<VkCommandBuffer, MAX_FRAMES_IN_FLIGHT> m_cmd_buffers;
|
||||||
std::array<VkFence, MAX_FRAMES_IN_FLIGHT> m_cmd_fences;
|
std::array<VkFence, MAX_FRAMES_IN_FLIGHT> m_cmd_fences;
|
||||||
NonOwningPtr<Window> p_window;
|
NonOwningPtr<Window> p_window;
|
||||||
std::uint32_t m_current_frame_index = 0;
|
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_polygons_drawn = 0;
|
||||||
std::size_t m_drawcalls = 0;
|
std::size_t m_drawcalls = 0;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -16,13 +16,30 @@ namespace Scop
|
|||||||
|
|
||||||
void Renderer::Init(NonOwningPtr<Window> window)
|
void Renderer::Init(NonOwningPtr<Window> window)
|
||||||
{
|
{
|
||||||
|
std::function<void(const EventBase&)> 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;
|
p_window = window;
|
||||||
m_swapchain.Init(p_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());
|
m_render_finished_semaphores.push_back(kvfCreateSemaphore(RenderCore::Get().GetDevice()));
|
||||||
Message("Vulkan: image available semaphore created");
|
|
||||||
m_render_finished_semaphores[i] = kvfCreateSemaphore(RenderCore::Get().GetDevice());
|
|
||||||
Message("Vulkan: render finished semaphore created");
|
Message("Vulkan: render finished semaphore created");
|
||||||
}
|
}
|
||||||
for(std::size_t i = 0; i < MAX_FRAMES_IN_FLIGHT; i++)
|
for(std::size_t i = 0; i < MAX_FRAMES_IN_FLIGHT; i++)
|
||||||
@@ -31,13 +48,15 @@ namespace Scop
|
|||||||
Message("Vulkan: command buffer created");
|
Message("Vulkan: command buffer created");
|
||||||
m_cmd_fences[i] = kvfCreateFence(RenderCore::Get().GetDevice());
|
m_cmd_fences[i] = kvfCreateFence(RenderCore::Get().GetDevice());
|
||||||
Message("Vulkan: fence created");
|
Message("Vulkan: fence created");
|
||||||
|
m_image_available_semaphores[i] = kvfCreateSemaphore(RenderCore::Get().GetDevice());
|
||||||
|
Message("Vulkan: image available semaphore created");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Renderer::BeginFrame()
|
void Renderer::BeginFrame()
|
||||||
{
|
{
|
||||||
kvfWaitForFence(RenderCore::Get().GetDevice(), m_cmd_fences[m_current_frame_index]);
|
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);
|
RenderCore::Get().vkResetCommandBuffer(m_cmd_buffers[m_current_frame_index], 0);
|
||||||
kvfBeginCommandBuffer(m_cmd_buffers[m_current_frame_index], 0);
|
kvfBeginCommandBuffer(m_cmd_buffers[m_current_frame_index], 0);
|
||||||
m_drawcalls = 0;
|
m_drawcalls = 0;
|
||||||
@@ -49,24 +68,24 @@ namespace Scop
|
|||||||
{
|
{
|
||||||
VkPipelineStageFlags wait_stages[] = { VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT };
|
VkPipelineStageFlags wait_stages[] = { VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT };
|
||||||
kvfEndCommandBuffer(m_cmd_buffers[m_current_frame_index]);
|
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);
|
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_current_semaphore_index]);
|
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_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
|
void Renderer::Destroy() noexcept
|
||||||
{
|
{
|
||||||
RenderCore::Get().WaitDeviceIdle();
|
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]);
|
kvfDestroySemaphore(RenderCore::Get().GetDevice(), m_render_finished_semaphores[i]);
|
||||||
Message("Vulkan: render finished semaphore destroyed");
|
Message("Vulkan: render finished semaphore destroyed");
|
||||||
}
|
}
|
||||||
|
m_render_finished_semaphores.clear();
|
||||||
for(std::size_t i = 0; i < MAX_FRAMES_IN_FLIGHT; i++)
|
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]);
|
kvfDestroyCommandBuffer(RenderCore::Get().GetDevice(), m_cmd_buffers[i]);
|
||||||
Message("Vulkan: command buffer destroyed");
|
Message("Vulkan: command buffer destroyed");
|
||||||
kvfDestroyFence(RenderCore::Get().GetDevice(), m_cmd_fences[i]);
|
kvfDestroyFence(RenderCore::Get().GetDevice(), m_cmd_fences[i]);
|
||||||
|
|||||||
Reference in New Issue
Block a user