summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLaszlo Agocs <laszlo.agocs@theqtcompany.com>2015-02-16 10:50:32 +0100
committerSean Harmer <sean.harmer@kdab.com>2015-02-16 12:41:26 +0000
commit6956a3cf9b7121afa33d769d2fd1e9a9ff8b87cc (patch)
treeae519214566634ff36609a4f8ba0031672174a02 /src
parent29d556935f3a85968311bf0d70f41dc1a2a8e4c0 (diff)
Do not build render jobs without a surface
Examples like wireframe tend to crash on exit. This is because the platform surface filter sets the renderer's surface back to null, while we are trying to build some jobs still. Even though everything gets shutdown soon after that, we have to somehow prevent any operations relying on the surface in the meantime. This is also an opportunity to avoid exposing the surface pointer from Renderer. Instead, communicate the surface size to the render views. Change-Id: Ifc739ec50e3f6a67d20bfd0dc1913a12b906a8ab Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Diffstat (limited to 'src')
-rw-r--r--src/render/backend/jobs/renderviewjob.cpp1
-rw-r--r--src/render/backend/jobs/renderviewjob_p.h6
-rw-r--r--src/render/backend/renderer.cpp18
-rw-r--r--src/render/backend/renderer_p.h1
-rw-r--r--src/render/backend/renderview.cpp6
-rw-r--r--src/render/backend/renderview_p.h2
6 files changed, 17 insertions, 17 deletions
diff --git a/src/render/backend/jobs/renderviewjob.cpp b/src/render/backend/jobs/renderviewjob.cpp
index 93d58b2da..c263a66b8 100644
--- a/src/render/backend/jobs/renderviewjob.cpp
+++ b/src/render/backend/jobs/renderviewjob.cpp
@@ -60,6 +60,7 @@ void RenderViewJob::run()
// RenderView should allocate heap resources using only the currentFrameAllocator
renderView->setAllocator(currentFrameAllocator);
renderView->setRenderer(m_renderer);
+ renderView->setSurfaceSize(m_surfaceSize);
renderView->setFrameIndex(m_frameIndex);
// Populate the renderview's configuration from the framegraph
diff --git a/src/render/backend/jobs/renderviewjob_p.h b/src/render/backend/jobs/renderviewjob_p.h
index 249f21d26..2651d4262 100644
--- a/src/render/backend/jobs/renderviewjob_p.h
+++ b/src/render/backend/jobs/renderviewjob_p.h
@@ -40,6 +40,7 @@
#include <Qt3DCore/qaspectjob.h>
#include <Qt3DCore/qframeallocator.h>
#include <QThreadStorage>
+#include <QSize>
QT_BEGIN_NAMESPACE
@@ -54,11 +55,13 @@ class RenderViewJob : public QAspectJob
{
public:
RenderViewJob()
- : m_fgLeaf(0)
+ : m_renderer(0)
+ , m_fgLeaf(0)
, m_index(0)
{}
inline void setRenderer(Renderer *renderer) { m_renderer = renderer; }
+ inline void setSurfaceSize(const QSize &size) { m_surfaceSize = size; }
inline void setFrameGraphLeafNode(FrameGraphNode *fgLeaf)
{
@@ -79,6 +82,7 @@ protected:
private:
Renderer *m_renderer;
+ QSize m_surfaceSize;
FrameGraphNode *m_fgLeaf;
int m_index;
// Indicates which frame out of the maximum number of preprocessing frames
diff --git a/src/render/backend/renderer.cpp b/src/render/backend/renderer.cpp
index 1451253fe..82aef3c0b 100644
--- a/src/render/backend/renderer.cpp
+++ b/src/render/backend/renderer.cpp
@@ -477,11 +477,6 @@ void Renderer::setSurface(QSurface* surface)
m_waitForWindowToBeSetCondition.wakeOne();
}
-QSurface *Renderer::surface() const
-{
- return m_surface;
-}
-
void Renderer::render()
{
// Traversing the framegraph tree from root to lead node
@@ -644,12 +639,12 @@ QVector<QAspectJobPtr> Renderer::createRenderBinJobs()
QVector<QAspectJobPtr> renderBinJobs;
- // We do not create jobs if the graphicContext hasn't been set.
- // That way we will go in submitRenderView which will create the OpenGLContext in the
- // correct thread so that later on Jobs can query for OpenGL Versions, Extensions ...
- FrameGraphVisitor visitor;
- visitor.traverse(frameGraphRoot(), this, &renderBinJobs);
- m_renderQueues->setTargetRenderViewCount(renderBinJobs.size());
+ // Do not create any more jobs when the platform surface is gone.
+ if (m_surface) {
+ FrameGraphVisitor visitor;
+ visitor.traverse(frameGraphRoot(), this, &renderBinJobs);
+ m_renderQueues->setTargetRenderViewCount(renderBinJobs.size());
+ }
return renderBinJobs;
}
@@ -659,6 +654,7 @@ QAspectJobPtr Renderer::createRenderViewJob(FrameGraphNode *node, int submitOrde
{
RenderViewJobPtr job(new RenderViewJob);
job->setRenderer(this);
+ job->setSurfaceSize(m_surface->size());
job->setFrameGraphLeafNode(node);
job->setSubmitOrderIndex(submitOrderIndex);
job->setFrameIndex(m_currentPreprocessingFrameIndex);
diff --git a/src/render/backend/renderer_p.h b/src/render/backend/renderer_p.h
index 6fec608ac..75256a4f7 100644
--- a/src/render/backend/renderer_p.h
+++ b/src/render/backend/renderer_p.h
@@ -189,7 +189,6 @@ public:
inline int cachedFramesCount() const { return m_cachedFramesCount; }
void setSurface(QSurface *s);
- QSurface *surface() const;
void enqueueRenderView(RenderView *renderView, int submitOrder);
void submitRenderViews(int maxFrameCount = -1);
diff --git a/src/render/backend/renderview.cpp b/src/render/backend/renderview.cpp
index 0d73c37a2..606bfea88 100644
--- a/src/render/backend/renderview.cpp
+++ b/src/render/backend/renderview.cpp
@@ -223,8 +223,7 @@ QUniformValue *RenderView::viewportMatrix(const QMatrix4x4 &model) const
// TODO: Can we avoid having to pass the model matrix in to these functions?
Q_UNUSED(model);
QMatrix4x4 viewportMatrix;
- QSize surfaceSize = m_renderer->surface()->size();
- viewportMatrix.viewport(resolveViewport(*m_viewport, surfaceSize));
+ viewportMatrix.viewport(resolveViewport(*m_viewport, m_surfaceSize));
return QUniformValue::fromVariant(QVariant::fromValue(viewportMatrix), m_allocator);
}
@@ -233,8 +232,7 @@ QUniformValue *RenderView::inverseViewportMatrix(const QMatrix4x4 &model) const
{
Q_UNUSED(model);
QMatrix4x4 viewportMatrix;
- QSize surfaceSize = m_renderer->surface()->size();
- viewportMatrix.viewport(resolveViewport(*m_viewport, surfaceSize));
+ viewportMatrix.viewport(resolveViewport(*m_viewport, m_surfaceSize));
QMatrix4x4 inverseViewportMatrix = viewportMatrix.inverted();
return QUniformValue::fromVariant(QVariant::fromValue(inverseViewportMatrix), m_allocator);
diff --git a/src/render/backend/renderview_p.h b/src/render/backend/renderview_p.h
index 207e7dc66..bb24cc67e 100644
--- a/src/render/backend/renderview_p.h
+++ b/src/render/backend/renderview_p.h
@@ -91,6 +91,7 @@ public:
void sort();
inline void setRenderer(Renderer *renderer) { m_renderer = renderer; }
+ inline void setSurfaceSize(const QSize &size) { m_surfaceSize = size; }
inline Renderer *renderer() const { return m_renderer; }
inline void setAllocator(QFrameAllocator *allocator)
@@ -189,6 +190,7 @@ private:
void setShaderAndUniforms(RenderCommand *command, RenderRenderPass *pass, ParameterInfoList &parameters, const QMatrix4x4 &worldTransform);
Renderer *m_renderer;
+ QSize m_surfaceSize;
QFrameAllocator *m_allocator;
// Helps making the size of RenderView smaller