From 888e8141305a12059158494fb315fefc673e53e0 Mon Sep 17 00:00:00 2001
From: bunnei <bunneidev@gmail.com>
Date: Sun, 5 Jun 2022 16:06:06 -0700
Subject: [PATCH] hle: service: nvflinger: buffer_queue_consumer: Always free
 released buffers.

---
 .../nvflinger/buffer_queue_consumer.cpp       | 29 ++-----------------
 .../service/nvflinger/buffer_queue_core.cpp   |  4 ---
 src/core/hle/service/nvflinger/buffer_slot.h  |  1 -
 3 files changed, 3 insertions(+), 31 deletions(-)

diff --git a/src/core/hle/service/nvflinger/buffer_queue_consumer.cpp b/src/core/hle/service/nvflinger/buffer_queue_consumer.cpp
index d7db77afff..4b3d5efd6a 100644
--- a/src/core/hle/service/nvflinger/buffer_queue_consumer.cpp
+++ b/src/core/hle/service/nvflinger/buffer_queue_consumer.cpp
@@ -89,14 +89,6 @@ Status BufferQueueConsumer::AcquireBuffer(BufferItem* out_buffer,
 
     LOG_DEBUG(Service_NVFlinger, "acquiring slot={}", slot);
 
-    // If the front buffer is still being tracked, update its slot state
-    if (core->StillTracking(*front)) {
-        slots[slot].acquire_called = true;
-        slots[slot].needs_cleanup_on_release = false;
-        slots[slot].buffer_state = BufferState::Acquired;
-        slots[slot].fence = Fence::NoFence();
-    }
-
     // If the buffer has previously been acquired by the consumer, set graphic_buffer to nullptr to
     // avoid unnecessarily remapping this buffer on the consumer side.
     if (out_buffer->acquire_called) {
@@ -139,26 +131,11 @@ Status BufferQueueConsumer::ReleaseBuffer(s32 slot, u64 frame_number, const Fenc
             ++current;
         }
 
-        if (slots[slot].buffer_state == BufferState::Acquired) {
-            slots[slot].fence = release_fence;
-            slots[slot].buffer_state = BufferState::Free;
+        slots[slot].buffer_state = BufferState::Free;
 
-            listener = core->connected_producer_listener;
+        listener = core->connected_producer_listener;
 
-            LOG_DEBUG(Service_NVFlinger, "releasing slot {}", slot);
-        } else if (slots[slot].needs_cleanup_on_release) {
-            LOG_DEBUG(Service_NVFlinger, "releasing a stale buffer slot {} (state = {})", slot,
-                      slots[slot].buffer_state);
-
-            slots[slot].needs_cleanup_on_release = false;
-
-            return Status::StaleBufferSlot;
-        } else {
-            LOG_ERROR(Service_NVFlinger, "attempted to release buffer slot {} but its state was {}",
-                      slot, slots[slot].buffer_state);
-
-            return Status::BadValue;
-        }
+        LOG_DEBUG(Service_NVFlinger, "releasing slot {}", slot);
 
         core->SignalDequeueCondition();
     }
diff --git a/src/core/hle/service/nvflinger/buffer_queue_core.cpp b/src/core/hle/service/nvflinger/buffer_queue_core.cpp
index d4e8b44d0c..ea4a14ea4e 100644
--- a/src/core/hle/service/nvflinger/buffer_queue_core.cpp
+++ b/src/core/hle/service/nvflinger/buffer_queue_core.cpp
@@ -84,10 +84,6 @@ void BufferQueueCore::FreeBufferLocked(s32 slot) {
 
     slots[slot].graphic_buffer.reset();
 
-    if (slots[slot].buffer_state == BufferState::Acquired) {
-        slots[slot].needs_cleanup_on_release = true;
-    }
-
     slots[slot].buffer_state = BufferState::Free;
     slots[slot].frame_number = UINT32_MAX;
     slots[slot].acquire_called = false;
diff --git a/src/core/hle/service/nvflinger/buffer_slot.h b/src/core/hle/service/nvflinger/buffer_slot.h
index 6b3e874461..0cd0e9964d 100644
--- a/src/core/hle/service/nvflinger/buffer_slot.h
+++ b/src/core/hle/service/nvflinger/buffer_slot.h
@@ -31,7 +31,6 @@ struct BufferSlot final {
     u64 frame_number{};
     Fence fence;
     bool acquire_called{};
-    bool needs_cleanup_on_release{};
     bool attached_by_consumer{};
     bool is_preallocated{};
 };