Skip to content

Commit

Permalink
vk: Update async compute (fast) to use the new sync API
Browse files Browse the repository at this point in the history
  • Loading branch information
kd-11 committed Jun 22, 2023
1 parent 850166e commit 715e385
Show file tree
Hide file tree
Showing 5 changed files with 31 additions and 8 deletions.
10 changes: 6 additions & 4 deletions rpcs3/Emu/RSX/VK/VKAsyncScheduler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

namespace vk
{
AsyncTaskScheduler::AsyncTaskScheduler([[maybe_unused]] vk_gpu_scheduler_mode mode)
AsyncTaskScheduler::AsyncTaskScheduler(vk_gpu_scheduler_mode mode, const VkDependencyInfoKHR& queue_dependency)
{
if (g_cfg.video.renderer != video_renderer::vulkan || !g_cfg.video.vk.asynchronous_texture_streaming)
{
Expand All @@ -20,7 +20,7 @@ namespace vk
return;
}

init_config_options(mode);
init_config_options(mode, queue_dependency);
}

AsyncTaskScheduler::~AsyncTaskScheduler()
Expand All @@ -32,7 +32,7 @@ namespace vk
}
}

void AsyncTaskScheduler::init_config_options(vk_gpu_scheduler_mode mode)
void AsyncTaskScheduler::init_config_options(vk_gpu_scheduler_mode mode, const VkDependencyInfoKHR& queue_dependency)
{
std::lock_guard lock(m_config_mutex);
if (std::exchange(m_options_initialized, true))
Expand All @@ -43,6 +43,8 @@ namespace vk

m_use_host_scheduler = (mode == vk_gpu_scheduler_mode::safe) || g_cfg.video.strict_rendering_mode;
rsx_log.notice("Asynchronous task scheduler is active running in %s mode", m_use_host_scheduler? "'Safe'" : "'Fast'");

m_dependency_info = queue_dependency;
}

void AsyncTaskScheduler::delayed_init()
Expand Down Expand Up @@ -76,7 +78,7 @@ namespace vk
auto& sync_label = m_events_pool[m_next_event_id++ % events_pool_size];

sync_label->reset();
sync_label->signal(*m_current_cb, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, 0);
sync_label->signal(*m_current_cb, m_dependency_info);
m_sync_label = sync_label.get();
}

Expand Down
5 changes: 3 additions & 2 deletions rpcs3/Emu/RSX/VK/VKAsyncScheduler.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ namespace vk
// Sync
event* m_sync_label = nullptr;
atomic_t<bool> m_sync_required = false;
VkDependencyInfoKHR m_dependency_info{};

static constexpr u32 events_pool_size = 16384;
std::vector<std::unique_ptr<vk::event>> m_events_pool;
Expand All @@ -39,12 +40,12 @@ namespace vk

shared_mutex m_submit_mutex;

void init_config_options(vk_gpu_scheduler_mode mode);
void init_config_options(vk_gpu_scheduler_mode mode, const VkDependencyInfoKHR& queue_dependency);
void delayed_init();
void insert_sync_event();

public:
AsyncTaskScheduler(vk_gpu_scheduler_mode mode); // This ctor stops default initialization by fxo
AsyncTaskScheduler(vk_gpu_scheduler_mode mode, const VkDependencyInfoKHR& queue_dependency);
~AsyncTaskScheduler();

command_buffer* get_current();
Expand Down
2 changes: 1 addition & 1 deletion rpcs3/Emu/RSX/VK/VKDraw.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -478,7 +478,7 @@ void VKGSRender::load_texture_env()
// Sync any async scheduler tasks
if (auto ev = async_task_scheduler.get_primary_sync_label())
{
ev->gpu_wait(*m_current_command_buffer, { .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO_KHR });
ev->gpu_wait(*m_current_command_buffer, m_async_compute_dependency_info);
}
}
}
Expand Down
19 changes: 18 additions & 1 deletion rpcs3/Emu/RSX/VK/VKGSRender.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -822,8 +822,25 @@ VKGSRender::VKGSRender(utils::serial* ar) noexcept : GSRender(ar)

if (backend_config.supports_asynchronous_compute)
{
m_async_compute_memory_barrier =
{
.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER_2_KHR,
.pNext = nullptr,
.srcStageMask = VK_PIPELINE_STAGE_2_TRANSFER_BIT_KHR | VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT_KHR,
.srcAccessMask = VK_ACCESS_2_MEMORY_WRITE_BIT_KHR,
.dstStageMask = VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT_KHR | VK_PIPELINE_STAGE_2_VERTEX_SHADER_BIT_KHR,
.dstAccessMask = VK_ACCESS_2_SHADER_SAMPLED_READ_BIT_KHR
};

m_async_compute_dependency_info =
{
.sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO_KHR,
.memoryBarrierCount = 1,
.pMemoryBarriers = &m_async_compute_memory_barrier
};

// Run only if async compute can be used.
g_fxo->init<vk::AsyncTaskScheduler>(g_cfg.video.vk.asynchronous_scheduler);
g_fxo->init<vk::AsyncTaskScheduler>(g_cfg.video.vk.asynchronous_scheduler, m_async_compute_dependency_info);
}

if (backend_config.supports_host_gpu_labels)
Expand Down
3 changes: 3 additions & 0 deletions rpcs3/Emu/RSX/VK/VKGSRender.h
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,9 @@ class VKGSRender : public GSRender, public ::rsx::reports::ZCULL_control
std::unique_ptr<vk::buffer_view> m_volatile_attribute_storage;
std::unique_ptr<vk::buffer_view> m_vertex_layout_storage;

VkDependencyInfoKHR m_async_compute_dependency_info{};
VkMemoryBarrier2KHR m_async_compute_memory_barrier{};

public:
//vk::fbo draw_fbo;
std::unique_ptr<vk::vertex_cache> m_vertex_cache;
Expand Down

0 comments on commit 715e385

Please sign in to comment.