diff options
author | Samuel Rødal <samuel.rodal@nokia.com> | 2011-03-29 09:07:49 (GMT) |
---|---|---|
committer | Samuel Rødal <samuel.rodal@nokia.com> | 2011-03-29 09:08:41 (GMT) |
commit | 269b61dd08b7e37445f40e3a1d0854bcf85f445b (patch) | |
tree | 777a49f68be4f2d17447c62ffee05947925bf152 /src/opengl/qwindowsurface_gl.cpp | |
parent | 2ea1c931713ddca8bbc718e7691867ad117d5a6e (diff) | |
download | Qt-269b61dd08b7e37445f40e3a1d0854bcf85f445b.zip Qt-269b61dd08b7e37445f40e3a1d0854bcf85f445b.tar.gz Qt-269b61dd08b7e37445f40e3a1d0854bcf85f445b.tar.bz2 |
Added preserved contents property to QWindowSurface.
Previously we used hasPartialUpdateSupport() to deduce whether the
window surface's contents are preserved when flush is called or not, but
that limits us from fully supporting platforms which might allow partial
updates even though the surface contents aren't preserved on flush.
If hasPreservedContents() returns false, that means a flush of a region
is never allowed without first painting to that region. If
hasPartialUpdateSupport() returns false, the whole window surface must
always be painted whenever an update is requested. Note that
hasPreservedContents() will typically imply hasPartialUpdateSupport(),
but not vice versa.
Reviewed-by: Bjørn Erik Nilsen
Diffstat (limited to 'src/opengl/qwindowsurface_gl.cpp')
-rw-r--r-- | src/opengl/qwindowsurface_gl.cpp | 43 |
1 files changed, 17 insertions, 26 deletions
diff --git a/src/opengl/qwindowsurface_gl.cpp b/src/opengl/qwindowsurface_gl.cpp index eae1c9b..4682d0d 100644 --- a/src/opengl/qwindowsurface_gl.cpp +++ b/src/opengl/qwindowsurface_gl.cpp @@ -338,7 +338,7 @@ struct QGLWindowSurfacePrivate QGLWindowSurfaceGLPaintDevice glDevice; QGLWindowSurface* q_ptr; - bool partialUpdateSupport; + bool swap_region_support; }; QGLFormat QGLWindowSurface::surfaceFormat; @@ -391,7 +391,7 @@ QGLWindowSurface::QGLWindowSurface(QWidget *window) d_ptr->q_ptr = this; d_ptr->geometry_updated = false; d_ptr->did_paint = false; - d_ptr->partialUpdateSupport = false; + d_ptr->swap_region_support = false; } QGLWindowSurface::~QGLWindowSurface() @@ -491,22 +491,10 @@ void QGLWindowSurface::hijackWindow(QWidget *widget) if (haveNOKSwapRegion) qDebug() << "Found EGL_NOK_swap_region2 extension. Using partial updates."; } - bool swapBehaviourPreserved = (ctx->d_func()->eglContext->configAttrib(EGL_SWAP_BEHAVIOR) != EGL_BUFFER_PRESERVED) - || (ctx->d_func()->eglContext->configAttrib(EGL_SURFACE_TYPE)&EGL_SWAP_BEHAVIOR_PRESERVED_BIT); - if (ctx->d_func()->eglContext->configAttrib(EGL_SURFACE_TYPE)&EGL_SWAP_BEHAVIOR_PRESERVED_BIT) { - EGLint swapBehavior; - if (eglQuerySurface(ctx->d_func()->eglContext->display(), ctx->d_func()->eglSurface - , EGL_SWAP_BEHAVIOR, &swapBehavior)) { - swapBehaviourPreserved = (swapBehavior == EGL_BUFFER_PRESERVED); - } - } - if (!swapBehaviourPreserved && !haveNOKSwapRegion) - d_ptr->partialUpdateSupport = false; // Force full-screen updates - else - d_ptr->partialUpdateSupport = true; -#else - d_ptr->partialUpdateSupport = false; + d_ptr->destructive_swap_buffers = !swapBehaviourPreserved; + + d_ptr->swap_region_support = haveNOKSwapRegion; #endif widgetPrivate->extraData()->glContext = ctx; @@ -622,7 +610,7 @@ void QGLWindowSurface::flush(QWidget *widget, const QRegion &rgn, const QPoint & // mistake to call swapBuffers if nothing was painted unless // EGL_BUFFER_PRESERVED is set. This check protects the flush func from // being executed if it's for nothing. - if (!hasPartialUpdateSupport() && !d_ptr->did_paint) + if (!d_ptr->destructive_swap_buffers && !d_ptr->did_paint) return; QWidget *parent = widget->internalWinId() ? widget : widget->nativeParentWidget(); @@ -698,12 +686,12 @@ void QGLWindowSurface::flush(QWidget *widget, const QRegion &rgn, const QPoint & } #endif bool doingPartialUpdate = false; - if (QGLWindowSurface::swapBehavior == QGLWindowSurface::AutomaticSwap) - doingPartialUpdate = hasPartialUpdateSupport() && br.width() * br.height() < parent->geometry().width() * parent->geometry().height() * 0.2; - else if (QGLWindowSurface::swapBehavior == QGLWindowSurface::AlwaysFullSwap) - doingPartialUpdate = false; - else if (QGLWindowSurface::swapBehavior == QGLWindowSurface::AlwaysPartialSwap) - doingPartialUpdate = hasPartialUpdateSupport(); + if (d_ptr->swap_region_support) { + if (QGLWindowSurface::swapBehavior == QGLWindowSurface::AutomaticSwap) + doingPartialUpdate = br.width() * br.height() < parent->geometry().width() * parent->geometry().height() * 0.2; + else if (QGLWindowSurface::swapBehavior == QGLWindowSurface::AlwaysPartialSwap) + doingPartialUpdate = true; + } QGLContext *ctx = reinterpret_cast<QGLContext *>(parent->d_func()->extraData()->glContext); if (widget != window()) { @@ -1168,10 +1156,13 @@ QImage *QGLWindowSurface::buffer(const QWidget *widget) bool QGLWindowSurface::hasPartialUpdateSupport() const { - return d_ptr->partialUpdateSupport; + return !d_ptr->destructive_swap_buffers || d_ptr->swap_region_support; } - +bool QGLWindowSurface::hasPreservedContents() const +{ + return !d_ptr->destructive_swap_buffers; +} QT_END_NAMESPACE |