Compare commits

...

1 Commits

Author SHA1 Message Date
Lee, Joong-Ho
82462584bf Implementing SetBufferCount in BufferQueue 2020-03-21 17:44:47 +09:00
3 changed files with 39 additions and 1 deletions

View File

@@ -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 {};
}

View File

@@ -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

View File

@@ -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");
}