From 0d83fbf61b32b8cc619956c1c5c31b592fcb8703 Mon Sep 17 00:00:00 2001 From: IndecisiveTurtle <47210458+raphaelthegreat@users.noreply.github.com> Date: Mon, 23 Jun 2025 23:34:04 +0300 Subject: [PATCH] liverpool: Dont commit flushes on bottom of pipe event Typically used for GPU to GPU sync then host --- src/video_core/amdgpu/liverpool.cpp | 6 +++--- src/video_core/amdgpu/pm4_cmds.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/video_core/amdgpu/liverpool.cpp b/src/video_core/amdgpu/liverpool.cpp index fa6102c96..cf7255458 100644 --- a/src/video_core/amdgpu/liverpool.cpp +++ b/src/video_core/amdgpu/liverpool.cpp @@ -627,10 +627,10 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span dcb, std::span(header); - if (rasterizer) { + if (rasterizer && event_eop->event_type != EventType::BottomOfPipeTs) { rasterizer->CommitPendingDownloads(); + ++fence_tick; } - ++fence_tick; event_eop->SignalFence([](void* address, u64 data, u32 num_bytes) { auto* memory = Core::Memory::Instance(); if (!memory->TryWriteBacking(address, &data, num_bytes)) { @@ -1024,9 +1024,9 @@ Liverpool::Task Liverpool::ProcessCompute(std::span acb, u32 vqid) { } case PM4ItOpcode::ReleaseMem: { const auto* release_mem = reinterpret_cast(header); - ++fence_tick; if (rasterizer) { rasterizer->CommitPendingDownloads(); + ++fence_tick; } release_mem->SignalFence(static_cast(queue.pipe_id)); break; diff --git a/src/video_core/amdgpu/pm4_cmds.h b/src/video_core/amdgpu/pm4_cmds.h index 23c1b8f21..586980113 100644 --- a/src/video_core/amdgpu/pm4_cmds.h +++ b/src/video_core/amdgpu/pm4_cmds.h @@ -421,7 +421,7 @@ struct PM4CmdEventWriteEop { PM4Type3Header header; union { u32 event_control; - BitField<0, 6, u32> event_type; ///< Event type written to VGT_EVENT_INITIATOR + BitField<0, 6, EventType> event_type; ///< Event type written to VGT_EVENT_INITIATOR BitField<8, 4, u32> event_index; ///< Event index }; u32 address_lo;