From 82462584bf38628b7d3404dd6d320a5a465aeaf8 Mon Sep 17 00:00:00 2001 From: "Lee, Joong-Ho" Date: Sat, 21 Mar 2020 17:44:47 +0900 Subject: [PATCH] Implementing SetBufferCount in BufferQueue --- .../hle/service/nvflinger/buffer_queue.cpp | 9 +++++- src/core/hle/service/nvflinger/buffer_queue.h | 2 ++ src/core/hle/service/vi/vi.cpp | 29 +++++++++++++++++++ 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/core/hle/service/nvflinger/buffer_queue.cpp b/src/core/hle/service/nvflinger/buffer_queue.cpp index 32b6f4b273..580dcce4a8 100644 --- a/src/core/hle/service/nvflinger/buffer_queue.cpp +++ b/src/core/hle/service/nvflinger/buffer_queue.cpp @@ -15,7 +15,7 @@ namespace Service::NVFlinger { BufferQueue::BufferQueue(Kernel::KernelCore& kernel, u32 id, u64 layer_id) - : id(id), layer_id(layer_id) { + : id(id), layer_id(layer_id), max_buffer_count(0) { buffer_wait_event = Kernel::WritableEvent::CreateEventPair(kernel, "BufferQueue NativeHandle"); } @@ -33,6 +33,10 @@ void BufferQueue::SetPreallocatedBuffer(u32 slot, const IGBPBuffer& igbp_buffer) buffer_wait_event.writable->Signal(); } +void BufferQueue::SetBufferCount(u32 bufferCount) { + max_buffer_count = bufferCount; +} + std::optional> BufferQueue::DequeueBuffer(u32 width, u32 height) { auto itr = std::find_if(queue.begin(), queue.end(), [&](const Buffer& buffer) { @@ -47,6 +51,9 @@ std::optional> BufferQueue::Dequeue }); if (itr == queue.end()) { + if (queue.size() < max_buffer_count) { + // TODO: Actually implement that create a new IGBPBuffer from GPU + } return {}; } diff --git a/src/core/hle/service/nvflinger/buffer_queue.h b/src/core/hle/service/nvflinger/buffer_queue.h index f4bbfd9452..8eec746b65 100644 --- a/src/core/hle/service/nvflinger/buffer_queue.h +++ b/src/core/hle/service/nvflinger/buffer_queue.h @@ -79,6 +79,7 @@ public: }; void SetPreallocatedBuffer(u32 slot, const IGBPBuffer& igbp_buffer); + void SetBufferCount(u32 bufferCount); std::optional> DequeueBuffer(u32 width, u32 height); const IGBPBuffer& RequestBuffer(u32 slot) const; @@ -104,6 +105,7 @@ private: std::vector queue; std::list queue_sequence; Kernel::EventPair buffer_wait_event; + u32 max_buffer_count; }; } // namespace Service::NVFlinger diff --git a/src/core/hle/service/vi/vi.cpp b/src/core/hle/service/vi/vi.cpp index 519da74e08..bac39b0714 100644 --- a/src/core/hle/service/vi/vi.cpp +++ b/src/core/hle/service/vi/vi.cpp @@ -379,6 +379,28 @@ protected: NVFlinger::IGBPBuffer buffer; }; +class IGBPSetBufferCountRequestParcel : public Parcel { +public: + explicit IGBPSetBufferCountRequestParcel(std::vector buffer) : Parcel(std::move(buffer)) { + Deserialize(); + } + ~IGBPSetBufferCountRequestParcel() override = default; + + void DeserializeData() override { + std::u16string token = ReadInterfaceToken(); + count = Read(); + } + + u32_le count; +}; + +class IGBPSetBufferCountResponseParcel : public Parcel { +protected: + void SerializeData() override { + Write(0); + } +}; + class IGBPQueueBufferRequestParcel : public Parcel { public: explicit IGBPQueueBufferRequestParcel(std::vector buffer) : Parcel(std::move(buffer)) { @@ -588,6 +610,13 @@ private: IGBPEmptyResponseParcel response{}; ctx.WriteBuffer(response.Serialize()); + } else if (transaction == TransactionId::SetBufferCount) { + IGBPSetBufferCountRequestParcel request{ctx.ReadBuffer()}; + + buffer_queue.SetBufferCount(request.count); + + IGBPSetBufferCountResponseParcel response{}; + ctx.WriteBuffer(response.Serialize()); } else { ASSERT_MSG(false, "Unimplemented"); }