summaryrefslogtreecommitdiffstats
path: root/src/render/backend/jobs
diff options
context:
space:
mode:
authorAndy Nichols <andy.nichols@theqtcompany.com>2015-08-17 10:21:56 +0200
committerAndy Nichols <andy.nichols@theqtcompany.com>2015-08-17 10:22:07 +0200
commit2c4f13290cb9f96184d386c8a3a525569359f553 (patch)
tree89424c7992fee950eb0c06404729d4cbcd12f027 /src/render/backend/jobs
parentb6c0e90171fcddbd71bbdb84aca0b2c0b87149ef (diff)
parente8df467c8d15a203bffaee858dbb93507700eb61 (diff)
Merge remote-tracking branch 'origin/5.5' into dev
Diffstat (limited to 'src/render/backend/jobs')
-rw-r--r--src/render/backend/jobs/framecleanupjob.cpp6
-rw-r--r--src/render/backend/jobs/framepreparationjob.cpp30
-rw-r--r--src/render/backend/jobs/framepreparationjob_p.h4
-rw-r--r--src/render/backend/jobs/loadbufferjob.cpp (renamed from src/render/backend/jobs/loadmeshdatajob.cpp)64
-rw-r--r--src/render/backend/jobs/loadbufferjob_p.h (renamed from src/render/backend/jobs/loadmeshdatajob_p.h)34
-rw-r--r--src/render/backend/jobs/loadgeometryjob.cpp68
-rw-r--r--src/render/backend/jobs/loadgeometryjob_p.h74
-rw-r--r--src/render/backend/jobs/loadtexturedatajob.cpp42
-rw-r--r--src/render/backend/jobs/render-jobs.pri10
-rw-r--r--src/render/backend/jobs/renderviewjob.cpp6
-rw-r--r--src/render/backend/jobs/renderviewjob_p.h6
-rw-r--r--src/render/backend/jobs/renderviewjobutils.cpp17
12 files changed, 245 insertions, 116 deletions
diff --git a/src/render/backend/jobs/framecleanupjob.cpp b/src/render/backend/jobs/framecleanupjob.cpp
index 06b7b2ffb..b1d909626 100644
--- a/src/render/backend/jobs/framecleanupjob.cpp
+++ b/src/render/backend/jobs/framecleanupjob.cpp
@@ -39,6 +39,7 @@
#include <private/renderentity_p.h>
#include <private/rendershaderdata_p.h>
#include <private/managers_p.h>
+#include <private/texturedatamanager_p.h>
QT_BEGIN_NAMESPACE
@@ -64,7 +65,10 @@ void FrameCleanupJob::run()
shaderData->clearUpdate();
}
RenderShaderData::clearShaderDataList();
- // TO DO: Add anything that should be clean after all RenderViewJobs have been executed
+
+ // Cleanup texture handles
+ TextureDataManager *textureDataManager = m_renderer->textureDataManager();
+ textureDataManager->cleanup();
}
} // Render
diff --git a/src/render/backend/jobs/framepreparationjob.cpp b/src/render/backend/jobs/framepreparationjob.cpp
index 3a77ec67f..c402783cc 100644
--- a/src/render/backend/jobs/framepreparationjob.cpp
+++ b/src/render/backend/jobs/framepreparationjob.cpp
@@ -37,9 +37,7 @@
#include "framepreparationjob_p.h"
#include <Qt3DRenderer/private/renderer_p.h>
#include <Qt3DRenderer/private/renderentity_p.h>
-#include <Qt3DRenderer/private/rendermesh_p.h>
#include <Qt3DRenderer/private/rendershaderdata_p.h>
-#include <Qt3DRenderer/qmeshdata.h>
#include <Qt3DRenderer/sphere.h>
QT_BEGIN_NAMESPACE
@@ -48,9 +46,8 @@ namespace Qt3D {
namespace Render {
-FramePreparationJob::FramePreparationJob(Renderer *renderer, RenderEntity *root)
- : m_renderer(renderer)
- , m_root(root)
+FramePreparationJob::FramePreparationJob(RenderEntity *root)
+ : m_root(root)
{
}
@@ -67,18 +64,19 @@ void FramePreparationJob::run()
void FramePreparationJob::parseNodeTree(RenderEntity *node)
{
// Initialize worldBoundingVolume if Mesh associated
- Qt3D::Render::RenderMesh *mesh = Q_NULLPTR;
+ Qt3D::Render::RenderGeometryRenderer *mesh = Q_NULLPTR;
if ((node->localBoundingVolume()->isNull())
- && (mesh = node->renderComponent<RenderMesh>()) != Q_NULLPTR) {
- if (!mesh->meshDataHandle().isNull()) {
- Qt3D::QMeshData *meshData = mesh->meshData();
- if (meshData != Q_NULLPTR) {
- const QAxisAlignedBoundingBox box = meshData->boundingBox();
- node->localBoundingVolume()->setCenter(box.center());
- const QVector3D &radii = box.radii();
- node->localBoundingVolume()->setRadius(qMax(radii.x(), qMax(radii.y(), radii.z())));
- }
- }
+ && (mesh = node->renderComponent<RenderGeometryRenderer>()) != Q_NULLPTR) {
+ // if (!mesh->meshDataHandle().isNull()) {
+ // Qt3D::QMeshData *meshData = mesh->meshData();
+ // if (meshData != Q_NULLPTR) {
+ // const QAxisAlignedBoundingBox box = meshData->boundingBox();
+ // node->localBoundingVolume()->setCenter(box.center());
+ // const QVector3D &radii = box.radii();
+ // node->localBoundingVolume()->setRadius(qMax(radii.x(), qMax(radii.y(), radii.z())));
+ // }
+ // }
+ // TO DO: Make that work with the GeometryRenderer
}
// Update transform properties in RenderShaderData
diff --git a/src/render/backend/jobs/framepreparationjob_p.h b/src/render/backend/jobs/framepreparationjob_p.h
index 6f83400c7..3ed69ad63 100644
--- a/src/render/backend/jobs/framepreparationjob_p.h
+++ b/src/render/backend/jobs/framepreparationjob_p.h
@@ -51,17 +51,15 @@ class RenderEntity;
class FramePreparationJob : public Qt3D::QAspectJob
{
public:
- FramePreparationJob(Renderer *renderer, RenderEntity *root);
+ FramePreparationJob(RenderEntity *root);
~FramePreparationJob();
protected:
void run() Q_DECL_FINAL;
private:
-
void parseNodeTree(RenderEntity *node);
- Renderer *m_renderer;
RenderEntity *m_root;
};
diff --git a/src/render/backend/jobs/loadmeshdatajob.cpp b/src/render/backend/jobs/loadbufferjob.cpp
index 1e1266b09..8bcdf4347 100644
--- a/src/render/backend/jobs/loadmeshdatajob.cpp
+++ b/src/render/backend/jobs/loadbufferjob.cpp
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB).
+** Copyright (C) 2015 Paul Lemire
** Contact: http://www.qt-project.org/legal
**
** This file is part of the Qt3D module of the Qt Toolkit.
@@ -34,63 +34,39 @@
**
****************************************************************************/
-#include "loadmeshdatajob_p.h"
-
-#include <qattribute.h>
-#include <qmesh.h>
-#include <sphere.h>
+#include "loadbufferjob_p.h"
+#include <Qt3DRenderer/private/renderbuffer_p.h>
+#include <Qt3DRenderer/private/buffermanager_p.h>
#include <Qt3DRenderer/private/renderer_p.h>
-#include <Qt3DRenderer/private/managers_p.h>
-#include <Qt3DRenderer/private/meshdatamanager_p.h>
-#include <Qt3DRenderer/private/renderlogging_p.h>
-
-#include <QThread>
QT_BEGIN_NAMESPACE
namespace Qt3D {
+
namespace Render {
-LoadMeshDataJob::LoadMeshDataJob(QAbstractMeshFunctorPtr functor, const QNodeId &meshUuid)
+
+LoadBufferJob::LoadBufferJob(const HBuffer &handle)
: QAspectJob()
- , m_meshUuid(meshUuid)
- , m_functor(functor)
+ , m_handle(handle)
+ , m_renderer(Q_NULLPTR)
{
}
-void LoadMeshDataJob::run()
+LoadBufferJob::~LoadBufferJob()
{
- qCDebug(Jobs) << "Entering" << Q_FUNC_INFO << QThread::currentThread();
-
- if (m_functor.isNull())
- return ;
-
- QMutexLocker lock(m_renderer->mutex());
- HMeshData meshDataHandle = m_renderer->meshDataManager()->meshDataFromFunctor(m_functor);
- lock.unlock();
+}
- if (meshDataHandle.isNull()) {
- // Load the mesh from disk (or wherever)
- QMeshDataPtr meshDataPtr = m_functor->operator ()().staticCast<QMeshData>();
- if (meshDataPtr.isNull()) {
- qCDebug(Jobs) << Q_FUNC_INFO << "Mesh has no raw data";
- return ;
- }
- // TO DO try to use QAbstractMeshData if possible
- lock.relock();
- meshDataHandle = m_renderer->meshDataManager()->acquire();
- QMeshData *meshData = m_renderer->meshDataManager()->data(meshDataHandle);
- *meshData = *(meshDataPtr.data());
- m_renderer->meshDataManager()->addMeshDataForFunctor(meshDataHandle, m_functor);
- AttributePtr attr = meshData->attributeByName(QMeshData::defaultPositionAttributeName()).staticCast<Attribute>();
- if (!attr)
- qCWarning(Jobs) << Q_FUNC_INFO << "unknown attribute: position";
- }
- lock.relock();
- m_renderer->meshManager()->lookupResource(m_meshUuid)->setMeshData(meshDataHandle);
+void LoadBufferJob::run()
+{
+ // Let's leave it for the moment until this has been properly tested
+ qDebug() << Q_FUNC_INFO;
+ RenderBuffer *buffer = m_renderer->bufferManager()->data(m_handle);
+ buffer->executeFunctor();
}
-} // namespace Render
-} // namespace Qt3D
+} // Render
+
+} // Qt3D
QT_END_NAMESPACE
diff --git a/src/render/backend/jobs/loadmeshdatajob_p.h b/src/render/backend/jobs/loadbufferjob_p.h
index c8d20ca45..b8e342b90 100644
--- a/src/render/backend/jobs/loadmeshdatajob_p.h
+++ b/src/render/backend/jobs/loadbufferjob_p.h
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB).
+** Copyright (C) 2015 Paul Lemire
** Contact: http://www.qt-project.org/legal
**
** This file is part of the Qt3D module of the Qt Toolkit.
@@ -34,15 +34,12 @@
**
****************************************************************************/
-#ifndef QT3D_RENDER_LOADMESHDATAJOB_H
-#define QT3D_RENDER_LOADMESHDATAJOB_H
+#ifndef QT3D_RENDER_LOADBUFFERJOB_H
+#define QT3D_RENDER_LOADBUFFERJOB_H
-#include <Qt3DCore/qnodeid.h>
-#include <Qt3DCore/qaspectjob.h>
-#include <Qt3DCore/qhandle.h>
-#include <Qt3DRenderer/qmeshdata.h>
-#include <Qt3DRenderer/qabstractmesh.h>
#include <QSharedPointer>
+#include <Qt3DCore/qaspectjob.h>
+#include <Qt3DRenderer/private/handle_types_p.h>
QT_BEGIN_NAMESPACE
@@ -52,25 +49,26 @@ namespace Render {
class Renderer;
-class LoadMeshDataJob : public Qt3D::QAspectJob
+class LoadBufferJob : public Qt3D::QAspectJob
{
public:
- LoadMeshDataJob(QAbstractMeshFunctorPtr functor, const QNodeId &meshUuid);
+ explicit LoadBufferJob(const HBuffer &handle);
+ ~LoadBufferJob();
+
void setRenderer(Renderer *renderer) { m_renderer = renderer; }
+
protected:
void run() Q_DECL_OVERRIDE;
-
-private:
- QNodeId m_meshUuid;
- QAbstractMeshFunctorPtr m_functor;
+ HBuffer m_handle;
Renderer *m_renderer;
};
-typedef QSharedPointer<LoadMeshDataJob> LoadMeshDataJobPtr;
+typedef QSharedPointer<LoadBufferJob> LoadBufferJobPtr;
+
+} // Render
-} // namespace Render
-} // namespace Qt3D
+} // Qt3D
QT_END_NAMESPACE
-#endif // QT3D_RENDER_LOADMESHDATAJOB_H
+#endif // QT3D_RENDER_LOADBUFFERJOB_H
diff --git a/src/render/backend/jobs/loadgeometryjob.cpp b/src/render/backend/jobs/loadgeometryjob.cpp
new file mode 100644
index 000000000..a5efb5d00
--- /dev/null
+++ b/src/render/backend/jobs/loadgeometryjob.cpp
@@ -0,0 +1,68 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 Paul Lemire
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt3D module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "loadgeometryjob_p.h"
+#include <Qt3DRenderer/private/renderer_p.h>
+#include <Qt3DRenderer/private/geometryrenderermanager_p.h>
+
+QT_BEGIN_NAMESPACE
+
+namespace Qt3D {
+
+namespace Render {
+
+LoadGeometryJob::LoadGeometryJob(const HGeometryRenderer &handle)
+ : QAspectJob()
+ , m_handle(handle)
+{
+}
+
+LoadGeometryJob::~LoadGeometryJob()
+{
+}
+
+void LoadGeometryJob::run()
+{
+ RenderGeometryRenderer *geometryRenderer = m_renderer->geometryRendererManager()->data(m_handle);
+ if (geometryRenderer != Q_NULLPTR)
+ geometryRenderer->executeFunctor();
+}
+
+} // Render
+
+} // Qt3D
+
+QT_END_NAMESPACE
diff --git a/src/render/backend/jobs/loadgeometryjob_p.h b/src/render/backend/jobs/loadgeometryjob_p.h
new file mode 100644
index 000000000..6203e7d8a
--- /dev/null
+++ b/src/render/backend/jobs/loadgeometryjob_p.h
@@ -0,0 +1,74 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 Paul Lemire
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt3D module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3D_RENDER_LOADGEOMETRYJOB_H
+#define QT3D_RENDER_LOADGEOMETRYJOB_H
+
+#include <QSharedPointer>
+#include <Qt3DCore/qaspectjob.h>
+#include <Qt3DRenderer/private/handle_types_p.h>
+
+QT_BEGIN_NAMESPACE
+
+namespace Qt3D {
+
+namespace Render {
+
+class Renderer;
+
+class LoadGeometryJob : public QAspectJob
+{
+public:
+ explicit LoadGeometryJob(const HGeometryRenderer &handle);
+ ~LoadGeometryJob();
+
+ void setRenderer(Renderer *renderer) { m_renderer = renderer; }
+
+protected:
+ void run() Q_DECL_OVERRIDE;
+ HGeometryRenderer m_handle;
+ Renderer *m_renderer;
+};
+
+typedef QSharedPointer<LoadGeometryJob> LoadGeometryJobPtr;
+
+} // Render
+
+} // Qt3D
+
+QT_END_NAMESPACE
+
+#endif // QT3D_RENDER_LOADGEOMETRYJOB_H
diff --git a/src/render/backend/jobs/loadtexturedatajob.cpp b/src/render/backend/jobs/loadtexturedatajob.cpp
index d651e5338..7176f7ae2 100644
--- a/src/render/backend/jobs/loadtexturedatajob.cpp
+++ b/src/render/backend/jobs/loadtexturedatajob.cpp
@@ -67,26 +67,34 @@ void LoadTextureDataJob::run()
RenderTextureImage *texImg = m_renderer->textureImageManager()->data(texImgHandle);
if (texImg != Q_NULLPTR && texImg->isDirty() && !texImg->dataFunctor().isNull()) {
QTextureDataFunctorPtr functor = texImg->dataFunctor();
- TextureDataManager::Locker locker(m_renderer->textureDataManager());
- HTextureData textureDataHandle = m_renderer->textureDataManager()->textureDataFromFunctor(functor);
- locker.unlock();
-
+ HTextureData textureDataHandle;
TexImageData *data = Q_NULLPTR;
- // Texture data handle isn't null == there's already a matching TextureData
- if (!textureDataHandle.isNull()) {
- data = m_renderer->textureDataManager()->data(textureDataHandle);
- } else {
- TexImageDataPtr dataPtr = functor->operator ()();
- if (dataPtr.isNull()) {
- qCDebug(Jobs) << Q_FUNC_INFO << "Texture has no raw data";
- } else {
- // Save the TexImageDataPtr with it's functor as a key
- textureDataHandle = m_renderer->textureDataManager()->acquire();
+
+ // scoped for locker
+ {
+ QMutexLocker locker(m_renderer->textureDataManager()->mutex());
+ // We don't want to take the chance of having two jobs uploading the same functor
+ // because of sync issues
+ textureDataHandle = m_renderer->textureDataManager()->textureDataFromFunctor(functor);
+
+ // Texture data handle isn't null == there's already a matching TextureData
+ if (!textureDataHandle.isNull()) {
data = m_renderer->textureDataManager()->data(textureDataHandle);
- locker.relock();
- *data = *(dataPtr.data());
- m_renderer->textureDataManager()->addTextureDataForFunctor(textureDataHandle, functor);
+ } else {
+ TexImageDataPtr dataPtr = functor->operator ()();
+ if (dataPtr.isNull()) {
+ qCDebug(Jobs) << Q_FUNC_INFO << "Texture has no raw data";
+ } else {
+ // Save the TexImageDataPtr with it's functor as a key
+ textureDataHandle = m_renderer->textureDataManager()->acquire();
+ data = m_renderer->textureDataManager()->data(textureDataHandle);
+ *data = *(dataPtr.data());
+ m_renderer->textureDataManager()->addTextureDataForFunctor(textureDataHandle, functor);
+ }
}
+
+ // Update HTextureImage Functor to release TextureData when needed
+ m_renderer->textureDataManager()->assignFunctorToTextureImage(functor, texImgHandle);
}
// Set texture size of texture if the first layer / level / face has a valid size
diff --git a/src/render/backend/jobs/render-jobs.pri b/src/render/backend/jobs/render-jobs.pri
index fefc18001..2c9b93a4e 100644
--- a/src/render/backend/jobs/render-jobs.pri
+++ b/src/render/backend/jobs/render-jobs.pri
@@ -3,21 +3,23 @@ INCLUDEPATH += $$PWD
HEADERS += \
$$PWD/updateworldtransformjob_p.h \
$$PWD/updateboundingvolumejob_p.h \
- $$PWD/loadmeshdatajob_p.h \
$$PWD/renderviewjob_p.h \
$$PWD/renderviewjobutils_p.h \
$$PWD/loadscenejob_p.h \
$$PWD/framecleanupjob_p.h \
$$PWD/framepreparationjob_p.h \
- $$PWD/loadtexturedatajob_p.h
+ $$PWD/loadtexturedatajob_p.h \
+ $$PWD/loadbufferjob_p.h \
+ $$PWD/loadgeometryjob_p.h
SOURCES += \
$$PWD/updateworldtransformjob.cpp \
$$PWD/updateboundingvolumejob.cpp \
- $$PWD/loadmeshdatajob.cpp \
$$PWD/renderviewjob.cpp \
$$PWD/renderviewjobutils.cpp \
$$PWD/loadscenejob.cpp \
$$PWD/framecleanupjob.cpp \
$$PWD/framepreparationjob.cpp \
- $$PWD/loadtexturedatajob.cpp
+ $$PWD/loadtexturedatajob.cpp \
+ $$PWD/loadbufferjob.cpp \
+ $$PWD/loadgeometryjob.cpp
diff --git a/src/render/backend/jobs/renderviewjob.cpp b/src/render/backend/jobs/renderviewjob.cpp
index 9115b90ed..6819aed38 100644
--- a/src/render/backend/jobs/renderviewjob.cpp
+++ b/src/render/backend/jobs/renderviewjob.cpp
@@ -41,7 +41,6 @@
#include <Qt3DRenderer/private/renderviewjobutils_p.h>
#include <Qt3DRenderer/private/renderlogging_p.h>
-
QT_BEGIN_NAMESPACE
namespace Qt3D {
@@ -49,19 +48,18 @@ namespace Render {
void RenderViewJob::run()
{
- qCDebug(Jobs) << Q_FUNC_INFO << m_index << " frame " << m_frameIndex;
+ qCDebug(Jobs) << Q_FUNC_INFO << m_index;
// Create a RenderView object
// The RenderView are created from a QFrameAllocator stored in the current Thread local storage
- QFrameAllocator *currentFrameAllocator = m_renderer->currentFrameAllocator(m_frameIndex);
+ QFrameAllocator *currentFrameAllocator = m_renderer->currentFrameAllocator();
RenderView *renderView = currentFrameAllocator->allocate<RenderView>();
// 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
setRenderViewConfigFromFrameGraphLeafNode(renderView, m_fgLeaf);
diff --git a/src/render/backend/jobs/renderviewjob_p.h b/src/render/backend/jobs/renderviewjob_p.h
index 2651d4262..bbaa494b9 100644
--- a/src/render/backend/jobs/renderviewjob_p.h
+++ b/src/render/backend/jobs/renderviewjob_p.h
@@ -68,8 +68,6 @@ public:
m_fgLeaf = fgLeaf;
}
- inline void setFrameIndex(int frameIndex) { m_frameIndex = frameIndex; }
-
// Sets the position in the queue of RenderViews that the
// RenderView generated by this job should be inserted. This is
// used to ensure that for example a RenderView for creating
@@ -85,10 +83,6 @@ private:
QSize m_surfaceSize;
FrameGraphNode *m_fgLeaf;
int m_index;
- // Indicates which frame out of the maximum number of preprocessing frames
- // We are currently processing that RenderView for.
- // This is useful to retrieve data index by frame index
- int m_frameIndex;
};
typedef QSharedPointer<RenderViewJob> RenderViewJobPtr;
diff --git a/src/render/backend/jobs/renderviewjobutils.cpp b/src/render/backend/jobs/renderviewjobutils.cpp
index 231b0c1bd..3cbb07d69 100644
--- a/src/render/backend/jobs/renderviewjobutils.cpp
+++ b/src/render/backend/jobs/renderviewjobutils.cpp
@@ -174,8 +174,18 @@ void setRenderViewConfigFromFrameGraphLeafNode(RenderView *rv, const FrameGraphN
case FrameGraphNode::StateSet: {
const Render::StateSetNode *rStateSet = static_cast<const Render::StateSetNode *>(node);
- // Create global RenderStateSet for renderView
- rv->setStateSet(buildRenderStateSet(rStateSet->renderStates(), rv->allocator()));
+ // Create global RenderStateSet for renderView if no stateSet was set before
+ RenderStateSet *stateSet = rv->stateSet();
+ if (stateSet == Q_NULLPTR) {
+ stateSet = rv->allocator()->allocate<RenderStateSet>();
+ rv->setStateSet(stateSet);
+ }
+
+ // Add renderstates to stateset
+ const QList<RenderState *> &states = rStateSet->renderStates();
+ Q_FOREACH (RenderState *renderState, states)
+ stateSet->addState(renderState);
+
break;
}
@@ -212,7 +222,8 @@ RenderTechnique *findTechniqueForEffect(Renderer *renderer,
if (!technique)
continue;
- if (*renderer->contextInfo() == *technique->openGLFilter()) {
+ // We need to be sure the renderer is still running <=> still has a QGraphicsContext
+ if (renderer->isRunning() && *renderer->contextInfo() == *technique->openGLFilter()) {
// If no techniqueFilter is present, we return the technique as it satisfies OpenGL version
const TechniqueFilter *techniqueFilter = renderView->techniqueFilter();