diff --git a/modules/renderer/private/system.cpp b/modules/renderer/private/system.cpp index d00e7e9..a21afe8 100644 --- a/modules/renderer/private/system.cpp +++ b/modules/renderer/private/system.cpp @@ -74,6 +74,7 @@ System::System(CreateInfo info) : m_registry(std::move(info.registry)) , m_stats(info.system_stats) , m_context(create_scope(info.surface_entity)) + , m_surface_entity(info.surface_entity) { m_validation_observer = new vk::ValidationObserver(); // ensure(m_stats, "Failed to initialize system: null stats"); @@ -102,12 +103,22 @@ void System::on_unregister() void System::tick(app::TickInfo tick) { - if (!m_renderer->draw(m_frame_idx)) + for (const auto &event : m_surface_entity.get().peek_events()) + { + if (std::holds_alternative(event)) + { + m_context->recreate_swapchain(); + m_renderer->replace_swapchain(m_context->swapchain()); + m_pass->replace_swapchain(m_context->swapchain()); + } + } + + if (m_renderer->draw(m_frame_idx)) { m_context->recreate_swapchain(); m_renderer->replace_swapchain(m_context->swapchain()); m_pass->replace_swapchain(m_context->swapchain()); - m_renderer->draw(m_frame_idx); + m_renderer->draw(m_frame_idx); // don't drop the frame } m_frame_idx = (m_frame_idx + 1) % vk::Renderer::max_frames_in_flight; diff --git a/modules/renderer/private/vk/context/swapchain.cpp b/modules/renderer/private/vk/context/swapchain.cpp index 114a62d..549bf58 100644 --- a/modules/renderer/private/vk/context/swapchain.cpp +++ b/modules/renderer/private/vk/context/swapchain.cpp @@ -7,9 +7,7 @@ namespace lt::renderer::vk { -Swapchain::Swapchain(const Device &device, const Surface &surface) - : m_device(device.vk()) - , m_resolution(surface.get_framebuffer_size()) +Swapchain::Swapchain(const Device &device, const Surface &surface): m_device(device.vk()) { static auto idx = 0u; auto *physical_device = device.physical(); @@ -41,7 +39,7 @@ Swapchain::Swapchain(const Device &device, const Surface &surface) .minImageCount = get_optimal_image_count(capabilities, desired_swapchain_image_count), .imageFormat = surface_format.format, .imageColorSpace = surface_format.colorSpace, - .imageExtent = surface.get_framebuffer_size(), + .imageExtent = capabilities.currentExtent, .imageArrayLayers = 1u, .imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, .imageSharingMode = VK_SHARING_MODE_EXCLUSIVE, @@ -53,6 +51,7 @@ Swapchain::Swapchain(const Device &device, const Surface &surface) .clipped = VK_TRUE, .oldSwapchain = nullptr, }; + m_resolution = capabilities.currentExtent; vkc(vk_create_swapchain_khr(device.vk(), &create_info, nullptr, &m_swapchain)); vkc(vk_device_wait_idle(device.vk())); diff --git a/modules/renderer/private/vk/renderer/pass.hpp b/modules/renderer/private/vk/renderer/pass.hpp index 86018ed..7fea5c7 100644 --- a/modules/renderer/private/vk/renderer/pass.hpp +++ b/modules/renderer/private/vk/renderer/pass.hpp @@ -255,7 +255,6 @@ public: private: auto create_module(lt::assets::Blob blob) -> VkShaderModule { - log_dbg("BLOB SIZE: {}", blob.size()); auto info = VkShaderModuleCreateInfo { .sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO, .codeSize = blob.size(), diff --git a/modules/renderer/private/vk/renderer/renderer.hpp b/modules/renderer/private/vk/renderer/renderer.hpp index 61872e5..70ca0e1 100644 --- a/modules/renderer/private/vk/renderer/renderer.hpp +++ b/modules/renderer/private/vk/renderer/renderer.hpp @@ -85,7 +85,6 @@ public: } } - m_submit_semaphores.resize(context.swapchain().get_image_count()); for (auto idx = 0; auto &semaphore : m_submit_semaphores) { @@ -152,7 +151,7 @@ public: auto result = vk_acquire_next_image_khr( m_device, m_swapchain, - UINT64_MAX, + 1000000ul, aquire_semaphore, VK_NULL_HANDLE, &image_idx @@ -183,6 +182,7 @@ public: vkc(vk_queue_submit(m_graphics_queue, 1u, &submit_info, flight_fence)); + VkResult res; auto present_info = VkPresentInfoKHR { .sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR, .waitSemaphoreCount = 1u, @@ -190,7 +190,7 @@ public: .swapchainCount = 1u, .pSwapchains = &m_swapchain, .pImageIndices = &image_idx, - .pResults = nullptr, + .pResults = &res, }; vk_queue_present_khr(m_present_queue, &present_info); @@ -210,6 +210,68 @@ public: m_swapchain = swapchain.vk(); m_resolution = swapchain.get_resolution(); ensure(m_swapchain, "Failed to replace renderer's swapchain: null swapchain"); + + for (auto [semaphore, fence] : + std::views::zip(m_aquire_image_semaphores, m_in_flight_fences)) + { + vk_destroy_semaphore(m_device, semaphore, nullptr); + vk_destroy_fence(m_device, fence, nullptr); + } + + for (auto &semaphore : m_submit_semaphores) + { + vk_destroy_semaphore(m_device, semaphore, nullptr); + } + + auto semaphore_info = VkSemaphoreCreateInfo { + .sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, + }; + + auto fence_info = VkFenceCreateInfo { + .sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, + .flags = VK_FENCE_CREATE_SIGNALED_BIT, + }; + + for (auto idx : std::views::iota(0u, max_frames_in_flight)) + { + vkc(vk_create_semaphore( + m_device, + &semaphore_info, + nullptr, + &m_aquire_image_semaphores[idx] + )); + + vkc(vk_create_fence(m_device, &fence_info, nullptr, &m_in_flight_fences[idx])); + + set_object_name( + m_device, + m_aquire_image_semaphores[idx].get(), + "aquire semaphore {}", + idx + ); + + set_object_name(m_device, m_in_flight_fences[idx].get(), "frame fence {}", idx); + + { + const auto name = std::format("frame fence {}", idx); + auto debug_info = VkDebugUtilsObjectNameInfoEXT { + .sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT, + .objectType = VK_OBJECT_TYPE_FENCE, + .objectHandle = reinterpret_cast( + static_cast(m_in_flight_fences[idx].get()) + ), + .pObjectName = name.c_str(), + }; + vk_set_debug_object_name(m_device, &debug_info); + } + } + + m_submit_semaphores.resize(swapchain.get_image_count()); + for (auto idx = 0; auto &semaphore : m_submit_semaphores) + { + vkc(vk_create_semaphore(m_device, &semaphore_info, nullptr, &semaphore)); + set_object_name(m_device, semaphore.get(), "submit semaphore {}", idx++); + } } private: diff --git a/modules/renderer/public/system.hpp b/modules/renderer/public/system.hpp index 81cd493..ba7554d 100644 --- a/modules/renderer/public/system.hpp +++ b/modules/renderer/public/system.hpp @@ -59,6 +59,8 @@ private: Ref m_registry; + ecs::Entity m_surface_entity; + Ref m_stats; Scope m_context; @@ -67,7 +69,6 @@ private: Scope m_renderer; - app::TickResult m_last_tick_result {}; uint32_t m_frame_idx {}; diff --git a/modules/surface/CMakeLists.txt b/modules/surface/CMakeLists.txt index 6d4ef3c..3458ef8 100644 --- a/modules/surface/CMakeLists.txt +++ b/modules/surface/CMakeLists.txt @@ -15,6 +15,7 @@ target_link_libraries(surface PUBLIC PRIVATE logger lt_debug + time ) add_test_module(surface system.test.cpp) diff --git a/modules/surface/private/linux/system.cpp b/modules/surface/private/linux/system.cpp index 82dc9e5..98c48e3 100644 --- a/modules/surface/private/linux/system.cpp +++ b/modules/surface/private/linux/system.cpp @@ -2,6 +2,7 @@ #include #include #include +#include