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:
parent
d846142f0c
commit
5af50cfd55
@ -965,9 +965,18 @@ namespace vk
|
||||
}
|
||||
}
|
||||
|
||||
const rsx::flags32_t create_flags = g_fxo->get<AsyncTaskScheduler>().is_host_mode()
|
||||
? (texture_create_flags::shareable | texture_create_flags::do_not_reuse)
|
||||
: 0;
|
||||
const bool upload_async = rsx::get_current_renderer()->get_backend_config().supports_asynchronous_compute;
|
||||
rsx::flags32_t create_flags = 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,
|
||||
rsx::component_order::default_, create_flags);
|
||||
|
||||
@ -984,8 +993,7 @@ namespace vk
|
||||
}
|
||||
|
||||
rsx::flags32_t upload_command_flags = initialize_image_layout | upload_contents_inline;
|
||||
if (context == rsx::texture_upload_context::shader_read &&
|
||||
rsx::get_current_renderer()->get_backend_config().supports_asynchronous_compute)
|
||||
if (context == rsx::texture_upload_context::shader_read && upload_async)
|
||||
{
|
||||
upload_command_flags |= upload_contents_async;
|
||||
}
|
||||
@ -1123,41 +1131,36 @@ namespace vk
|
||||
{
|
||||
// Flush any pending async jobs in case of blockers
|
||||
// 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;
|
||||
|
||||
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
|
||||
{
|
||||
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
|
||||
vk::fence submit_fence(*m_device);
|
||||
vk::queue_submit_t submit_info{ m_submit_queue, &submit_fence };
|
||||
|
||||
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);
|
||||
|
||||
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);
|
||||
|
||||
CHECK_RESULT(vkResetCommandBuffer(cmd, 0));
|
||||
|
Loading…
Reference in New Issue
Block a user