From 1f186f34a29da8c4e39e3ad25fff1e4a39b33e85 Mon Sep 17 00:00:00 2001 From: bunnei Date: Mon, 12 Oct 2020 17:35:34 -0700 Subject: hle: service: vi: Implement BufferQueue::CancelBuffer. - This is used by Super Mario 3D All-Stars. --- src/core/hle/service/nvflinger/buffer_queue.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'src/core/hle/service/nvflinger/buffer_queue.cpp') diff --git a/src/core/hle/service/nvflinger/buffer_queue.cpp b/src/core/hle/service/nvflinger/buffer_queue.cpp index 637b310d7..4f1e210b1 100644 --- a/src/core/hle/service/nvflinger/buffer_queue.cpp +++ b/src/core/hle/service/nvflinger/buffer_queue.cpp @@ -99,6 +99,20 @@ void BufferQueue::QueueBuffer(u32 slot, BufferTransformFlags transform, queue_sequence.push_back(slot); } +void BufferQueue::CancelBuffer(u32 slot, const Service::Nvidia::MultiFence& multi_fence) { + const auto itr = std::find_if(queue.begin(), queue.end(), + [slot](const Buffer& buffer) { return buffer.slot == slot; }); + ASSERT(itr != queue.end()); + ASSERT(itr->status != Buffer::Status::Free); + itr->status = Buffer::Status::Free; + itr->multi_fence = multi_fence; + itr->swap_interval = 0; + + free_buffers.push_back(slot); + + buffer_wait_event.writable->Signal(); +} + std::optional> BufferQueue::AcquireBuffer() { auto itr = queue.end(); // Iterate to find a queued buffer matching the requested slot. -- cgit v1.2.3