From 1550076e0915478efc09e12e197ecd8785b268ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tur=C3=A1nszki=20J=C3=A1nos?= Date: Tue, 22 Apr 2025 07:50:51 +0200 Subject: [PATCH] vulkan fixes --- WickedEngine/wiGraphicsDevice_Vulkan.cpp | 40 ++++++++++++++++++------ WickedEngine/wiGraphicsDevice_Vulkan.h | 9 +++--- WickedEngine/wiVersion.cpp | 2 +- 3 files changed, 36 insertions(+), 15 deletions(-) diff --git a/WickedEngine/wiGraphicsDevice_Vulkan.cpp b/WickedEngine/wiGraphicsDevice_Vulkan.cpp index d729958b5..79c5de20c 100644 --- a/WickedEngine/wiGraphicsDevice_Vulkan.cpp +++ b/WickedEngine/wiGraphicsDevice_Vulkan.cpp @@ -1330,6 +1330,16 @@ using namespace vulkan_internal; vulkan_check(vkSetDebugUtilsObjectNameEXT(device, &info)); } + void GraphicsDevice_Vulkan::CommandQueue::clear() + { + swapchain_updates.clear(); + submit_swapchains.clear(); + submit_swapChainImageIndices.clear(); + submit_waitSemaphoreInfos.clear(); + submit_signalSemaphores.clear(); + submit_signalSemaphoreInfos.clear(); + submit_cmds.clear(); + } void GraphicsDevice_Vulkan::CommandQueue::signal(VkSemaphore semaphore) { if (queue == VK_NULL_HANDLE) @@ -3262,15 +3272,15 @@ using namespace vulkan_internal; barrier.image = nullImage1D; barrier.subresourceRange.layerCount = 1; - GetTransitionHandler().barriers.push_back(barrier); + init_transitions.push_back(barrier); barrier.image = nullImage2D; barrier.subresourceRange.layerCount = 6; - GetTransitionHandler().barriers.push_back(barrier); + init_transitions.push_back(barrier); barrier.image = nullImage3D; barrier.subresourceRange.layerCount = 1; - GetTransitionHandler().barriers.push_back(barrier); + init_transitions.push_back(barrier); } VkImageViewCreateInfo viewInfo = {}; @@ -4516,7 +4526,7 @@ using namespace vulkan_internal; barrier.srcAccessMask = VK_ACCESS_2_TRANSFER_WRITE_BIT; barrier.dstAccessMask = _ParseResourceState(texture->desc.layout); std::scoped_lock lck(transitionLocker); - GetTransitionHandler().barriers.push_back(barrier); + init_transitions.push_back(barrier); } } else if(texture->desc.layout != ResourceState::UNDEFINED && internal_state->resource != VK_NULL_HANDLE) @@ -4550,7 +4560,7 @@ using namespace vulkan_internal; barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; std::scoped_lock lck(transitionLocker); - GetTransitionHandler().barriers.push_back(barrier); + init_transitions.push_back(barrier); } if (!has_flag(desc->misc_flags, ResourceMiscFlag::NO_DEFAULT_DESCRIPTORS)) @@ -7090,9 +7100,9 @@ using namespace vulkan_internal; { // Submit resource initialization transitions: { - std::scoped_lock lck(transitionLocker); TransitionHandler& transition_handler = GetTransitionHandler(); - if (!transition_handler.barriers.empty()) + std::scoped_lock lck(transitionLocker); + if (!init_transitions.empty()) { if (transition_handler.commandBuffer == VK_NULL_HANDLE) { @@ -7124,8 +7134,8 @@ using namespace vulkan_internal; vulkan_check(vkBeginCommandBuffer(transition_handler.commandBuffer, &beginInfo)); VkDependencyInfo dependencyInfo = {}; dependencyInfo.sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO; - dependencyInfo.imageMemoryBarrierCount = (uint32_t)transition_handler.barriers.size(); - dependencyInfo.pImageMemoryBarriers = transition_handler.barriers.data(); + dependencyInfo.imageMemoryBarrierCount = (uint32_t)init_transitions.size(); + dependencyInfo.pImageMemoryBarriers = init_transitions.data(); vkCmdPipelineBarrier2(transition_handler.commandBuffer, &dependencyInfo); vulkan_check(vkEndCommandBuffer(transition_handler.commandBuffer)); CommandQueue& queue = queues[QUEUE_GRAPHICS]; @@ -7134,12 +7144,14 @@ using namespace vulkan_internal; cmd_submit.commandBuffer = transition_handler.commandBuffer; for (int q = QUEUE_GRAPHICS + 1; q < QUEUE_COUNT; ++q) { + if (queues[q].queue == VK_NULL_HANDLE) + continue; VkSemaphore sema = transition_handler.semaphores[q - 1]; queue.signal(sema); queues[q].wait(sema); } queue.submit(this, VK_NULL_HANDLE); - transition_handler.barriers.clear(); + init_transitions.clear(); } } @@ -7294,6 +7306,14 @@ using namespace vulkan_internal; } } + for (int q = 0; q < QUEUE_COUNT; ++q) + { + if (queues[q].queue == VK_NULL_HANDLE) + { + queues[q].clear(); + } + } + allocationhandler->Update(FRAMECOUNT, BUFFERCOUNT); } diff --git a/WickedEngine/wiGraphicsDevice_Vulkan.h b/WickedEngine/wiGraphicsDevice_Vulkan.h index 7aab0e30e..4a6e13481 100644 --- a/WickedEngine/wiGraphicsDevice_Vulkan.h +++ b/WickedEngine/wiGraphicsDevice_Vulkan.h @@ -206,6 +206,7 @@ namespace wi::graphics bool sparse_binding_supported = false; std::shared_ptr locker; + void clear(); void signal(VkSemaphore semaphore); void wait(VkSemaphore semaphore); void submit(GraphicsDevice_Vulkan* device, VkFence fence); @@ -238,16 +239,16 @@ namespace wi::graphics mutable CopyAllocator copyAllocator; // Resource init transition helper: + mutable std::mutex transitionLocker; + mutable wi::vector init_transitions; struct TransitionHandler { VkCommandPool commandPool = VK_NULL_HANDLE; VkCommandBuffer commandBuffer = VK_NULL_HANDLE; VkSemaphore semaphores[QUEUE_COUNT - 1] = {}; // for each queue except graphics - wi::vector barriers; }; - mutable TransitionHandler transition_handlers[BUFFERCOUNT]; - mutable std::mutex transitionLocker; - inline TransitionHandler& GetTransitionHandler() const { return transition_handlers[GetBufferIndex()]; } + TransitionHandler transition_handlers[BUFFERCOUNT]; + inline TransitionHandler& GetTransitionHandler() { return transition_handlers[GetBufferIndex()]; } VkFence frame_fence[BUFFERCOUNT][QUEUE_COUNT] = {}; diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp index e21f758e9..a02935e98 100644 --- a/WickedEngine/wiVersion.cpp +++ b/WickedEngine/wiVersion.cpp @@ -9,7 +9,7 @@ namespace wi::version // minor features, major updates, breaking compatibility changes const int minor = 71; // minor bug fixes, alterations, refactors, updates - const int revision = 747; + const int revision = 748; const std::string version_string = std::to_string(major) + "." + std::to_string(minor) + "." + std::to_string(revision);