buffers: revert state merging (#12461)

8e8bfbb0b1 added fifo and merged non
buffer states before comitting them, something about certain xwl non
buffer commits expects a commit to happend and causes regressions as in
low fps.
This commit is contained in:
Tom Englund 2025-11-25 23:51:51 +01:00 committed by GitHub
parent 40d8fa8491
commit 210930bef9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 14 additions and 36 deletions

View file

@ -550,13 +550,6 @@ void CWLSurfaceResource::commitState(SSurfaceState& state) {
nullptr);
}
if (m_current.updated.bits.damage) {
// damage is always relative to the current commit
m_current.updated.bits.damage = false;
m_current.damage.clear();
m_current.bufferDamage.clear();
}
// release the buffer if it's synchronous (SHM) as updateSynchronousTexture() has copied the buffer data to a GPU tex
// if it doesn't have a role, we can't release it yet, in case it gets turned into a cursor.
if (m_current.buffer && m_current.buffer->isSynchronous() && m_role->role() != SURFACE_ROLE_UNASSIGNED)

View file

@ -65,11 +65,8 @@ void SSurfaceState::reset() {
lockMask = LOCK_REASON_NONE;
}
void SSurfaceState::updateFrom(SSurfaceState& ref, bool merge) {
if (merge)
updated.all |= ref.updated.all;
else
updated = ref.updated;
void SSurfaceState::updateFrom(SSurfaceState& ref) {
updated = ref.updated;
if (ref.updated.bits.buffer) {
buffer = ref.buffer;
@ -81,6 +78,10 @@ void SSurfaceState::updateFrom(SSurfaceState& ref, bool merge) {
if (ref.updated.bits.damage) {
damage = ref.damage;
bufferDamage = ref.bufferDamage;
} else {
// damage is always relative to the current commit
damage.clear();
bufferDamage.clear();
}
if (ref.updated.bits.input)

View file

@ -89,7 +89,7 @@ struct SSurfaceState {
void updateSynchronousTexture(SP<CTexture> lastTexture);
// helpers
CRegion accumulateBufferDamage(); // transforms state.damage and merges it into state.bufferDamage
void updateFrom(SSurfaceState& ref, bool merge = false); // updates this state based on a reference state.
void reset(); // resets pending state after commit
CRegion accumulateBufferDamage(); // transforms state.damage and merges it into state.bufferDamage
void updateFrom(SSurfaceState& ref); // updates this state based on a reference state.
void reset(); // resets pending state after commit
};

View file

@ -63,28 +63,12 @@ auto CSurfaceStateQueue::find(const WP<SSurfaceState>& state) -> std::deque<UP<S
}
void CSurfaceStateQueue::tryProcess() {
if (m_queue.empty())
return;
while (!m_queue.empty()) {
auto& front = m_queue.front();
if (front->lockMask != LOCK_REASON_NONE)
return;
auto front = m_queue.begin();
if (front->get()->lockMask != LOCK_REASON_NONE)
return;
auto next = std::next(front);
if (next == m_queue.end()) {
m_surface->commitState(**front);
m_surface->commitState(*front);
m_queue.pop_front();
return;
}
while (!m_queue.empty() && next != m_queue.end() && next->get()->lockMask == LOCK_REASON_NONE && !next->get()->updated.bits.buffer) {
next->get()->updateFrom(**front, true);
m_queue.pop_front();
front = m_queue.begin();
next = std::next(front);
}
m_surface->commitState(**front);
m_queue.pop_front();
}