Просмотр исходного кода

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

Fernando Sahmkow 7 лет назад
Родитель
Сommit
ea97589624

+ 9 - 3
src/core/hle/service/nvflinger/buffer_queue.cpp

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

+ 2 - 0
src/core/hle/service/nvflinger/buffer_queue.h

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