diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2016-01-21 13:08:32 +0100 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2016-01-22 14:29:17 +0000 |
commit | 31e4d157c6b0af0c04546af643707a3811583455 (patch) | |
tree | 4f5c13cfea1b61a2fb03596ac3c5785e5bbb3b7b /src/render/backend | |
parent | 58cd67f452433027e1db6271e633460ad8cf2bd8 (diff) |
Renderer/Scene3D: fixes to make it work without setData
Change-Id: Iec1d3bab2e3a5a25d1cbb5129addebd83b225580
Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
Diffstat (limited to 'src/render/backend')
-rw-r--r-- | src/render/backend/renderer.cpp | 33 |
1 files changed, 19 insertions, 14 deletions
diff --git a/src/render/backend/renderer.cpp b/src/render/backend/renderer.cpp index 94760bda5..8aac0f6dd 100644 --- a/src/render/backend/renderer.cpp +++ b/src/render/backend/renderer.cpp @@ -569,6 +569,16 @@ void Renderer::doRender() // Render using current device state and renderer configuration const bool submissionSucceeded = submitRenderViews(); + // Note: submitRenderViews returns false when + // * we cannot render because a shutdown has been scheduled + // * the renderview is incomplete (only when rendering with a Scene3D) + // Otherwise returns true even for cases like + // * No render view + // * No surface set + // * OpenGLContext failed to be set current + // This behavior is important as we need to + // call proceedToNextFrame despite rendering errors that aren't fatal + // Only reset renderQueue and proceed to next frame if the submission // succeeded or it we are using a render thread. @@ -641,12 +651,6 @@ bool Renderer::submitRenderViews() // we've been told to render before rendering if (m_renderThread) { // Prevent ouf of order execution m_submitRenderViewsSemaphore.acquire(1); - - // Early return if we have been unlocked because of - // shutdown - if (!m_running.load()) - return false; - // When using Thread rendering, the semaphore should only // be released when the frame queue is complete and there's // something to render @@ -671,6 +675,7 @@ bool Renderer::submitRenderViews() // Lock the mutex to protect access to m_surface and check if we are still set // to the running state and that we have a valid surface on which to draw + // TO DO: Is that still needed given the surface changes QMutexLocker locker(&m_mutex); const QVector<Render::RenderView *> renderViews = m_renderQueue->nextFrameQueue(); if (!canRender()) { @@ -732,7 +737,6 @@ bool Renderer::submitRenderViews() m_graphicsContext->setCurrentStateSet(m_defaultRenderStateSet); } - // Set RenderView render state RenderStateSet *renderViewStateSet = renderView->stateSet(); if (renderViewStateSet) @@ -767,14 +771,15 @@ bool Renderer::submitRenderViews() frameElapsed = timer.elapsed(); } - // Reset state to the default state if the last stateset is not the - // defaultRenderStateSet - if (m_graphicsContext->currentStateSet() != m_defaultRenderStateSet) - m_graphicsContext->setCurrentStateSet(m_defaultRenderStateSet); - - // Finish up with last surface used in the list of RenderViews - m_graphicsContext->endDrawing(boundFboId == m_graphicsContext->defaultFBO()); + if (surface) { + // Reset state to the default state if the last stateset is not the + // defaultRenderStateSet + if (m_graphicsContext->currentStateSet() != m_defaultRenderStateSet) + m_graphicsContext->setCurrentStateSet(m_defaultRenderStateSet); + // Finish up with last surface used in the list of RenderViews + m_graphicsContext->endDrawing(boundFboId == m_graphicsContext->defaultFBO()); + } // Delete all the RenderViews which will clear the allocators // that were used for their allocation qDeleteAll(renderViews); |