blob: 82a04878a85974b6f59eb3648dde9c8eea2c8f86 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
#include "SurfaceStateQueue.hpp"
#include "../core/Compositor.hpp"
#include "SurfaceState.hpp"
CSurfaceStateQueue::CSurfaceStateQueue(WP<CWLSurfaceResource> surf) : m_surface(std::move(surf)) {}
void CSurfaceStateQueue::clear() {
m_queue.clear();
}
WP<SSurfaceState> CSurfaceStateQueue::enqueue(UP<SSurfaceState>&& state) {
return m_queue.emplace_back(std::move(state));
}
void CSurfaceStateQueue::dropState(const WP<SSurfaceState>& state) {
auto it = find(state);
if (it == m_queue.end())
return;
m_queue.erase(it);
}
void CSurfaceStateQueue::lock(const WP<SSurfaceState>& weakState, eLockReason reason) {
ASSERT(reason != LOCK_REASON_NONE);
auto it = find(weakState);
if (it == m_queue.end())
return;
it->get()->lockMask |= reason;
}
void CSurfaceStateQueue::unlock(const WP<SSurfaceState>& state, eLockReason reason) {
ASSERT(reason != LOCK_REASON_NONE);
auto it = find(state);
if (it == m_queue.end())
return;
it->get()->lockMask &= ~reason;
tryProcess();
}
void CSurfaceStateQueue::unlockFirst(eLockReason reason) {
ASSERT(reason != LOCK_REASON_NONE);
for (auto& it : m_queue) {
if ((it->lockMask & reason) != LOCK_REASON_NONE) {
it->lockMask &= ~reason;
break;
}
}
tryProcess();
}
auto CSurfaceStateQueue::find(const WP<SSurfaceState>& state) -> std::deque<UP<SSurfaceState>>::iterator {
if (state.expired())
return m_queue.end();
auto* raw = state.get(); // get raw pointer
for (auto it = m_queue.begin(); it != m_queue.end(); ++it) {
if (it->get() == raw)
return it;
}
return m_queue.end();
}
void CSurfaceStateQueue::tryProcess() {
while (!m_queue.empty()) {
auto& front = m_queue.front();
if (front->lockMask & LOCK_REASON_FIFO && !m_surface->m_current.barrierSet)
front->lockMask &= ~LOCK_REASON_FIFO;
if (front->lockMask != LOCK_REASON_NONE)
return;
m_surface->commitState(*front);
m_queue.pop_front();
}
}
|