diff options
author | Sean Harmer <sean.harmer@kdab.com> | 2016-05-16 11:58:14 +0100 |
---|---|---|
committer | Sean Harmer <sean.harmer@kdab.com> | 2016-05-18 15:56:58 +0000 |
commit | 662be35bc6e288a25756eb2ee87349f099e7a8a7 (patch) | |
tree | 9b0864463570efac7440cca705d695d832e31bf2 /src/render/frontend | |
parent | bae68996a6ba55643874ea1e2c1e0bd71ef889c7 (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.cpp | 20 |
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; } |