From 31e4d157c6b0af0c04546af643707a3811583455 Mon Sep 17 00:00:00 2001 From: Paul Lemire Date: Thu, 21 Jan 2016 13:08:32 +0100 Subject: Renderer/Scene3D: fixes to make it work without setData Change-Id: Iec1d3bab2e3a5a25d1cbb5129addebd83b225580 Reviewed-by: Paul Lemire --- src/render/backend/renderer.cpp | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) (limited to 'src/render/backend') 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 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); -- cgit v1.2.3