summaryrefslogtreecommitdiffstats
path: root/src/quick3d/imports/scene3d/scene3drenderer.cpp
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2016-09-05 09:13:43 +0200
committerPaul Lemire <paul.lemire@kdab.com>2016-11-23 20:22:55 +0000
commita9e94b547f140c5bcdf7abef923fff37035f4b90 (patch)
treec077f4970f7f43641707849a65cac9cd3d1c4bc3 /src/quick3d/imports/scene3d/scene3drenderer.cpp
parentd0fc03f301cb3bbd69d9e43cd6a984cbc8296d05 (diff)
Scene3DRenderer::render: simplified code paths
Change-Id: Ibff5d4798430ef239f0d38ac106fc05e95a70350 Reviewed-by: Kevin Ottens <kevin.ottens@kdab.com>
Diffstat (limited to 'src/quick3d/imports/scene3d/scene3drenderer.cpp')
-rw-r--r--src/quick3d/imports/scene3d/scene3drenderer.cpp47
1 files changed, 19 insertions, 28 deletions
diff --git a/src/quick3d/imports/scene3d/scene3drenderer.cpp b/src/quick3d/imports/scene3d/scene3drenderer.cpp
index 326ba0c8f..01e8d9ca2 100644
--- a/src/quick3d/imports/scene3d/scene3drenderer.cpp
+++ b/src/quick3d/imports/scene3d/scene3drenderer.cpp
@@ -129,6 +129,7 @@ Scene3DRenderer::Scene3DRenderer(Scene3DItem *item, Qt3DCore::QAspectEngine *asp
QObject::connect(m_item->window(), &QQuickWindow::beforeRendering, this, &Scene3DRenderer::render, Qt::DirectConnection);
QObject::connect(m_item, &QQuickItem::windowChanged, this, &Scene3DRenderer::onWindowChangedQueued, Qt::QueuedConnection);
+ Q_ASSERT(QOpenGLContext::currentContext());
ContextSaver saver;
static_cast<QRenderAspectPrivate*>(QRenderAspectPrivate::get(m_renderAspect))->renderInitialize(saver.context());
scheduleRootEntityChange();
@@ -233,17 +234,17 @@ void Scene3DRenderer::render()
const QSize boundingRectSize = m_item->boundingRect().size().toSize();
const QSize currentSize = boundingRectSize * window->effectiveDevicePixelRatio();
- const bool forceRecreate = currentSize != m_lastSize || m_multisample != m_lastMultisample;
+ const bool sizeHasChanged = currentSize != m_lastSize;
+ const bool multisampleHasChanged = m_multisample != m_lastMultisample;
+ const bool forceRecreate = sizeHasChanged || multisampleHasChanged;
- if (currentSize != m_lastSize)
+ if (sizeHasChanged)
m_item->setItemArea(boundingRectSize);
// Rebuild FBO and textures if never created or a resize has occurred
if ((m_multisampledFBO.isNull() || forceRecreate) && m_multisample) {
- qCDebug(Scene3D) << Q_FUNC_INFO << "Creating multisample framebuffer";
m_multisampledFBO.reset(createMultisampledFramebufferObject(currentSize));
if (m_multisampledFBO->format().samples() == 0 || !QOpenGLFramebufferObject::hasOpenGLFramebufferBlit()) {
- qCDebug(Scene3D) << Q_FUNC_INFO << "Failed to create multisample framebuffer";
m_multisample = false;
m_multisampledFBO.reset(nullptr);
}
@@ -260,18 +261,21 @@ void Scene3DRenderer::render()
m_lastSize = currentSize;
m_lastMultisample = m_multisample;
- //Only try to use MSAA when available
- if (m_multisample) {
- // Bind FBO
+ // Bind FBO
+ if (m_multisample) //Only try to use MSAA when available
m_multisampledFBO->bind();
+ else
+ m_finalFBO->bind();
- // Render Qt3D Scene
- static_cast<QRenderAspectPrivate*>(QRenderAspectPrivate::get(m_renderAspect))->renderSynchronous();
+ // Render Qt3D Scene
+ static_cast<QRenderAspectPrivate*>(QRenderAspectPrivate::get(m_renderAspect))->renderSynchronous();
- // We may have called doneCurrent() so restore the context.
- if (saver.context()->surface() != saver.surface())
- saver.context()->makeCurrent(saver.surface());
+ // We may have called doneCurrent() so restore the context if the rendering surface was changed
+ // Note: keep in mind that the ContextSave also restores the surface when destroyed
+ if (saver.context()->surface() != saver.surface())
+ saver.context()->makeCurrent(saver.surface());
+ if (m_multisample) {
// Blit multisampled FBO with non multisampled FBO with texture attachment
const QRect dstRect(QPoint(0, 0), m_finalFBO->size());
const QRect srcRect(QPoint(0, 0), m_multisampledFBO->size());
@@ -281,24 +285,11 @@ void Scene3DRenderer::render()
GL_NEAREST,
0, 0,
QOpenGLFramebufferObject::DontRestoreFramebufferBinding);
-
- // Restore QtQuick FBO
- m_multisampledFBO->bindDefault();
- } else {
- // Bind FBO
- m_finalFBO->bind();
-
- // Render Qt3D Scene
- static_cast<QRenderAspectPrivate*>(QRenderAspectPrivate::get(m_renderAspect))->renderSynchronous();
-
- // We may have called doneCurrent() so restore the context.
- if (saver.context()->surface() != saver.surface())
- saver.context()->makeCurrent(saver.surface());
-
- // Restore QtQuick FBO
- m_finalFBO->bindDefault();
}
+ // Restore QtQuick FBO
+ QOpenGLFramebufferObject::bindDefault();
+
// Reset the state used by the Qt Quick scenegraph to avoid any
// interference when rendering the rest of the UI.
window->resetOpenGLState();