summaryrefslogtreecommitdiffstats
path: root/src/render/backend
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2016-01-21 13:08:32 +0100
committerPaul Lemire <paul.lemire@kdab.com>2016-01-22 14:29:17 +0000
commit31e4d157c6b0af0c04546af643707a3811583455 (patch)
tree4f5c13cfea1b61a2fb03596ac3c5785e5bbb3b7b /src/render/backend
parent58cd67f452433027e1db6271e633460ad8cf2bd8 (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.cpp33
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);