diff options
author | Andy Nichols <andy.nichols@theqtcompany.com> | 2015-08-17 10:21:56 +0200 |
---|---|---|
committer | Andy Nichols <andy.nichols@theqtcompany.com> | 2015-08-17 10:22:07 +0200 |
commit | 2c4f13290cb9f96184d386c8a3a525569359f553 (patch) | |
tree | 89424c7992fee950eb0c06404729d4cbcd12f027 /src/render/backend/jobs | |
parent | b6c0e90171fcddbd71bbdb84aca0b2c0b87149ef (diff) | |
parent | e8df467c8d15a203bffaee858dbb93507700eb61 (diff) |
Merge remote-tracking branch 'origin/5.5' into dev
Change-Id: Id0a3559e001631a077bc1c3a17c30a48599eecb9
Diffstat (limited to 'src/render/backend/jobs')
-rw-r--r-- | src/render/backend/jobs/framecleanupjob.cpp | 6 | ||||
-rw-r--r-- | src/render/backend/jobs/framepreparationjob.cpp | 30 | ||||
-rw-r--r-- | src/render/backend/jobs/framepreparationjob_p.h | 4 | ||||
-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.cpp | 68 | ||||
-rw-r--r-- | src/render/backend/jobs/loadgeometryjob_p.h | 74 | ||||
-rw-r--r-- | src/render/backend/jobs/loadtexturedatajob.cpp | 42 | ||||
-rw-r--r-- | src/render/backend/jobs/render-jobs.pri | 10 | ||||
-rw-r--r-- | src/render/backend/jobs/renderviewjob.cpp | 6 | ||||
-rw-r--r-- | src/render/backend/jobs/renderviewjob_p.h | 6 | ||||
-rw-r--r-- | src/render/backend/jobs/renderviewjobutils.cpp | 17 |
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(); |