From 4872be9de3fbf315c5ecaf09345874b8857cfe34 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Thu, 28 Dec 2017 20:07:43 +0300 Subject: [PATCH] rsx/vk: Synchronize access to queue submit calls - Should prevent concurrent access on the present/graphics queue --- rpcs3/Emu/RSX/VK/VKHelpers.cpp | 19 +++++++++++++++++-- rpcs3/Emu/RSX/VK/VKHelpers.h | 6 ++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/RSX/VK/VKHelpers.cpp b/rpcs3/Emu/RSX/VK/VKHelpers.cpp index ad75573a8a..da8e9a498d 100644 --- a/rpcs3/Emu/RSX/VK/VKHelpers.cpp +++ b/rpcs3/Emu/RSX/VK/VKHelpers.cpp @@ -1,6 +1,8 @@ #include "stdafx.h" #include "VKHelpers.h" +#include + namespace vk { context* g_current_vulkan_ctx = nullptr; @@ -9,7 +11,7 @@ namespace vk std::unique_ptr g_null_texture; std::unique_ptr g_null_image_view; - VkSampler g_null_sampler = nullptr; + VkSampler g_null_sampler = nullptr; bool g_cb_no_interrupt_flag = false; bool g_drv_no_primitive_restart_flag = false; @@ -17,6 +19,9 @@ namespace vk u64 g_num_processed_frames = 0; u64 g_num_total_frames = 0; + //global submit guard to prevent race condition on queue submit + std::mutex g_submit_mutex; + VKAPI_ATTR void* VKAPI_CALL mem_realloc(void* pUserData, void* pOriginal, size_t size, size_t alignment, VkSystemAllocationScope allocationScope) { #ifdef _MSC_VER @@ -219,7 +224,7 @@ namespace vk g_null_texture.reset(new image(g_current_renderer, get_memory_mapping(g_current_renderer.gpu()).device_local, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_IMAGE_TYPE_2D, VK_FORMAT_B8G8R8A8_UNORM, 4, 4, 1, 1, 1, VK_SAMPLE_COUNT_1_BIT, VK_IMAGE_LAYOUT_UNDEFINED, - VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_SAMPLED_BIT, 0)); + VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT, 0)); g_null_image_view.reset(new image_view(g_current_renderer, g_null_texture->value, VK_IMAGE_VIEW_TYPE_2D, VK_FORMAT_B8G8R8A8_UNORM, {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A}, @@ -236,6 +241,16 @@ namespace vk return g_null_image_view->value; } + void acquire_global_submit_lock() + { + g_submit_mutex.lock(); + } + + void release_global_submit_lock() + { + g_submit_mutex.unlock(); + } + void destroy_global_resources() { g_null_texture.reset(); diff --git a/rpcs3/Emu/RSX/VK/VKHelpers.h b/rpcs3/Emu/RSX/VK/VKHelpers.h index 62d0507c65..0b158b8d86 100644 --- a/rpcs3/Emu/RSX/VK/VKHelpers.h +++ b/rpcs3/Emu/RSX/VK/VKHelpers.h @@ -75,6 +75,10 @@ namespace vk VkSampler null_sampler(); VkImageView null_image_view(vk::command_buffer&); + //Sync helpers around vkQueueSubmit + void acquire_global_submit_lock(); + void release_global_submit_lock(); + void destroy_global_resources(); void change_image_layout(VkCommandBuffer cmd, VkImage image, VkImageLayout current_layout, VkImageLayout new_layout, VkImageSubresourceRange range); @@ -1127,7 +1131,9 @@ namespace vk infos.waitSemaphoreCount = static_cast(semaphores.size()); infos.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; + acquire_global_submit_lock(); CHECK_RESULT(vkQueueSubmit(queue, 1, &infos, fence)); + release_global_submit_lock(); } };