nvflinger: Acquire buffers in the same order as they were queued.

This commit is contained in:
Fernando Sahmkow 2019-06-10 22:58:20 -04:00 committed by FernandoS27
parent 24408cce9b
commit ea97589624
2 changed files with 11 additions and 3 deletions

View File

@ -75,12 +75,18 @@ void BufferQueue::QueueBuffer(u32 slot, BufferTransformFlags transform,
itr->crop_rect = crop_rect; itr->crop_rect = crop_rect;
itr->swap_interval = swap_interval; itr->swap_interval = swap_interval;
itr->multi_fence = multi_fence; itr->multi_fence = multi_fence;
queue_sequence.push_back(slot);
} }
std::optional<std::reference_wrapper<const BufferQueue::Buffer>> BufferQueue::AcquireBuffer() { std::optional<std::reference_wrapper<const BufferQueue::Buffer>> BufferQueue::AcquireBuffer() {
auto itr = std::find_if(queue.begin(), queue.end(), [](const Buffer& buffer) { std::vector<Buffer>::iterator itr = queue.end();
return buffer.status == Buffer::Status::Queued; while (itr == queue.end() && !queue_sequence.empty()) {
u32 slot = queue_sequence.front();
itr = std::find_if(queue.begin(), queue.end(), [&slot](const Buffer& buffer) {
return buffer.status == Buffer::Status::Queued && buffer.slot == slot;
}); });
queue_sequence.pop_front();
}
if (itr == queue.end()) if (itr == queue.end())
return {}; return {};
itr->status = Buffer::Status::Acquired; itr->status = Buffer::Status::Acquired;

View File

@ -6,6 +6,7 @@
#include <optional> #include <optional>
#include <vector> #include <vector>
#include <list>
#include "common/common_funcs.h" #include "common/common_funcs.h"
#include "common/math_util.h" #include "common/math_util.h"
@ -97,6 +98,7 @@ private:
u64 layer_id; u64 layer_id;
std::vector<Buffer> queue; std::vector<Buffer> queue;
std::list<u32> queue_sequence;
Kernel::EventPair buffer_wait_event; Kernel::EventPair buffer_wait_event;
}; };