From d2de560060e5f35ec61921adfaacf3449ba89083 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sat, 14 May 2022 19:04:12 +0300 Subject: [PATCH] rsx: Improve sync_hint callback interface --- rpcs3/Emu/RSX/RSXThread.cpp | 6 +++--- rpcs3/Emu/RSX/RSXThread.h | 2 +- rpcs3/Emu/RSX/RSXZCULL.cpp | 13 ++++++------- rpcs3/Emu/RSX/RSXZCULL.h | 9 ++++++++- rpcs3/Emu/RSX/VK/VKGSRender.cpp | 10 ++++------ rpcs3/Emu/RSX/VK/VKGSRender.h | 2 +- 6 files changed, 23 insertions(+), 19 deletions(-) diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index 0aeef5487b..67fe89ef16 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -2576,7 +2576,7 @@ namespace rsx if (!result.queries.empty()) { cond_render_ctrl.set_eval_sources(result.queries); - sync_hint(FIFO_hint::hint_conditional_render_eval, reinterpret_cast(ref)); + sync_hint(FIFO_hint::hint_conditional_render_eval, { .query = result.queries.front(), .address = ref }); } else { @@ -2624,9 +2624,9 @@ namespace rsx //ensure(async_tasks_pending.load() == 0); } - void thread::sync_hint(FIFO_hint /*hint*/, void* args) + void thread::sync_hint(FIFO_hint /*hint*/, rsx::reports::sync_hint_payload_t payload) { - zcull_ctrl->on_sync_hint(args); + zcull_ctrl->on_sync_hint(payload); } bool thread::is_fifo_idle() const diff --git a/rpcs3/Emu/RSX/RSXThread.h b/rpcs3/Emu/RSX/RSXThread.h index 3c0016acc2..f2c7d6c347 100644 --- a/rpcs3/Emu/RSX/RSXThread.h +++ b/rpcs3/Emu/RSX/RSXThread.h @@ -694,7 +694,7 @@ namespace rsx // sync void sync(); flags32_t read_barrier(u32 memory_address, u32 memory_range, bool unconditional); - virtual void sync_hint(FIFO_hint hint, void* args); + virtual void sync_hint(FIFO_hint hint, reports::sync_hint_payload_t payload); virtual bool release_GCM_label(u32 /*address*/, u32 /*value*/) { return false; } std::span get_raw_index_array(const draw_clause& draw_indexed_clause) const; diff --git a/rpcs3/Emu/RSX/RSXZCULL.cpp b/rpcs3/Emu/RSX/RSXZCULL.cpp index 0621b17697..43b4b28a30 100644 --- a/rpcs3/Emu/RSX/RSXZCULL.cpp +++ b/rpcs3/Emu/RSX/RSXZCULL.cpp @@ -285,10 +285,9 @@ namespace rsx } } - void ZCULL_control::on_sync_hint(void* args) + void ZCULL_control::on_sync_hint(sync_hint_payload_t payload) { - auto query = static_cast(args); - m_sync_tag = std::max(m_sync_tag, query->sync_tag); + m_sync_tag = std::max(m_sync_tag, payload.query->sync_tag); } void ZCULL_control::write(vm::addr_t sink, u64 timestamp, u32 type, u32 value) @@ -397,7 +396,7 @@ namespace rsx if (It->query->sync_tag > m_sync_tag) { // rsx_log.trace("[Performance warning] Query hint emit during sync command."); - ptimer->sync_hint(FIFO_hint::hint_zcull_sync, It->query); + ptimer->sync_hint(FIFO_hint::hint_zcull_sync, { .query = It->query }); } break; @@ -501,7 +500,7 @@ namespace rsx { if (It->query->num_draws && It->query->sync_tag > m_sync_tag) { - ptimer->sync_hint(FIFO_hint::hint_zcull_sync, It->query); + ptimer->sync_hint(FIFO_hint::hint_zcull_sync, { .query = It->query }); ensure(It->query->sync_tag <= m_sync_tag); } @@ -526,7 +525,7 @@ namespace rsx const auto elapsed = m_tsc - front.query->timestamp; if (elapsed > max_zcull_delay_us) { - ptimer->sync_hint(FIFO_hint::hint_zcull_sync, front.query); + ptimer->sync_hint(FIFO_hint::hint_zcull_sync, { .query = front.query }); ensure(front.query->sync_tag <= m_sync_tag); } @@ -686,7 +685,7 @@ namespace rsx { if (query->sync_tag > m_sync_tag) [[unlikely]] { - ptimer->sync_hint(FIFO_hint::hint_zcull_sync, query); + ptimer->sync_hint(FIFO_hint::hint_zcull_sync, { .query = query }); ensure(m_sync_tag >= query->sync_tag); } } diff --git a/rpcs3/Emu/RSX/RSXZCULL.h b/rpcs3/Emu/RSX/RSXZCULL.h index 7426542cc2..039cc099f9 100644 --- a/rpcs3/Emu/RSX/RSXZCULL.h +++ b/rpcs3/Emu/RSX/RSXZCULL.h @@ -65,6 +65,13 @@ namespace rsx u32 reserved; }; + struct sync_hint_payload_t + { + occlusion_query_info* query; + vm::addr_t address; + void* other_params; + }; + struct MMIO_page_data_t : public rsx::ref_counted { utils::protection prot = utils::protection::rw; @@ -171,7 +178,7 @@ namespace rsx void on_draw(); // Sync hint notification - void on_sync_hint(void* args); + void on_sync_hint(sync_hint_payload_t payload); // Check for pending writes bool has_pending() const { return !m_pending_writes.empty(); } diff --git a/rpcs3/Emu/RSX/VK/VKGSRender.cpp b/rpcs3/Emu/RSX/VK/VKGSRender.cpp index c552666384..52fd86c6a2 100644 --- a/rpcs3/Emu/RSX/VK/VKGSRender.cpp +++ b/rpcs3/Emu/RSX/VK/VKGSRender.cpp @@ -1573,10 +1573,9 @@ bool VKGSRender::release_GCM_label(u32 address, u32 args) return true; } -void VKGSRender::sync_hint(rsx::FIFO_hint hint, void* args) +void VKGSRender::sync_hint(rsx::FIFO_hint hint, rsx::reports::sync_hint_payload_t payload) { - ensure(args); - rsx::thread::sync_hint(hint, args); + rsx::thread::sync_hint(hint, payload); if (!(m_current_command_buffer->flags & vk::command_buffer::cb_has_occlusion_task)) { @@ -1596,7 +1595,7 @@ void VKGSRender::sync_hint(rsx::FIFO_hint hint, void* args) } // If the result is not going to be read by CELL, do nothing - const auto ref_addr = reinterpret_cast(args); + const auto ref_addr = static_cast(payload.address); if (!zcull_ctrl->is_query_result_urgent(ref_addr)) { // No effect on CELL behaviour, it will be faster to handle this in RSX code @@ -1620,8 +1619,7 @@ void VKGSRender::sync_hint(rsx::FIFO_hint hint, void* args) case rsx::FIFO_hint::hint_zcull_sync: { // Check if the required report is synced to this CB - auto occlusion_info = static_cast(args); - auto& data = m_occlusion_map[occlusion_info->driver_handle]; + auto& data = m_occlusion_map[payload.query->driver_handle]; // NOTE: Currently, a special condition exists where the indices can be empty even with active draw count. // This is caused by async compiler and should be removed when ubershaders are added in diff --git a/rpcs3/Emu/RSX/VK/VKGSRender.h b/rpcs3/Emu/RSX/VK/VKGSRender.h index 80dd9cdfdd..8b245d521c 100644 --- a/rpcs3/Emu/RSX/VK/VKGSRender.h +++ b/rpcs3/Emu/RSX/VK/VKGSRender.h @@ -246,7 +246,7 @@ public: void set_scissor(bool clip_viewport); void bind_viewport(); - void sync_hint(rsx::FIFO_hint hint, void* args) override; + void sync_hint(rsx::FIFO_hint hint, rsx::reports::sync_hint_payload_t payload) override; bool release_GCM_label(u32 address, u32 data) override; void begin_occlusion_query(rsx::reports::occlusion_query_info* query) override;