renderer: skip ds commits if buffer didn't change (#9556)

this fixes direct scanout glitches by ensuring that attemptDirectScanout doesn't try to recommit the same buffer to AQ
which would cause a pageflip event and the backendRelease to release the same buffer too early
This commit is contained in:
Ikalco
2025-03-08 13:24:22 -06:00
committed by GitHub
parent f15b49e0fd
commit d30cc19d25
5 changed files with 54 additions and 61 deletions

View File

@@ -439,9 +439,8 @@ void CWLSurfaceResource::unlockPendingState() {
}
void CWLSurfaceResource::commitPendingState() {
static auto PDROP = CConfigValue<Hyprlang::INT>("render:allow_early_buffer_release");
auto const previousBuffer = current.buffer;
current = pending;
static auto PDROP = CConfigValue<Hyprlang::INT>("render:allow_early_buffer_release");
current = pending;
pending.damage.clear();
pending.bufferDamage.clear();
pending.newBuffer = false;
@@ -495,15 +494,6 @@ void CWLSurfaceResource::commitPendingState() {
nullptr);
}
// for async buffers, we can only release the buffer once we are unrefing it from current.
// if the backend took it, ref it with the lambda. Otherwise, the end of this scope will release it.
if (previousBuffer && previousBuffer->buffer && !previousBuffer->buffer->isSynchronous()) {
if (previousBuffer->buffer->lockedByBackend && !previousBuffer->buffer->hlEvents.backendRelease) {
previousBuffer->buffer->lock();
previousBuffer->buffer->unlockOnBufferRelease(self);
}
}
lastBuffer = current.buffer ? current.buffer->buffer : WP<IHLBuffer>{};
}