1
0
mirror of https://github.com/RPCS3/rpcs3.git synced 2024-11-25 12:12:50 +01:00

vk: Handle corner cases

- Fix up flush sequence in DMA handling (WCB)
- Do not request resource sharing if queue family is not different!
This commit is contained in:
kd-11 2022-07-24 20:39:15 +03:00 committed by kd-11
parent d846142f0c
commit 5af50cfd55

View File

@ -965,9 +965,18 @@ namespace vk
} }
} }
const rsx::flags32_t create_flags = g_fxo->get<AsyncTaskScheduler>().is_host_mode() const bool upload_async = rsx::get_current_renderer()->get_backend_config().supports_asynchronous_compute;
? (texture_create_flags::shareable | texture_create_flags::do_not_reuse) rsx::flags32_t create_flags = 0;
: 0;
if (upload_async && g_fxo->get<AsyncTaskScheduler>().is_host_mode())
{
create_flags |= texture_create_flags::do_not_reuse;
if (m_device->get_graphics_queue() != m_device->get_transfer_queue())
{
create_flags |= texture_create_flags::shareable;
}
}
auto section = create_new_texture(cmd, rsx_range, width, height, depth, mipmaps, pitch, gcm_format, context, type, swizzled, auto section = create_new_texture(cmd, rsx_range, width, height, depth, mipmaps, pitch, gcm_format, context, type, swizzled,
rsx::component_order::default_, create_flags); rsx::component_order::default_, create_flags);
@ -984,8 +993,7 @@ namespace vk
} }
rsx::flags32_t upload_command_flags = initialize_image_layout | upload_contents_inline; rsx::flags32_t upload_command_flags = initialize_image_layout | upload_contents_inline;
if (context == rsx::texture_upload_context::shader_read && if (context == rsx::texture_upload_context::shader_read && upload_async)
rsx::get_current_renderer()->get_backend_config().supports_asynchronous_compute)
{ {
upload_command_flags |= upload_contents_async; upload_command_flags |= upload_contents_async;
} }
@ -1123,41 +1131,36 @@ namespace vk
{ {
// Flush any pending async jobs in case of blockers // Flush any pending async jobs in case of blockers
// TODO: Context-level manager should handle this logic // TODO: Context-level manager should handle this logic
auto& async_scheduler = g_fxo->get<AsyncTaskScheduler>(); auto async_scheduler = g_fxo->try_get<AsyncTaskScheduler>();
vk::semaphore* async_sema = nullptr; vk::semaphore* async_sema = nullptr;
if (async_scheduler.is_recording()) if (async_scheduler && async_scheduler->is_recording())
{ {
if (async_scheduler.is_host_mode()) if (async_scheduler->is_host_mode())
{ {
async_sema = async_scheduler.get_sema(); async_sema = async_scheduler->get_sema();
} }
else else
{ {
vk::queue_submit_t submit_info{}; vk::queue_submit_t submit_info{};
async_scheduler.flush(submit_info, VK_TRUE); async_scheduler->flush(submit_info, VK_TRUE);
} }
} }
// Primary access command queue, must restart it after
// Primary access command queue, must restart it after // Primary access command queue, must restart it after
vk::fence submit_fence(*m_device); vk::fence submit_fence(*m_device);
vk::queue_submit_t submit_info{ m_submit_queue, &submit_fence }; vk::queue_submit_t submit_info{ m_submit_queue, &submit_fence };
if (async_sema) if (async_sema)
{ {
submit_info.queue_signal(*async_sema); vk::queue_submit_t submit_info2{};
submit_info2.queue_signal(*async_sema);
async_scheduler->flush(submit_info2, VK_FALSE);
submit_info.wait_on(*async_sema, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT);
} }
cmd.submit(submit_info, VK_TRUE); cmd.submit(submit_info, VK_TRUE);
if (async_sema)
{
vk::queue_submit_t submit_info2{};
submit_info2.wait_on(*async_sema, VK_PIPELINE_STAGE_TRANSFER_BIT);
async_scheduler.flush(submit_info2, VK_FALSE);
}
vk::wait_for_fence(&submit_fence, GENERAL_WAIT_TIMEOUT); vk::wait_for_fence(&submit_fence, GENERAL_WAIT_TIMEOUT);
CHECK_RESULT(vkResetCommandBuffer(cmd, 0)); CHECK_RESULT(vkResetCommandBuffer(cmd, 0));