From 6c998fc6688b54769c99f884f3f9681752bbe4ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20L=C3=BCbking?= Date: Thu, 28 Mar 2013 22:26:47 +0100 Subject: [PATCH] manage triple buffering REVIEW: 110556 --- eglonxbackend.cpp | 11 ++++++++--- glxbackend.cpp | 14 +++++++++----- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/eglonxbackend.cpp b/eglonxbackend.cpp index 733a6bc0c3..331574a46a 100644 --- a/eglonxbackend.cpp +++ b/eglonxbackend.cpp @@ -258,6 +258,9 @@ bool EglOnXBackend::initBufferConfigs() void EglOnXBackend::present() { + if (lastDamage().isEmpty()) + return; + const QRegion displayRegion(0, 0, displayWidth(), displayHeight()); const bool fullRepaint = (lastDamage() == displayRegion); @@ -301,16 +304,18 @@ SceneOpenGL::TexturePrivate *EglOnXBackend::createBackendTexture(SceneOpenGL::Te void EglOnXBackend::prepareRenderingFrame() { - if (!lastDamage().isEmpty()) - present(); - eglWaitNative(EGL_CORE_NATIVE_ENGINE); + present(); startRenderTimer(); + eglWaitNative(EGL_CORE_NATIVE_ENGINE); } void EglOnXBackend::endRenderingFrame(const QRegion &damage) { setLastDamage(damage); glFlush(); + if (!blocksForRetrace()) { + present(); // this sets lastDamage emtpy and prevents execution from prepareRenderingFrame() + } if (overlayWindow()->window()) // show the window only after the first pass, overlayWindow()->show(); // since that pass may take long diff --git a/glxbackend.cpp b/glxbackend.cpp index 7bfceeec48..4ffe25c057 100644 --- a/glxbackend.cpp +++ b/glxbackend.cpp @@ -407,11 +407,13 @@ void GlxBackend::waitSync() glXWaitVideoSync(1, 0, &sync); #endif } - startRenderTimer(); // yes, the framerate shall be constant anyway. } void GlxBackend::present() { + if (lastDamage().isEmpty()) + return; + const QRegion displayRegion(0, 0, displayWidth(), displayHeight()); const bool fullRepaint = (lastDamage() == displayRegion); @@ -422,7 +424,6 @@ void GlxBackend::present() m_swapProfiler.begin(); } glXSwapBuffers(display(), glxWindow); - startRenderTimer(); if (gs_tripleBufferNeedsDetection) { glXWaitGL(); if (char result = m_swapProfiler.end()) { @@ -431,7 +432,7 @@ void GlxBackend::present() } } } else { - waitSync(); // calls startRenderTimer(); + waitSync(); glXSwapBuffers(display(), glxWindow); } } else if (glXCopySubBuffer) { @@ -472,8 +473,8 @@ SceneOpenGL::TexturePrivate *GlxBackend::createBackendTexture(SceneOpenGL::Textu void GlxBackend::prepareRenderingFrame() { - if (!lastDamage().isEmpty()) - present(); + present(); + startRenderTimer(); glXWaitX(); } @@ -481,6 +482,9 @@ void GlxBackend::endRenderingFrame(const QRegion &damage) { setLastDamage(damage); glFlush(); + if (!blocksForRetrace()) { + present(); // this sets lastDamage emtpy and prevents execution from prepareRenderingFrame() + } if (overlayWindow()->window()) // show the window only after the first pass, overlayWindow()->show(); // since that pass may take long