rsx/vk: Synchronize access to queue submit calls

- Should prevent concurrent access on the present/graphics queue
This commit is contained in:
kd-11 2017-12-28 20:07:43 +03:00
parent 688569e5c8
commit 4872be9de3
2 changed files with 23 additions and 2 deletions

View File

@ -1,6 +1,8 @@
#include "stdafx.h"
#include "VKHelpers.h"
#include <mutex>
namespace vk
{
context* g_current_vulkan_ctx = nullptr;
@ -9,7 +11,7 @@ namespace vk
std::unique_ptr<image> g_null_texture;
std::unique_ptr<image_view> 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();

View File

@ -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<uint32_t>(semaphores.size());
infos.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
acquire_global_submit_lock();
CHECK_RESULT(vkQueueSubmit(queue, 1, &infos, fence));
release_global_submit_lock();
}
};