From 949f72222b9274a8a12de388fe1fc0f2fd36f4d7 Mon Sep 17 00:00:00 2001 From: wildcard Date: Sat, 23 Aug 2025 20:00:58 +0200 Subject: [PATCH] [VK] spec-clean MasterSemaphore submits (#285) fixes this error [ 18.505526] Render.Vulkan video_core/vulkan_common/vulkan_debug_callback.cpp:DebugUtilCallback:59: Validation Information: [ UNASSIGNED-BestPractices-SemaphoreCount ] | MessageID = 0x6cfe18a5 | pSubmits[0].pWaitSemaphores is set, but pSubmits[0].waitSemaphoreCount is 0. This patch is only corrective in nature and is trivial and should not fix or break anything just one of the best practices in vulkan. It nulls pWaitSemaphores / pWaitDstStageMask / pSignalSemaphores when the corresponding counts are zero. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/285 Reviewed-by: Shinmegumi Co-authored-by: wildcard Co-committed-by: wildcard --- .../renderer_vulkan/vk_master_semaphore.cpp | 33 ++++++++++++++----- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/src/video_core/renderer_vulkan/vk_master_semaphore.cpp b/src/video_core/renderer_vulkan/vk_master_semaphore.cpp index ac8b6e838e..4e5a2ff049 100644 --- a/src/video_core/renderer_vulkan/vk_master_semaphore.cpp +++ b/src/video_core/renderer_vulkan/vk_master_semaphore.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -129,11 +132,19 @@ VkResult MasterSemaphore::SubmitQueueTimeline(vk::CommandBuffer& cmdbuf, const std::array cmdbuffers{*upload_cmdbuf, *cmdbuf}; const u32 num_wait_semaphores = wait_semaphore ? 1 : 0; + // Pointers must be null when the count is zero (best-practices) + const VkSemaphore* p_wait_sems = + (num_wait_semaphores > 0) ? &wait_semaphore : nullptr; + const VkPipelineStageFlags* p_wait_masks = + (num_wait_semaphores > 0) ? wait_stage_masks.data() : nullptr; + const VkSemaphore* p_signal_sems = + (num_signal_semaphores > 0) ? signal_semaphores.data() : nullptr; + const u64 wait_zero = 0; // dummy for binary wait const VkTimelineSemaphoreSubmitInfo timeline_si{ .sType = VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO, .pNext = nullptr, - .waitSemaphoreValueCount = 0, - .pWaitSemaphoreValues = nullptr, + .waitSemaphoreValueCount = num_wait_semaphores, + .pWaitSemaphoreValues = num_wait_semaphores ? &wait_zero : nullptr, .signalSemaphoreValueCount = num_signal_semaphores, .pSignalSemaphoreValues = signal_values.data(), }; @@ -141,12 +152,12 @@ VkResult MasterSemaphore::SubmitQueueTimeline(vk::CommandBuffer& cmdbuf, .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO, .pNext = &timeline_si, .waitSemaphoreCount = num_wait_semaphores, - .pWaitSemaphores = &wait_semaphore, - .pWaitDstStageMask = wait_stage_masks.data(), + .pWaitSemaphores = p_wait_sems, + .pWaitDstStageMask = p_wait_masks, .commandBufferCount = static_cast(cmdbuffers.size()), .pCommandBuffers = cmdbuffers.data(), .signalSemaphoreCount = num_signal_semaphores, - .pSignalSemaphores = signal_semaphores.data(), + .pSignalSemaphores = p_signal_sems, }; return device.GetGraphicsQueue().Submit(submit_info); @@ -159,18 +170,24 @@ VkResult MasterSemaphore::SubmitQueueFence(vk::CommandBuffer& cmdbuf, const u32 num_signal_semaphores = signal_semaphore ? 1 : 0; const u32 num_wait_semaphores = wait_semaphore ? 1 : 0; + const VkSemaphore* p_wait_sems = + (num_wait_semaphores > 0) ? &wait_semaphore : nullptr; + const VkPipelineStageFlags* p_wait_masks = + (num_wait_semaphores > 0) ? wait_stage_masks.data() : nullptr; + const VkSemaphore* p_signal_sems = + (num_signal_semaphores > 0) ? &signal_semaphore : nullptr; const std::array cmdbuffers{*upload_cmdbuf, *cmdbuf}; const VkSubmitInfo submit_info{ .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO, .pNext = nullptr, .waitSemaphoreCount = num_wait_semaphores, - .pWaitSemaphores = &wait_semaphore, - .pWaitDstStageMask = wait_stage_masks.data(), + .pWaitSemaphores = p_wait_sems, + .pWaitDstStageMask = p_wait_masks, .commandBufferCount = static_cast(cmdbuffers.size()), .pCommandBuffers = cmdbuffers.data(), .signalSemaphoreCount = num_signal_semaphores, - .pSignalSemaphores = &signal_semaphore, + .pSignalSemaphores = p_signal_sems, }; auto fence = GetFreeFence();