From 3cb44981420fb7d493e2b1ff9ee1e5670fae2486 Mon Sep 17 00:00:00 2001
From: Fernando Sahmkow <fsahmkow27@gmail.com>
Date: Wed, 19 Oct 2022 06:21:51 +0200
Subject: [PATCH] Maxwell3D/Puller: Fix regressions and syncing issues.

---
 src/video_core/engines/maxwell_3d.cpp | 17 +++++++----------
 src/video_core/engines/puller.cpp     |  5 ++---
 2 files changed, 9 insertions(+), 13 deletions(-)

diff --git a/src/video_core/engines/maxwell_3d.cpp b/src/video_core/engines/maxwell_3d.cpp
index 84c1abf3d..fdf470913 100644
--- a/src/video_core/engines/maxwell_3d.cpp
+++ b/src/video_core/engines/maxwell_3d.cpp
@@ -473,9 +473,7 @@ void Maxwell3D::ProcessQueryGet() {
 
     switch (regs.report_semaphore.query.operation) {
     case Regs::ReportSemaphore::Operation::Release:
-        if (regs.report_semaphore.query.release ==
-                Regs::ReportSemaphore::Release::AfterAllPreceedingWrites ||
-            regs.report_semaphore.query.short_query != 0) {
+        if (regs.report_semaphore.query.short_query != 0) {
             const GPUVAddr sequence_address{regs.report_semaphore.Address()};
             const u32 payload = regs.report_semaphore.payload;
             std::function<void()> operation([this, sequence_address, payload] {
@@ -489,11 +487,10 @@ void Maxwell3D::ProcessQueryGet() {
             };
             const GPUVAddr sequence_address{regs.report_semaphore.Address()};
             const u32 payload = regs.report_semaphore.payload;
-            std::function<void()> operation([this, sequence_address, payload] {
+            [this, sequence_address, payload] {
                 memory_manager.Write<u64>(sequence_address + sizeof(u64), system.GPU().GetTicks());
                 memory_manager.Write<u64>(sequence_address, payload);
-            });
-            rasterizer->SyncOperation(std::move(operation));
+            }();
         }
         break;
     case Regs::ReportSemaphore::Operation::Acquire:
@@ -569,11 +566,11 @@ void Maxwell3D::ProcessCounterReset() {
 
 void Maxwell3D::ProcessSyncPoint() {
     const u32 sync_point = regs.sync_info.sync_point.Value();
-    const auto condition = regs.sync_info.condition.Value();
-    [[maybe_unused]] const u32 cache_flush = regs.sync_info.clean_l2.Value();
-    if (condition == Regs::SyncInfo::Condition::RopWritesDone) {
-        rasterizer->SignalSyncPoint(sync_point);
+    const u32 cache_flush = regs.sync_info.clean_l2.Value();
+    if (cache_flush != 0) {
+        rasterizer->InvalidateGPUCache();
     }
+    rasterizer->SignalSyncPoint(sync_point);
 }
 
 void Maxwell3D::DrawArrays() {
diff --git a/src/video_core/engines/puller.cpp b/src/video_core/engines/puller.cpp
index cca890792..3977bb0fb 100644
--- a/src/video_core/engines/puller.cpp
+++ b/src/video_core/engines/puller.cpp
@@ -75,11 +75,10 @@ void Puller::ProcessSemaphoreTriggerMethod() {
     if (op == GpuSemaphoreOperation::WriteLong) {
         const GPUVAddr sequence_address{regs.semaphore_address.SemaphoreAddress()};
         const u32 payload = regs.semaphore_sequence;
-        std::function<void()> operation([this, sequence_address, payload] {
+        [this, sequence_address, payload] {
             memory_manager.Write<u64>(sequence_address + sizeof(u64), gpu.GetTicks());
             memory_manager.Write<u64>(sequence_address, payload);
-        });
-        rasterizer->SignalFence(std::move(operation));
+        }();
     } else {
         do {
             const u32 word{memory_manager.Read<u32>(regs.semaphore_address.SemaphoreAddress())};