From 603176b6e73d0ea85af88e89d2b7d97117d00419 Mon Sep 17 00:00:00 2001 From: Maufeat Date: Sat, 19 Jul 2025 00:41:32 +0200 Subject: [PATCH] fix weird implementation --- .../hle/service/nvnflinger/buffer_history.h | 48 +++++++++++-------- .../nvnflinger/buffer_queue_producer.cpp | 8 +++- .../nvnflinger/buffer_queue_producer.h | 2 +- 3 files changed, 36 insertions(+), 22 deletions(-) diff --git a/src/core/hle/service/nvnflinger/buffer_history.h b/src/core/hle/service/nvnflinger/buffer_history.h index a9bf465523..614e7fc2fe 100644 --- a/src/core/hle/service/nvnflinger/buffer_history.h +++ b/src/core/hle/service/nvnflinger/buffer_history.h @@ -1,27 +1,37 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - #pragma once + #include #include #include -struct BufferHistoryEntry { s32 slot; s64 timestamp; s64 frame_number; }; +struct BufferHistoryEntry { + s32 slot; + s64 timestamp; + s64 frame_number; +}; -class BufferHistoryManager { public: void PushEntry(s32 slot, s64 timestamp, s64 frame_number) { std::lock_guardstd::mutex lock(mutex_); if (entries_.size() >= kMaxHistorySize) entries_.pop_front(); +class BufferHistoryManager { +public: + void PushEntry(s32 slot, s64 timestamp, s64 frame_number) { + std::lock_guard lock(mutex_); + if (entries_.size() >= kMaxHistorySize) { + entries_.pop_front(); + } + entries_.emplace_back(BufferHistoryEntry{slot, timestamp, frame_number}); + } -entries_.emplace_back(BufferHistoryEntry{slot, timestamp, frame_number}); -} + s32 GetHistory(std::span out_entries) { + std::lock_guard lock(mutex_); + s32 count = + std::min(static_cast(entries_.size()), static_cast(out_entries.size())); + for (s32 i = 0; i < count; ++i) { + out_entries[i] = entries_[entries_.size() - count + i]; + } + return count; + } -s32 GetHistory(std::span out_entries) { - std::lock_guard lock(mutex_); - - s32 count = std::min(static_cast(entries_.size()), static_cast(out_entries.size())); - - for (s32 i = 0; i < count; ++i) - out_entries[i] = entries_[entries_.size() - count + i]; - - return count; -} - -private: static constexpr size_t kMaxHistorySize = 16; std::deque entries_; std::mutex mutex_; }; \ No newline at end of file +private: + static constexpr size_t kMaxHistorySize = 16; + std::deque entries_; + std::mutex mutex_; +}; \ No newline at end of file diff --git a/src/core/hle/service/nvnflinger/buffer_queue_producer.cpp b/src/core/hle/service/nvnflinger/buffer_queue_producer.cpp index bab004a061..e5f75e648c 100644 --- a/src/core/hle/service/nvnflinger/buffer_queue_producer.cpp +++ b/src/core/hle/service/nvnflinger/buffer_queue_producer.cpp @@ -928,9 +928,13 @@ void BufferQueueProducer::Transact(u32 code, std::span parcel_data, } case TransactionId::GetBufferHistory: { LOG_DEBUG(Service_Nvnflinger, "GetBufferHistory"); - auto out_span = request.PopRaw>(); + auto out_span = parcel_in.Read>(); s32 count = buffer_history_.GetHistory(out_span); - response.Push(s32(count)); + parcel_out.Write(s32(count)); + break; + } + default: + ASSERT_MSG(false, "Unimplemented TransactionId {}", code); break; } diff --git a/src/core/hle/service/nvnflinger/buffer_queue_producer.h b/src/core/hle/service/nvnflinger/buffer_queue_producer.h index fdc4059dbe..28c26ca1ed 100644 --- a/src/core/hle/service/nvnflinger/buffer_queue_producer.h +++ b/src/core/hle/service/nvnflinger/buffer_queue_producer.h @@ -20,6 +20,7 @@ #include "core/hle/service/nvnflinger/buffer_slot.h" #include "core/hle/service/nvnflinger/graphic_buffer_producer.h" #include "core/hle/service/nvnflinger/pixel_format.h" +#include "core/hle/service/nvnflinger/buffer_history.h" #include "core/hle/service/nvnflinger/status.h" #include "core/hle/service/nvnflinger/window.h" @@ -84,7 +85,6 @@ private: std::shared_ptr core; BufferQueueDefs::SlotsType& slots; BufferHistoryManager buffer_history_; - buffer_history_.PushEntry(slot, timestamp, frame_number); u32 sticky_transform{}; std::mutex callback_mutex; s32 next_callback_ticket{};