diff options
Diffstat (limited to 'src')
50 files changed, 146 insertions, 8 deletions
diff --git a/src/render/backend/abstractrenderer_p.h b/src/render/backend/abstractrenderer_p.h index 4a432f641..dbc157a2c 100644 --- a/src/render/backend/abstractrenderer_p.h +++ b/src/render/backend/abstractrenderer_p.h @@ -50,6 +50,7 @@ // We mean it. // +#include <QtCore/qflags.h> #include <Qt3DRender/private/qt3drender_global_p.h> #include <Qt3DCore/qaspectjob.h> #include <Qt3DCore/qnodeid.h> @@ -77,6 +78,17 @@ class NodeManagers; class Entity; class FrameGraphNode; class RendererSettings; +class BackendNode; + +// Changes made to backend nodes are reported to the Renderer +enum class BackendNodeDirtyFlag { + Transform = 1 << 0, + Material = 1 << 1, + Geometry = 1 << 2, + Any = 1 << 15 +}; +Q_DECLARE_FLAGS(BackendNodeDirtySet, BackendNodeDirtyFlag) +Q_DECLARE_OPERATORS_FOR_FLAGS(BackendNodeDirtySet) class QT3DRENDERSHARED_PRIVATE_EXPORT AbstractRenderer { @@ -111,6 +123,11 @@ public: virtual bool isRunning() const = 0; + virtual void markDirty(BackendNodeDirtySet changes, BackendNode *node) = 0; + virtual BackendNodeDirtySet dirtyBits() = 0; + virtual bool shouldRender() = 0; + virtual void skipNextFrame() = 0; + virtual QVector<Qt3DCore::QAspectJobPtr> renderBinJobs() = 0; virtual Qt3DCore::QAspectJobPtr pickBoundingVolumeJob() = 0; diff --git a/src/render/backend/backendnode.cpp b/src/render/backend/backendnode.cpp index 3051e6c90..247f6340b 100644 --- a/src/render/backend/backendnode.cpp +++ b/src/render/backend/backendnode.cpp @@ -61,6 +61,12 @@ void BackendNode::setRenderer(AbstractRenderer *renderer) m_renderer = renderer; } +void BackendNode::markDirty(BackendNodeDirtySet changes) +{ + Q_ASSERT(m_renderer); + m_renderer->markDirty(changes, this); +} + } // namespace Render } // namespace Qt3DRender diff --git a/src/render/backend/backendnode_p.h b/src/render/backend/backendnode_p.h index b4996051c..e5e6c7b33 100644 --- a/src/render/backend/backendnode_p.h +++ b/src/render/backend/backendnode_p.h @@ -61,7 +61,7 @@ namespace Qt3DRender { namespace Render { -class BackendNode : public Qt3DCore::QBackendNode +class Q_AUTOTEST_EXPORT BackendNode : public Qt3DCore::QBackendNode { public: BackendNode(Qt3DCore::QBackendNode::Mode mode = ReadOnly); @@ -69,6 +69,9 @@ public: void setRenderer(AbstractRenderer *renderer); +protected: + void markDirty(BackendNodeDirtySet changes); + private: AbstractRenderer *m_renderer; }; diff --git a/src/render/backend/boundingvolumedebug.cpp b/src/render/backend/boundingvolumedebug.cpp index f9f6b84ff..21073e989 100644 --- a/src/render/backend/boundingvolumedebug.cpp +++ b/src/render/backend/boundingvolumedebug.cpp @@ -82,6 +82,7 @@ void BoundingVolumeDebug::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) if (propertyName == QByteArrayLiteral("recursive")) { m_recursive = propertyChange->value().toBool(); } + markDirty(BackendNodeDirtyFlag::Any); } } diff --git a/src/render/backend/cameralens.cpp b/src/render/backend/cameralens.cpp index 067fb28e9..d1a273a99 100644 --- a/src/render/backend/cameralens.cpp +++ b/src/render/backend/cameralens.cpp @@ -92,6 +92,8 @@ void CameraLens::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) } else if (propertyChange->propertyName() == QByteArrayLiteral("enabled")) { m_enabled = propertyChange->value().toBool(); } + + markDirty(BackendNodeDirtyFlag::Any); } break; diff --git a/src/render/backend/computejob.cpp b/src/render/backend/computejob.cpp index ed7d6ad35..6444e271e 100644 --- a/src/render/backend/computejob.cpp +++ b/src/render/backend/computejob.cpp @@ -73,6 +73,7 @@ void ComputeJob::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) if (e->type() == Qt3DCore::NodeUpdated) { if (propertyChange->propertyName() == QByteArrayLiteral("enabled")) m_enabled = propertyChange->value().toBool(); + markDirty(BackendNodeDirtyFlag::Any); } } diff --git a/src/render/backend/entity.cpp b/src/render/backend/entity.cpp index 728ef17ff..b7edb7c25 100644 --- a/src/render/backend/entity.cpp +++ b/src/render/backend/entity.cpp @@ -205,6 +205,7 @@ void Entity::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) default: break; } + markDirty(BackendNodeDirtyFlag::Any); } void Entity::dump() const diff --git a/src/render/backend/layer.cpp b/src/render/backend/layer.cpp index c384479b6..c1a0a7d0b 100644 --- a/src/render/backend/layer.cpp +++ b/src/render/backend/layer.cpp @@ -91,6 +91,7 @@ void Layer::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) } else if (propertyChange->propertyName() == QByteArrayLiteral("enabled")) { m_enabled = propertyChange->value().toBool(); } + markDirty(BackendNodeDirtyFlag::Any); } } // namespace Render diff --git a/src/render/backend/nodefunctor_p.h b/src/render/backend/nodefunctor_p.h index 1fb1a8d82..2b5e8c9f7 100644 --- a/src/render/backend/nodefunctor_p.h +++ b/src/render/backend/nodefunctor_p.h @@ -51,7 +51,6 @@ // We mean it. // -#include <Qt3DCore/qbackendnode.h> #include <Qt3DCore/qnode.h> #include <Qt3DRender/private/backendnode_p.h> diff --git a/src/render/backend/renderattachment.cpp b/src/render/backend/renderattachment.cpp index 472eaad37..44ee3bb60 100644 --- a/src/render/backend/renderattachment.cpp +++ b/src/render/backend/renderattachment.cpp @@ -119,6 +119,7 @@ void RenderAttachment::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) else if (propertyChange->propertyName() == QByteArrayLiteral("name")) { m_attachmentData.m_name = propertyChange->value().toString(); } + markDirty(BackendNodeDirtyFlag::Any); } } diff --git a/src/render/backend/renderer.cpp b/src/render/backend/renderer.cpp index b2df0bb32..0d67d7500 100644 --- a/src/render/backend/renderer.cpp +++ b/src/render/backend/renderer.cpp @@ -140,6 +140,8 @@ Renderer::Renderer(QRenderAspect::RenderType type) , m_waitForInitializationToBeCompleted(0) , m_pickEventFilter(new PickEventFilter()) , m_exposed(0) + , m_lastFrameCorrect(0) + , m_changeSet(0) , m_glContext(Q_NULLPTR) , m_pickBoundingVolumeJob(Q_NULLPTR) , m_time(0) @@ -597,6 +599,8 @@ bool Renderer::submitRenderViews() const int renderViewsCount = renderViews.size(); quint64 frameElapsed = queueElapsed; + m_lastFrameCorrect.store(1); // everything fine until now..... + m_changeSet = 0; // mark "not dirty" // Early return if there's actually nothing to render if (renderViewsCount <= 0) @@ -674,7 +678,8 @@ bool Renderer::submitRenderViews() m_graphicsContext->setViewport(renderView->viewport(), renderView->surfaceSize() * renderView->devicePixelRatio()); // Execute the render commands - executeCommands(renderView); + if (!executeCommands(renderView)) + m_lastFrameCorrect.store(0); // something went wrong; make sure to render the next frame! // executeCommands takes care of restoring the stateset to the value // of gc->currentContext() at the moment it was called (either @@ -705,16 +710,42 @@ bool Renderer::submitRenderViews() return true; } +void Renderer::markDirty(BackendNodeDirtySet changes, BackendNode *node) +{ + Q_UNUSED(node); + m_changeSet |= changes; +} + +BackendNodeDirtySet Renderer::dirtyBits() +{ + return m_changeSet; +} + +bool Renderer::shouldRender() +{ + // Only render if something changed during the last frame, or the last frame + // was not rendered successfully + return (m_changeSet != 0 || !m_lastFrameCorrect.load()); +} + +void Renderer::skipNextFrame() +{ + // make submitRenderViews() actually run + m_renderQueue->setNoRender(); + m_submitRenderViewsSemaphore.release(1); +} + // Waits to be told to create jobs for the next frame // Called by QRenderAspect jobsToExecute context of QAspectThread QVector<Qt3DCore::QAspectJobPtr> Renderer::renderBinJobs() { + QVector<QAspectJobPtr> renderBinJobs; + // Traverse the current framegraph. For each leaf node create a // RenderView and set its configuration then create a job to // populate the RenderView with a set of RenderCommands that get // their details from the RenderNodes that are visible to the // Camera selected by the framegraph configuration - QVector<QAspectJobPtr> renderBinJobs; FrameGraphVisitor visitor; visitor.traverse(frameGraphRoot(), this, &renderBinJobs); @@ -842,8 +873,11 @@ bool Renderer::createOrUpdateVAO(RenderCommand *command, } // Called by RenderView->submit() in RenderThread context -void Renderer::executeCommands(const RenderView *rv) +// Returns true, if all RenderCommands were sent to the GPU +bool Renderer::executeCommands(const RenderView *rv) { + bool allCommandsIssued = true; + // Render drawing commands const QVector<RenderCommand *> commands = rv->commands(); @@ -867,6 +901,7 @@ void Renderer::executeCommands(const RenderView *rv) const bool hasGeometryRenderer = rGeometry != Q_NULLPTR && rGeometryRenderer != Q_NULLPTR && !rGeometry->attributes().isEmpty(); if (!hasGeometryRenderer) { + allCommandsIssued = false; qCWarning(Rendering) << "RenderCommand should have a mesh to render"; continue; } @@ -935,6 +970,8 @@ void Renderer::executeCommands(const RenderView *rv) //// Draw Calls if (primitiveCount && (specified || (vao && vao->isSpecified()))) { performDraw(rGeometry, rGeometryRenderer, primitiveCount, indexAttribute); + } else { + allCommandsIssued = false; } } } // end of RenderCommands loop @@ -955,6 +992,8 @@ void Renderer::executeCommands(const RenderView *rv) Q_FOREACH (Geometry *geometry, m_dirtyGeometry) geometry->unsetDirty(); m_dirtyGeometry.clear(); + + return allCommandsIssued; } Attribute *Renderer::updateBuffersAndAttributes(Geometry *geometry, RenderCommand *command, GLsizei &count, bool forceUpdate) diff --git a/src/render/backend/renderer_p.h b/src/render/backend/renderer_p.h index 8cb1f8725..f68d8f9db 100644 --- a/src/render/backend/renderer_p.h +++ b/src/render/backend/renderer_p.h @@ -152,6 +152,11 @@ public: void setFrameGraphRoot(const Qt3DCore::QNodeId fgRootId) Q_DECL_OVERRIDE; FrameGraphNode *frameGraphRoot() const Q_DECL_OVERRIDE; + void markDirty(BackendNodeDirtySet changes, BackendNode *node) Q_DECL_OVERRIDE; + BackendNodeDirtySet dirtyBits() Q_DECL_OVERRIDE; + bool shouldRender() Q_DECL_OVERRIDE; + void skipNextFrame() Q_DECL_OVERRIDE; + QVector<Qt3DCore::QAspectJobPtr> renderBinJobs() Q_DECL_OVERRIDE; Qt3DCore::QAspectJobPtr pickBoundingVolumeJob() Q_DECL_OVERRIDE; @@ -164,7 +169,7 @@ public: virtual void setSettings(RendererSettings *settings) Q_DECL_OVERRIDE; virtual RendererSettings *settings() const Q_DECL_OVERRIDE; - void executeCommands(const RenderView *rv); + bool executeCommands(const RenderView *rv); Attribute *updateBuffersAndAttributes(Geometry *geometry, RenderCommand *command, GLsizei &count, bool forceUpdate); void setOpenGLContext(QOpenGLContext *context); @@ -250,6 +255,8 @@ private: QVector<Attribute *> m_dirtyAttributes; QVector<Geometry *> m_dirtyGeometry; QAtomicInt m_exposed; + BackendNodeDirtySet m_changeSet; + QAtomicInt m_lastFrameCorrect; QOpenGLContext *m_glContext; PickBoundingVolumeJobPtr m_pickBoundingVolumeJob; diff --git a/src/render/backend/renderersettings.cpp b/src/render/backend/renderersettings.cpp index 148ce16fb..56e705bd7 100644 --- a/src/render/backend/renderersettings.cpp +++ b/src/render/backend/renderersettings.cpp @@ -75,6 +75,7 @@ void RendererSettings::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) m_pickMethod = propertyChange->value().value<QRendererSettings::PickMethod>(); else if (propertyChange->propertyName() == QByteArrayLiteral("pickResult")) m_pickResultMode = propertyChange->value().value<QRendererSettings::PickResultMode>(); + markDirty(BackendNodeDirtyFlag::Any); } } diff --git a/src/render/backend/renderqueue.cpp b/src/render/backend/renderqueue.cpp index 691288fc4..78bebfb42 100644 --- a/src/render/backend/renderqueue.cpp +++ b/src/render/backend/renderqueue.cpp @@ -51,6 +51,7 @@ RenderQueue::RenderQueue() : m_targetRenderViewCount(0) , m_currentRenderViewCount(0) , m_currentWorkQueue(1) + , m_noRender(false) { } @@ -66,7 +67,15 @@ int RenderQueue::currentRenderViewCount() const void RenderQueue::reset() { m_currentRenderViewCount = 0; - Q_ASSERT(currentRenderViewCount() == 0); + m_targetRenderViewCount = 0; + m_currentWorkQueue.clear(); + m_noRender = false; +} + +void RenderQueue::setNoRender() +{ + Q_ASSERT(m_targetRenderViewCount == 0); + m_noRender = true; } /*! @@ -76,6 +85,7 @@ void RenderQueue::reset() */ bool RenderQueue::queueRenderView(RenderView *renderView, uint submissionOrderIndex) { + Q_ASSERT(!m_noRender); m_currentWorkQueue[submissionOrderIndex] = renderView; ++m_currentRenderViewCount; return isFrameQueueComplete(); @@ -96,6 +106,7 @@ QVector<RenderView *> RenderQueue::nextFrameQueue() */ void RenderQueue::setTargetRenderViewCount(int targetRenderViewCount) { + Q_ASSERT(!m_noRender); m_targetRenderViewCount = targetRenderViewCount; m_currentWorkQueue.resize(targetRenderViewCount); } @@ -107,7 +118,8 @@ void RenderQueue::setTargetRenderViewCount(int targetRenderViewCount) */ bool RenderQueue::isFrameQueueComplete() const { - return m_targetRenderViewCount && m_targetRenderViewCount == currentRenderViewCount(); + return (m_noRender + || (m_targetRenderViewCount && m_targetRenderViewCount == currentRenderViewCount())); } } // namespace Render diff --git a/src/render/backend/renderqueue_p.h b/src/render/backend/renderqueue_p.h index 063b948f2..49316049b 100644 --- a/src/render/backend/renderqueue_p.h +++ b/src/render/backend/renderqueue_p.h @@ -76,7 +76,10 @@ public: QVector<RenderView *> nextFrameQueue(); void reset(); + void setNoRender(); + private: + bool m_noRender; int m_targetRenderViewCount; int m_currentRenderViewCount; QVector<RenderView *> m_currentWorkQueue; diff --git a/src/render/backend/rendertarget.cpp b/src/render/backend/rendertarget.cpp index 19bac8a3c..2d7130c23 100644 --- a/src/render/backend/rendertarget.cpp +++ b/src/render/backend/rendertarget.cpp @@ -90,6 +90,7 @@ void RenderTarget::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) appendRenderAttachment(propertyChange->value().value<QNodeId>()); else if (e->type() == NodeRemoved && propertyChange->propertyName() == QByteArrayLiteral("attachment")) removeRenderAttachment(propertyChange->value().value<QNodeId>()); + markDirty(BackendNodeDirtyFlag::Any); } } // namespace Render diff --git a/src/render/backend/transform.cpp b/src/render/backend/transform.cpp index 603529736..96fe7e991 100644 --- a/src/render/backend/transform.cpp +++ b/src/render/backend/transform.cpp @@ -92,6 +92,8 @@ void Transform::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) m_enabled = propertyChange->value().toBool(); } } + + markDirty(BackendNodeDirtyFlag::Transform); } void Transform::updateMatrix() diff --git a/src/render/framegraph/cameraselectornode.cpp b/src/render/framegraph/cameraselectornode.cpp index 1cacdf568..c2327cdc6 100644 --- a/src/render/framegraph/cameraselectornode.cpp +++ b/src/render/framegraph/cameraselectornode.cpp @@ -75,6 +75,7 @@ void CameraSelector::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) m_cameraUuid = propertyChange->value().value<QNodeId>(); else if (propertyChange->propertyName() == QByteArrayLiteral("enabled")) setEnabled(propertyChange->value().toBool()); + markDirty(BackendNodeDirtyFlag::Any); } } diff --git a/src/render/framegraph/clearbuffer.cpp b/src/render/framegraph/clearbuffer.cpp index 1161ab3c4..2f9e4b30b 100644 --- a/src/render/framegraph/clearbuffer.cpp +++ b/src/render/framegraph/clearbuffer.cpp @@ -68,6 +68,7 @@ void ClearBuffer::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) m_type = static_cast<QClearBuffer::BufferType>(propertyChange->value().toInt()); else if (propertyChange->propertyName() == QByteArrayLiteral("enabled")) setEnabled(propertyChange->value().toBool()); + markDirty(BackendNodeDirtyFlag::Any); } } diff --git a/src/render/framegraph/dispatchcompute.cpp b/src/render/framegraph/dispatchcompute.cpp index e89e6e525..f5ec2bcbc 100644 --- a/src/render/framegraph/dispatchcompute.cpp +++ b/src/render/framegraph/dispatchcompute.cpp @@ -85,6 +85,7 @@ void DispatchCompute::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) m_workGroups[2] = propertyChange->value().toInt(); else if (propertyChange->propertyName() == QByteArrayLiteral("enabled")) setEnabled(propertyChange->value().toBool()); + markDirty(BackendNodeDirtyFlag::Any); } } diff --git a/src/render/framegraph/frustumculling.cpp b/src/render/framegraph/frustumculling.cpp index 10fc7d765..9037f81d2 100644 --- a/src/render/framegraph/frustumculling.cpp +++ b/src/render/framegraph/frustumculling.cpp @@ -75,6 +75,7 @@ void FrustumCulling::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) break; } } + markDirty(BackendNodeDirtyFlag::Any); } } // namespace Render diff --git a/src/render/framegraph/layerfilternode.cpp b/src/render/framegraph/layerfilternode.cpp index a0132b9b4..8f7fe3d75 100644 --- a/src/render/framegraph/layerfilternode.cpp +++ b/src/render/framegraph/layerfilternode.cpp @@ -69,6 +69,7 @@ void LayerFilterNode::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) setLayers(propertyChange->value().value<QStringList>()); else if (propertyChange->propertyName() == QByteArrayLiteral("enabled")) setEnabled(propertyChange->value().toBool()); + markDirty(BackendNodeDirtyFlag::Any); } } diff --git a/src/render/framegraph/lighting.cpp b/src/render/framegraph/lighting.cpp index 906d22bd6..d4823212d 100644 --- a/src/render/framegraph/lighting.cpp +++ b/src/render/framegraph/lighting.cpp @@ -71,6 +71,7 @@ void Lighting::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) default: break; } + markDirty(BackendNodeDirtyFlag::Any); } } // namespace Render diff --git a/src/render/framegraph/nodraw.cpp b/src/render/framegraph/nodraw.cpp index 343788c31..d7bd33637 100644 --- a/src/render/framegraph/nodraw.cpp +++ b/src/render/framegraph/nodraw.cpp @@ -71,6 +71,7 @@ void NoDraw::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) case NodeUpdated: { if (propertyChange->propertyName() == QByteArrayLiteral("enabled")) setEnabled(propertyChange->value().toBool()); + markDirty(BackendNodeDirtyFlag::Any); break; default: diff --git a/src/render/framegraph/renderpassfilternode.cpp b/src/render/framegraph/renderpassfilternode.cpp index 21e05ac53..d1a3fab80 100644 --- a/src/render/framegraph/renderpassfilternode.cpp +++ b/src/render/framegraph/renderpassfilternode.cpp @@ -116,6 +116,7 @@ void RenderPassFilter::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) default: break; } + markDirty(BackendNodeDirtyFlag::Any); } } // namespace Render diff --git a/src/render/framegraph/rendersurfaceselector.cpp b/src/render/framegraph/rendersurfaceselector.cpp index 5003adfcb..ceee513d8 100644 --- a/src/render/framegraph/rendersurfaceselector.cpp +++ b/src/render/framegraph/rendersurfaceselector.cpp @@ -74,6 +74,7 @@ void RenderSurfaceSelector::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) m_surface = propertyChange->value().value<QSurface *>(); else if (propertyChange->propertyName() == QByteArrayLiteral("enabled")) setEnabled(propertyChange->value().toBool()); + markDirty(BackendNodeDirtyFlag::Any); } } diff --git a/src/render/framegraph/rendertargetselectornode.cpp b/src/render/framegraph/rendertargetselectornode.cpp index ab9cc9dfc..d5df14df5 100644 --- a/src/render/framegraph/rendertargetselectornode.cpp +++ b/src/render/framegraph/rendertargetselectornode.cpp @@ -79,6 +79,7 @@ void RenderTargetSelector::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) setEnabled(propertyChange->value().toBool()); else if (propertyChange->propertyName() == QByteArrayLiteral("drawBuffers")) m_drawBuffers = propertyChange->value().value<QList<Qt3DRender::QRenderAttachment::RenderAttachmentType> >(); + markDirty(BackendNodeDirtyFlag::Any); } } diff --git a/src/render/framegraph/sortcriterion.cpp b/src/render/framegraph/sortcriterion.cpp index d558de77d..9b31e71cc 100644 --- a/src/render/framegraph/sortcriterion.cpp +++ b/src/render/framegraph/sortcriterion.cpp @@ -75,6 +75,7 @@ void SortCriterion::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) if (e->type() == NodeUpdated && propertyChange->propertyName() == QByteArrayLiteral("sort")) { m_type = static_cast<QSortCriterion::SortType>(propertyChange->value().toInt()); } + markDirty(BackendNodeDirtyFlag::Any); } } // namespace Render diff --git a/src/render/framegraph/sortmethod.cpp b/src/render/framegraph/sortmethod.cpp index 9746a8392..7ee462e6f 100644 --- a/src/render/framegraph/sortmethod.cpp +++ b/src/render/framegraph/sortmethod.cpp @@ -76,6 +76,7 @@ void SortMethod::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) } else if (propertyChange->propertyName() == QByteArrayLiteral("enabled") && e->type() == NodeUpdated) { setEnabled(propertyChange->value().toBool()); } + markDirty(BackendNodeDirtyFlag::Any); } QList<QNodeId> SortMethod::criteria() const diff --git a/src/render/framegraph/statesetnode.cpp b/src/render/framegraph/statesetnode.cpp index 4739c4a9a..b1c713b51 100644 --- a/src/render/framegraph/statesetnode.cpp +++ b/src/render/framegraph/statesetnode.cpp @@ -90,6 +90,7 @@ void StateSetNode::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) default: break; } + markDirty(BackendNodeDirtyFlag::Any); } } // namespace Render diff --git a/src/render/framegraph/techniquefilternode.cpp b/src/render/framegraph/techniquefilternode.cpp index 87eff80a6..bd567d4ac 100644 --- a/src/render/framegraph/techniquefilternode.cpp +++ b/src/render/framegraph/techniquefilternode.cpp @@ -117,6 +117,7 @@ void TechniqueFilter::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) default: break; } + markDirty(BackendNodeDirtyFlag::Any); } } // namespace Render diff --git a/src/render/framegraph/viewportnode.cpp b/src/render/framegraph/viewportnode.cpp index 66f59a05d..1871eb2ba 100644 --- a/src/render/framegraph/viewportnode.cpp +++ b/src/render/framegraph/viewportnode.cpp @@ -126,6 +126,7 @@ void ViewportNode::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) } else if (propertyChange->propertyName() == QByteArrayLiteral("enabled")) { setEnabled(propertyChange->value().toBool()); } + markDirty(BackendNodeDirtyFlag::Any); } } diff --git a/src/render/frontend/qrenderaspect.cpp b/src/render/frontend/qrenderaspect.cpp index 80e7b8488..464ac56ed 100644 --- a/src/render/frontend/qrenderaspect.cpp +++ b/src/render/frontend/qrenderaspect.cpp @@ -126,6 +126,7 @@ #include <Qt3DRender/private/computejob_p.h> #include <Qt3DRender/private/rendersurfaceselector_p.h> #include <Qt3DRender/private/renderersettings_p.h> +#include <Qt3DRender/private/backendnode_p.h> #include <Qt3DCore/qentity.h> #include <Qt3DCore/qtransform.h> @@ -334,6 +335,11 @@ QVector<Qt3DCore::QAspectJobPtr> QRenderAspect::jobsToExecute(qint64 time) // Create jobs to load in any meshes that are pending if (d->m_renderer != Q_NULLPTR && d->m_renderer->isRunning()) { + // don't spawn any jobs, if the renderer decides to skip this frame + if (!d->m_renderer->shouldRender()) { + d->m_renderer->skipNextFrame(); + return jobs; + } Render::NodeManagers *manager = d->m_renderer->nodeManagers(); //QAspectJobPtr pickBoundingVolumeJob = d->m_renderer->pickBoundingVolumeJob(); diff --git a/src/render/geometry/attribute.cpp b/src/render/geometry/attribute.cpp index e52815ede..1e4b16292 100644 --- a/src/render/geometry/attribute.cpp +++ b/src/render/geometry/attribute.cpp @@ -133,6 +133,7 @@ void Attribute::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) m_bufferId = propertyChange->value().value<QNodeId>(); m_attributeDirty = true; } + markDirty(BackendNodeDirtyFlag::Any); break; } diff --git a/src/render/geometry/buffer.cpp b/src/render/geometry/buffer.cpp index 3389172e0..92217ff1e 100644 --- a/src/render/geometry/buffer.cpp +++ b/src/render/geometry/buffer.cpp @@ -135,6 +135,7 @@ void Buffer::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) } else if (propertyName == QByteArrayLiteral("sync")) { m_sync = propertyChange->value().toBool(); } + markDirty(BackendNodeDirtyFlag::Any); } } diff --git a/src/render/geometry/geometry.cpp b/src/render/geometry/geometry.cpp index 8b4a51a0b..8ef33ac54 100644 --- a/src/render/geometry/geometry.cpp +++ b/src/render/geometry/geometry.cpp @@ -120,6 +120,7 @@ void Geometry::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) default: break; } + markDirty(BackendNodeDirtyFlag::Any); } void Geometry::unsetDirty() diff --git a/src/render/geometry/geometryrenderer.cpp b/src/render/geometry/geometryrenderer.cpp index a20bb87cf..ff2fa149c 100644 --- a/src/render/geometry/geometryrenderer.cpp +++ b/src/render/geometry/geometryrenderer.cpp @@ -174,6 +174,8 @@ void GeometryRenderer::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) break; } + markDirty(BackendNodeDirtyFlag::Any); + // Add to dirty list in manager } diff --git a/src/render/io/scene.cpp b/src/render/io/scene.cpp index 772a49837..d4f9bb010 100644 --- a/src/render/io/scene.cpp +++ b/src/render/io/scene.cpp @@ -74,6 +74,7 @@ void Scene::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) m_source = propertyChange->value().toUrl(); m_sceneManager->addSceneData(m_source, peerUuid()); } + markDirty(BackendNodeDirtyFlag::Any); } QUrl Scene::source() const diff --git a/src/render/materialsystem/annotation.cpp b/src/render/materialsystem/annotation.cpp index c3cf71b2d..b0ceeaf5c 100644 --- a/src/render/materialsystem/annotation.cpp +++ b/src/render/materialsystem/annotation.cpp @@ -86,6 +86,8 @@ void Annotation::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) m_value = propertyChange->value(); else if (propertyChange->propertyName() == QByteArrayLiteral("name")) m_name = propertyChange->value().toString(); + + markDirty(BackendNodeDirtyFlag::Any); } bool Annotation::operator ==(const Annotation &other) diff --git a/src/render/materialsystem/effect.cpp b/src/render/materialsystem/effect.cpp index 3cbfe9f9e..b31cd9485 100644 --- a/src/render/materialsystem/effect.cpp +++ b/src/render/materialsystem/effect.cpp @@ -104,6 +104,8 @@ void Effect::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) default : break; } + + markDirty(BackendNodeDirtyFlag::Any); } void Effect::appendRenderTechnique(Qt3DCore::QNodeId technique) diff --git a/src/render/materialsystem/material.cpp b/src/render/materialsystem/material.cpp index 5c4f6f537..b93422015 100644 --- a/src/render/materialsystem/material.cpp +++ b/src/render/materialsystem/material.cpp @@ -113,6 +113,7 @@ void Material::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) default: break; } + markDirty(BackendNodeDirtyFlag::Any); } QList<Qt3DCore::QNodeId> Material::parameters() const diff --git a/src/render/materialsystem/parameter.cpp b/src/render/materialsystem/parameter.cpp index b5007ae95..58e5bb6bd 100644 --- a/src/render/materialsystem/parameter.cpp +++ b/src/render/materialsystem/parameter.cpp @@ -81,6 +81,7 @@ void Parameter::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) } else if (propertyChange->propertyName() == QByteArrayLiteral("value")) { m_value = propertyChange->value(); } + markDirty(BackendNodeDirtyFlag::Any); } } diff --git a/src/render/materialsystem/renderpass.cpp b/src/render/materialsystem/renderpass.cpp index 6f4a6e117..ece7972db 100644 --- a/src/render/materialsystem/renderpass.cpp +++ b/src/render/materialsystem/renderpass.cpp @@ -129,6 +129,7 @@ void RenderPass::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) default: break; } + markDirty(BackendNodeDirtyFlag::Any); } Qt3DCore::QNodeId RenderPass::shaderProgram() const diff --git a/src/render/materialsystem/shader.cpp b/src/render/materialsystem/shader.cpp index 6c07c1caf..e4ffe59e4 100644 --- a/src/render/materialsystem/shader.cpp +++ b/src/render/materialsystem/shader.cpp @@ -156,6 +156,7 @@ void Shader::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) } if (!m_isLoaded) updateDNA(); + markDirty(BackendNodeDirtyFlag::Any); } } diff --git a/src/render/materialsystem/shaderdata.cpp b/src/render/materialsystem/shaderdata.cpp index 9694ea159..52ee7220b 100644 --- a/src/render/materialsystem/shaderdata.cpp +++ b/src/render/materialsystem/shaderdata.cpp @@ -322,6 +322,7 @@ void ShaderData::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) default: break; } + BackendNode::markDirty(BackendNodeDirtyFlag::Any); } } diff --git a/src/render/materialsystem/technique.cpp b/src/render/materialsystem/technique.cpp index 2b1ba65b1..3526e134f 100644 --- a/src/render/materialsystem/technique.cpp +++ b/src/render/materialsystem/technique.cpp @@ -149,6 +149,7 @@ void Technique::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) default: break; } + markDirty(BackendNodeDirtyFlag::Any); } QList<Qt3DCore::QNodeId> Technique::parameters() const diff --git a/src/render/picking/objectpicker.cpp b/src/render/picking/objectpicker.cpp index b3571d107..172f1733e 100644 --- a/src/render/picking/objectpicker.cpp +++ b/src/render/picking/objectpicker.cpp @@ -95,6 +95,7 @@ void ObjectPicker::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) m_mouseTrackingEnabled = propertyChange->value().toBool(); m_isDirty = true; } + markDirty(BackendNodeDirtyFlag::Any); } } diff --git a/src/render/renderstates/renderstates.cpp b/src/render/renderstates/renderstates.cpp index a8e2716aa..3cce233b8 100644 --- a/src/render/renderstates/renderstates.cpp +++ b/src/render/renderstates/renderstates.cpp @@ -99,6 +99,7 @@ void RenderStateNode::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) } else { m_impl->updateProperty(propertyChange->propertyName(), propertyChange->value()); } + markDirty(BackendNodeDirtyFlag::Any); } } diff --git a/src/render/texture/texture.cpp b/src/render/texture/texture.cpp index 7a4b238e4..a999d4fdb 100644 --- a/src/render/texture/texture.cpp +++ b/src/render/texture/texture.cpp @@ -597,6 +597,7 @@ void Texture::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) break; } + markDirty(BackendNodeDirtyFlag::Any); } TextureDNA Texture::dna() const diff --git a/src/render/texture/textureimage.cpp b/src/render/texture/textureimage.cpp index 7ce782e6d..aef4908bb 100644 --- a/src/render/texture/textureimage.cpp +++ b/src/render/texture/textureimage.cpp @@ -121,6 +121,7 @@ void TextureImage::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) if (txt != Q_NULLPTR) txt->addToPendingTextureJobs(); } + markDirty(BackendNodeDirtyFlag::Any); } void TextureImage::setTextureManager(TextureManager *manager) |