Implementing SetBufferCount in BufferQueue
This commit is contained in:
@@ -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<std::pair<u32, Service::Nvidia::MultiFence*>> BufferQueue::DequeueBuffer(u32 width,
|
||||
u32 height) {
|
||||
auto itr = std::find_if(queue.begin(), queue.end(), [&](const Buffer& buffer) {
|
||||
@@ -47,6 +51,9 @@ std::optional<std::pair<u32, Service::Nvidia::MultiFence*>> BufferQueue::Dequeue
|
||||
});
|
||||
|
||||
if (itr == queue.end()) {
|
||||
if (queue.size() < max_buffer_count) {
|
||||
// TODO: Actually implement that create a new IGBPBuffer from GPU
|
||||
}
|
||||
return {};
|
||||
}
|
||||
|
||||
|
||||
@@ -79,6 +79,7 @@ public:
|
||||
};
|
||||
|
||||
void SetPreallocatedBuffer(u32 slot, const IGBPBuffer& igbp_buffer);
|
||||
void SetBufferCount(u32 bufferCount);
|
||||
std::optional<std::pair<u32, Service::Nvidia::MultiFence*>> DequeueBuffer(u32 width,
|
||||
u32 height);
|
||||
const IGBPBuffer& RequestBuffer(u32 slot) const;
|
||||
@@ -104,6 +105,7 @@ private:
|
||||
std::vector<Buffer> queue;
|
||||
std::list<u32> queue_sequence;
|
||||
Kernel::EventPair buffer_wait_event;
|
||||
u32 max_buffer_count;
|
||||
};
|
||||
|
||||
} // namespace Service::NVFlinger
|
||||
|
||||
@@ -379,6 +379,28 @@ protected:
|
||||
NVFlinger::IGBPBuffer buffer;
|
||||
};
|
||||
|
||||
class IGBPSetBufferCountRequestParcel : public Parcel {
|
||||
public:
|
||||
explicit IGBPSetBufferCountRequestParcel(std::vector<u8> buffer) : Parcel(std::move(buffer)) {
|
||||
Deserialize();
|
||||
}
|
||||
~IGBPSetBufferCountRequestParcel() override = default;
|
||||
|
||||
void DeserializeData() override {
|
||||
std::u16string token = ReadInterfaceToken();
|
||||
count = Read<u32_le>();
|
||||
}
|
||||
|
||||
u32_le count;
|
||||
};
|
||||
|
||||
class IGBPSetBufferCountResponseParcel : public Parcel {
|
||||
protected:
|
||||
void SerializeData() override {
|
||||
Write<u32>(0);
|
||||
}
|
||||
};
|
||||
|
||||
class IGBPQueueBufferRequestParcel : public Parcel {
|
||||
public:
|
||||
explicit IGBPQueueBufferRequestParcel(std::vector<u8> 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");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user