summaryrefslogtreecommitdiffstats
path: root/src/render/frontend
diff options
context:
space:
mode:
authorSean Harmer <sean.harmer@kdab.com>2016-05-16 11:58:14 +0100
committerSean Harmer <sean.harmer@kdab.com>2016-05-18 15:56:58 +0000
commit662be35bc6e288a25756eb2ee87349f099e7a8a7 (patch)
tree9b0864463570efac7440cca705d695d832e31bf2 /src/render/frontend
parentbae68996a6ba55643874ea1e2c1e0bd71ef889c7 (diff)
Handle renderer shutdown request and assert in render aspect dtor
If the render aspect is deleted without having been unregistered by the aspect engine, something has gone wrong. Assert on this in the dtor. Renderer::shutdown() just requests the render thread to exit. When using a threaded renderer we also have to wake up the render thread by releasing the renderview semaphore which it may be waiting to acquire in Renderer::isReadyToSubmit(). As shutdown() only requests renderer shutdown, we introduce a function specifically for performing OpenGL (or other graphics API) resource freeing. This is called when exiting the render thread in the case of threaded rendering, and directly in the case of synchronous rendering. Task-number: QTBUG-50044 Task-number: QTBUG-51035 Change-Id: Ie3a5b2aa9f64c7aeebecedd6a56c29816532f126 Reviewed-by: Janne Koskinen <janne.p.koskinen@theqtcompany.com> Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
Diffstat (limited to 'src/render/frontend')
-rw-r--r--src/render/frontend/qrenderaspect.cpp20
1 files changed, 16 insertions, 4 deletions
diff --git a/src/render/frontend/qrenderaspect.cpp b/src/render/frontend/qrenderaspect.cpp
index 4c4661d4c..fac2687bb 100644
--- a/src/render/frontend/qrenderaspect.cpp
+++ b/src/render/frontend/qrenderaspect.cpp
@@ -168,15 +168,18 @@ QRenderAspectPrivate::QRenderAspectPrivate(QRenderAspect::RenderType type)
// All world stuff depends on the RenderEntity's localBoundingVolume
m_worldTransformJob->addDependency(m_calculateBoundingVolumeJob);
- // Create property renderer implementation given
- // a targeted rendering API -> only OpenGL for now
+ // Create a renderer implementation given
+ // a specific rendering API -> only OpenGL for now
m_renderer = new Render::Renderer(type);
m_renderer->setNodeManagers(m_nodeManagers);
}
QRenderAspectPrivate::~QRenderAspectPrivate()
{
- delete m_renderer;
+ // The renderer should have been shutdown as part of onUnregistered().
+ // If it still exists then this aspect is being deleted before the aspect
+ // engine is finished with it.
+ Q_ASSERT(m_renderer == nullptr);
delete m_nodeManagers;
}
@@ -421,8 +424,17 @@ void QRenderAspect::onRegistered()
void QRenderAspect::onUnregistered()
{
Q_D(QRenderAspect);
- if (d->m_renderer)
+ if (d->m_renderer) {
+ // Request the renderer shuts down. In the threaded renderer case, the
+ // Renderer destructor is the synchronization point where we wait for the
+ // thread to join (see below).
+ d->m_renderer->shutdown();
+
+ // Free the per-thread threadpool allocators
d->m_renderer->destroyAllocators(d->jobManager());
+ }
+
+ // Waits for the render thread to join (if using threaded renderer)
delete d->m_renderer;
d->m_renderer = nullptr;
}