From 6e2ca7fbee8b7de964926da392ab0550b2a76475 Mon Sep 17 00:00:00 2001
From: ReinUsesLisp <reinuseslisp@airmail.cc>
Date: Tue, 20 Jul 2021 18:50:48 -0300
Subject: [PATCH 1/2] buffer_cache: Simplify clear logic

Use existing helper functions and avoid looping when
only one buffer has to be active.
---
 src/video_core/buffer_cache/buffer_cache.h | 8 ++------
 1 file changed, 2 insertions(+), 6 deletions(-)

diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h
index 7373cb62d7..5a0b6f0c0b 100644
--- a/src/video_core/buffer_cache/buffer_cache.h
+++ b/src/video_core/buffer_cache/buffer_cache.h
@@ -553,13 +553,9 @@ bool BufferCache<P>::DMAClear(GPUVAddr dst_address, u64 amount, u32 value) {
     ClearDownload(subtract_interval);
     common_ranges.subtract(subtract_interval);
 
-    BufferId buffer;
-    do {
-        has_deleted_buffers = false;
-        buffer = FindBuffer(*cpu_dst_address, static_cast<u32>(size));
-    } while (has_deleted_buffers);
+    const BufferId buffer = FindBuffer(*cpu_dst_address, static_cast<u32>(size));
     auto& dest_buffer = slot_buffers[buffer];
-    const u32 offset = static_cast<u32>(*cpu_dst_address - dest_buffer.CpuAddr());
+    const u32 offset = dest_buffer.Offset(*cpu_dst_address);
     runtime.ClearBuffer(dest_buffer, offset, size, value);
     return true;
 }

From a0c4557557172b3139e3b53a42e31338900037c6 Mon Sep 17 00:00:00 2001
From: ReinUsesLisp <reinuseslisp@airmail.cc>
Date: Tue, 20 Jul 2021 18:51:42 -0300
Subject: [PATCH 2/2] gl_buffer_cache: Use glClearNamedBufferSubData:GL_RED
 instead of GL_RGBA

Avoids reading out of bounds from the stack.
---
 src/video_core/renderer_opengl/gl_buffer_cache.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/video_core/renderer_opengl/gl_buffer_cache.cpp b/src/video_core/renderer_opengl/gl_buffer_cache.cpp
index c4189fb60e..a02a45e04c 100644
--- a/src/video_core/renderer_opengl/gl_buffer_cache.cpp
+++ b/src/video_core/renderer_opengl/gl_buffer_cache.cpp
@@ -100,7 +100,7 @@ void BufferCacheRuntime::CopyBuffer(Buffer& dst_buffer, Buffer& src_buffer,
 
 void BufferCacheRuntime::ClearBuffer(Buffer& dest_buffer, u32 offset, size_t size, u32 value) {
     glClearNamedBufferSubData(dest_buffer.Handle(), GL_R32UI, static_cast<GLintptr>(offset),
-                              static_cast<GLsizeiptr>(size / sizeof(u32)), GL_RGBA, GL_UNSIGNED_INT,
+                              static_cast<GLsizeiptr>(size / sizeof(u32)), GL_RED, GL_UNSIGNED_INT,
                               &value);
 }