From b2837edc759838c68a032872ce4b64ac889112f0 Mon Sep 17 00:00:00 2001 From: AEspinosaDev Date: Wed, 20 Nov 2024 13:45:31 +0100 Subject: [PATCH] Fix: fixed bug in synchronization of TLAS and Scene Objects --- README.md | 5 +++-- include/engine/graphics/device.h | 8 ++++++-- src/core/resource_manager.cpp | 1 + src/graphics/device.cpp | 7 +++++-- src/systems/renderers/renderer.cpp | 9 ++++++--- 5 files changed, 21 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 0283013..ef9f1a0 100644 --- a/README.md +++ b/README.md @@ -30,8 +30,9 @@ The main feautures of the library are: - Forward and Deferred pipelines support. - PBR, Phong and other types of materials abstractions. - Scene and scene objects abstractions. -- Texture loading with mipmapping. - On the fly shader compiling. +- Raytracing Support (Shadows, AO). +- Texture loading with mipmapping. - Dynamic renderer states for some graphic features. - Multipass (depth pass for shadows, SSAO and post-processing). - Vulkan object and functionality abstraction. @@ -163,7 +164,7 @@ int main() // Create the renderer, you can play with the settings here Systems::RendererSettings settings{}; - settings.samplesMSAA = MSAASamples::MSAA_x4; + settings.samplesMSAA = MSAASamples::x4; settings.clearColor = Vec4(0.0, 0.0, 0.0, 1.0); Systems::BaseRenderer *renderer = new Systems::ForwardRenderer(window, settings, {}); diff --git a/include/engine/graphics/device.h b/include/engine/graphics/device.h index 6cafcc8..7b5086f 100644 --- a/include/engine/graphics/device.h +++ b/include/engine/graphics/device.h @@ -146,10 +146,14 @@ class Device DRAWING ----------------------------------------------- */ - /*Setups frame for new rendering cicle, waits for the last one to finish and starts the command buffer*/ - RenderResult prepare_frame(Frame& frame, uint32_t& imageIndex); + /*Waits for the frame to finish rendering*/ + RenderResult wait_frame(Frame& frame, uint32_t& imageIndex); + /*Resets conmmand and control objects and starts command buffer for new render cicle*/ + void start_frame(Frame& frame); /*Submits the frame to the graphic queue for presenting into the swapchain*/ RenderResult submit_frame(Frame& frame, uint32_t imageIndex); + + RenderResult aquire_present_image(Semaphore& waitSemahpore, uint32_t& imageIndex); RenderResult present_image(Semaphore& signalSemaphore, uint32_t imageIndex); /* diff --git a/src/core/resource_manager.cpp b/src/core/resource_manager.cpp index 6aec0ab..c463569 100644 --- a/src/core/resource_manager.cpp +++ b/src/core/resource_manager.cpp @@ -240,6 +240,7 @@ void ResourceManager::update_object_data(Graphics::Device* const device, //Update Acceleration Structure if change in objects if (accel->instances < BLASInstances.size()) { + device->wait(); accel->cleanup(); device->upload_TLAS(*accel, BLASInstances); } diff --git a/src/graphics/device.cpp b/src/graphics/device.cpp index 8fd461b..4b5033d 100644 --- a/src/graphics/device.cpp +++ b/src/graphics/device.cpp @@ -405,14 +405,17 @@ Frame Device::create_frame(uint16_t id) { return frame; } -RenderResult Device::prepare_frame(Frame& frame, uint32_t& imageIndex) { +RenderResult Device::wait_frame(Frame& frame, uint32_t& imageIndex) { frame.renderFence.wait(); RenderResult imageResult = aquire_present_image(frame.presentSemaphore, imageIndex); + + return imageResult; +} +void Device::start_frame(Frame& frame) { frame.renderFence.reset(); frame.commandBuffer.reset(); frame.commandBuffer.begin(); - return imageResult; } RenderResult Device::submit_frame(Frame& frame, uint32_t imageIndex) { diff --git a/src/systems/renderers/renderer.cpp b/src/systems/renderers/renderer.cpp index ecec290..9f8bcae 100644 --- a/src/systems/renderers/renderer.cpp +++ b/src/systems/renderers/renderer.cpp @@ -120,10 +120,9 @@ void BaseRenderer::render(Core::Scene* const scene) { if (!m_initialized) init(); - on_before_render(scene); - uint32_t imageIndex; - RenderResult result = m_device.prepare_frame(m_frames[m_currentFrame], imageIndex); + RenderResult result = m_device.wait_frame(m_frames[m_currentFrame], imageIndex); + if (result == RenderResult::ERROR_OUT_OF_DATE_KHR) { update_renderpasses(); @@ -131,6 +130,10 @@ void BaseRenderer::render(Core::Scene* const scene) { } else if (result != RenderResult::SUCCESS && result != RenderResult::SUBOPTIMAL_KHR) { throw VKFW_Exception("failed to acquire swap chain image!"); } + on_before_render(scene); + + m_device.start_frame(m_frames[m_currentFrame]); + if (scene->get_skybox()) Core::ResourceManager::generate_skybox_maps(&m_frames[m_currentFrame], scene);