diff options
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 |