mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-02-22 21:40:47 +00:00
rsx/vk: Synchronize access to queue submit calls
- Should prevent concurrent access on the present/graphics queue
This commit is contained in:
parent
688569e5c8
commit
4872be9de3
@ -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();
|
||||
|
@ -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();
|
||||
}
|
||||
};
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user