diff options
Diffstat (limited to 'src/widgets/kernel/qopenglwidget.cpp')
-rw-r--r-- | src/widgets/kernel/qopenglwidget.cpp | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/src/widgets/kernel/qopenglwidget.cpp b/src/widgets/kernel/qopenglwidget.cpp index 92f6066936..65a70ceb02 100644 --- a/src/widgets/kernel/qopenglwidget.cpp +++ b/src/widgets/kernel/qopenglwidget.cpp @@ -559,7 +559,8 @@ public: flushPending(false), paintDevice(0), updateBehavior(QOpenGLWidget::NoPartialUpdate), - requestedSamples(0) + requestedSamples(0), + inPaintGL(false) { requestedFormat = QSurfaceFormat::defaultFormat(); } @@ -602,6 +603,7 @@ public: QSurfaceFormat requestedFormat; QOpenGLWidget::UpdateBehavior updateBehavior; int requestedSamples; + bool inPaintGL; }; void QOpenGLWidgetPaintDevicePrivate::beginPaint() @@ -823,7 +825,9 @@ void QOpenGLWidgetPrivate::invokeUserPaint() QOpenGLContextPrivate::get(ctx)->defaultFboRedirect = fbo->handle(); f->glViewport(0, 0, q->width() * q->devicePixelRatioF(), q->height() * q->devicePixelRatioF()); + inPaintGL = true; q->paintGL(); + inPaintGL = false; flushPending = true; QOpenGLContextPrivate::get(ctx)->defaultFboRedirect = 0; @@ -870,12 +874,25 @@ QImage QOpenGLWidgetPrivate::grabFramebuffer() if (!initialized) return QImage(); - render(); - resolveSamples(); - q->makeCurrent(); + if (!inPaintGL) + render(); + + if (resolvedFbo) { + resolveSamples(); + resolvedFbo->bind(); + } else { + q->makeCurrent(); + } + QImage res = qt_gl_read_framebuffer(q->size() * q->devicePixelRatioF(), false, false); res.setDevicePixelRatio(q->devicePixelRatioF()); + // While we give no guarantees of what is going to be left bound, prefer the + // multisample fbo instead of the resolved one. Clients may continue to + // render straight after calling this function. + if (resolvedFbo) + q->makeCurrent(); + return res; } |