From 7f4de3466ac60624268a3e99363409867261e055 Mon Sep 17 00:00:00 2001
From: FernandoS27 <fsahmkow27@gmail.com>
Date: Mon, 4 Oct 2021 20:46:58 +0200
Subject: [PATCH 1/3] Vulkan: Fix the master Semaphore

---
 .../renderer_vulkan/vk_master_semaphore.h        | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/src/video_core/renderer_vulkan/vk_master_semaphore.h b/src/video_core/renderer_vulkan/vk_master_semaphore.h
index 4f86881183..3d298d0b60 100644
--- a/src/video_core/renderer_vulkan/vk_master_semaphore.h
+++ b/src/video_core/renderer_vulkan/vk_master_semaphore.h
@@ -21,12 +21,12 @@ public:
 
     /// Returns the current logical tick.
     [[nodiscard]] u64 CurrentTick() const noexcept {
-        return current_tick.load(std::memory_order_relaxed);
+        return current_tick.load(std::memory_order_acquire);
     }
 
     /// Returns the last known GPU tick.
     [[nodiscard]] u64 KnownGpuTick() const noexcept {
-        return gpu_tick.load(std::memory_order_relaxed);
+        return gpu_tick.load(std::memory_order_acquire);
     }
 
     /// Returns the timeline semaphore handle.
@@ -41,12 +41,20 @@ public:
 
     /// Advance to the logical tick and return the old one
     [[nodiscard]] u64 NextTick() noexcept {
-        return current_tick.fetch_add(1, std::memory_order::relaxed);
+        return current_tick.fetch_add(1, std::memory_order_release);
     }
 
     /// Refresh the known GPU tick
     void Refresh() {
-        gpu_tick.store(semaphore.GetCounter(), std::memory_order_relaxed);
+        auto this_tick = gpu_tick.load(std::memory_order_acquire);
+        u64 counter{};
+        do {
+            counter = semaphore.GetCounter();
+            if (counter < this_tick) {
+                return;
+            }
+        } while (!gpu_tick.compare_exchange_weak(this_tick, counter, std::memory_order_release,
+                                                 std::memory_order_relaxed));
     }
 
     /// Waits for a tick to be hit on the GPU

From bb8bf740e9e80bfcd4bdb527aac2c7ad6a7ccff5 Mon Sep 17 00:00:00 2001
From: FernandoS27 <fsahmkow27@gmail.com>
Date: Mon, 4 Oct 2021 20:47:31 +0200
Subject: [PATCH 2/3] RasterizerInterface: Correct size of CPU addresses to
 cache.

---
 src/video_core/rasterizer_accelerated.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/video_core/rasterizer_accelerated.h b/src/video_core/rasterizer_accelerated.h
index ea879bfddb..249644e506 100644
--- a/src/video_core/rasterizer_accelerated.h
+++ b/src/video_core/rasterizer_accelerated.h
@@ -42,7 +42,7 @@ private:
     };
     static_assert(sizeof(CacheEntry) == 8, "CacheEntry should be 8 bytes!");
 
-    std::array<CacheEntry, 0x1000000> cached_pages;
+    std::array<CacheEntry, 0x2000000> cached_pages;
     Core::Memory::Memory& cpu_memory;
 };
 

From 0498669b4bc72b7b6c9cd4a397ce7c4ebd18d28d Mon Sep 17 00:00:00 2001
From: Fernando Sahmkow <fsahmkow27@gmail.com>
Date: Mon, 4 Oct 2021 20:53:20 +0200
Subject: [PATCH 3/3] Vulkan: Fix failing barrier on refresh.

---
 src/video_core/renderer_vulkan/vk_master_semaphore.h | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/video_core/renderer_vulkan/vk_master_semaphore.h b/src/video_core/renderer_vulkan/vk_master_semaphore.h
index 3d298d0b60..0886b7da81 100644
--- a/src/video_core/renderer_vulkan/vk_master_semaphore.h
+++ b/src/video_core/renderer_vulkan/vk_master_semaphore.h
@@ -46,9 +46,10 @@ public:
 
     /// Refresh the known GPU tick
     void Refresh() {
-        auto this_tick = gpu_tick.load(std::memory_order_acquire);
+        u64 this_tick{};
         u64 counter{};
         do {
+            this_tick = gpu_tick.load(std::memory_order_acquire);
             counter = semaphore.GetCounter();
             if (counter < this_tick) {
                 return;