platforms/drm: Fix crash in EglGbmBackend::presentOnOutput()
If the damage history is empty and EGL_KHR_partial_update is supported, kwin may crash.
This commit is contained in:
parent
91f47c9092
commit
913d242bd9
1 changed files with 3 additions and 3 deletions
|
@ -584,7 +584,7 @@ bool EglGbmBackend::presentOnOutput(Output &output, const QRegion &damagedRegion
|
||||||
output.buffer = QSharedPointer<DrmSurfaceBuffer>::create(m_gpu, output.directScanoutBuffer, output.bufferInterface);
|
output.buffer = QSharedPointer<DrmSurfaceBuffer>::create(m_gpu, output.directScanoutBuffer, output.bufferInterface);
|
||||||
} else if (isPrimary()) {
|
} else if (isPrimary()) {
|
||||||
if (supportsSwapBuffersWithDamage()) {
|
if (supportsSwapBuffersWithDamage()) {
|
||||||
QVector<EGLint> rects = regionToRects(output.damageHistory.constFirst(), output.output);
|
QVector<EGLint> rects = regionToRects(damagedRegion, output.output);
|
||||||
if (!eglSwapBuffersWithDamageEXT(eglDisplay(), output.eglSurface,
|
if (!eglSwapBuffersWithDamageEXT(eglDisplay(), output.eglSurface,
|
||||||
rects.data(), rects.count() / 4)) {
|
rects.data(), rects.count() / 4)) {
|
||||||
qCCritical(KWIN_DRM, "eglSwapBuffersWithDamageEXT() failed: %x", eglGetError());
|
qCCritical(KWIN_DRM, "eglSwapBuffersWithDamageEXT() failed: %x", eglGetError());
|
||||||
|
@ -676,7 +676,8 @@ void EglGbmBackend::endFrame(int screenId, const QRegion &renderedRegion,
|
||||||
|
|
||||||
renderFramebufferToSurface(output);
|
renderFramebufferToSurface(output);
|
||||||
|
|
||||||
if (!presentOnOutput(output, damagedRegion)) {
|
const QRegion dirty = damagedRegion.intersected(output.output->geometry());
|
||||||
|
if (!presentOnOutput(output, dirty)) {
|
||||||
output.damageHistory.clear();
|
output.damageHistory.clear();
|
||||||
RenderLoopPrivate *renderLoopPrivate = RenderLoopPrivate::get(drmOutput->renderLoop());
|
RenderLoopPrivate *renderLoopPrivate = RenderLoopPrivate::get(drmOutput->renderLoop());
|
||||||
renderLoopPrivate->notifyFrameFailed();
|
renderLoopPrivate->notifyFrameFailed();
|
||||||
|
@ -684,7 +685,6 @@ void EglGbmBackend::endFrame(int screenId, const QRegion &renderedRegion,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (supportsBufferAge()) {
|
if (supportsBufferAge()) {
|
||||||
const QRegion dirty = damagedRegion.intersected(output.output->geometry());
|
|
||||||
if (output.damageHistory.count() > 10) {
|
if (output.damageHistory.count() > 10) {
|
||||||
output.damageHistory.removeLast();
|
output.damageHistory.removeLast();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue