hle: service: vi: Implement BufferQueue::CancelBuffer.

- This is used by Super Mario 3D All-Stars.
This commit is contained in:
bunnei 2020-10-12 17:35:34 -07:00
parent ca416a0fb8
commit 1f186f34a2
3 changed files with 53 additions and 14 deletions

View file

@ -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<std::reference_wrapper<const BufferQueue::Buffer>> BufferQueue::AcquireBuffer() {
auto itr = queue.end();
// Iterate to find a queued buffer matching the requested slot.

View file

@ -95,6 +95,7 @@ public:
void QueueBuffer(u32 slot, BufferTransformFlags transform,
const Common::Rectangle<int>& crop_rect, u32 swap_interval,
Service::Nvidia::MultiFence& multi_fence);
void CancelBuffer(u32 slot, const Service::Nvidia::MultiFence& multi_fence);
std::optional<std::reference_wrapper<const Buffer>> AcquireBuffer();
void ReleaseBuffer(u32 slot);
void Disconnect();