summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2021-11-03 08:07:53 +0100
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2021-11-03 13:28:41 +0000
commit3e50c2c12cd862444ef4d9f74abf1be3b413d9a4 (patch)
tree8e9e15196b2df4a2b4bce1bdf67c9555e474316b
parent32e08126cb5113eb230b6eb1e92e4121de6d6666 (diff)
ComputeCommand: call markDirty(ComputeDirty) when enabled changes
When using Manual run mode on a QComputeCommand, we rely on the enabled property changing to enable/disable the backend ComputeCommand for a given set of frames. Since we weren't setting any dirty flag when the enabled property changed, Qt 3D was not rebuilding the list of active compute commands but rather using the one stored in its cache. This resulted in the ComputeCommand, now disabled, to still be called for execution until something else triggered a command rebuild. The renderer calls ComputeDirty after it has executed a compute call. This explains why eventually we only had 2 calls (and not a perpetual loop) when calling trigger(1). One was the valid call, followed by the invalid one (and then the command list got rebuilt because of the ComputeDirty flag set by the renderer). Task-number: QTBUG-86493 Change-Id: I7b31606a03609dc13294256b1dac89ee86730ba1 Reviewed-by: Sean Harmer <sean.harmer@kdab.com> (cherry picked from commit 3d4ac623d444bbbaddc7f63163b204f6c6a55cab) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--src/render/backend/computecommand.cpp3
-rw-r--r--tests/auto/render/computecommand/tst_computecommand.cpp16
2 files changed, 19 insertions, 0 deletions
diff --git a/src/render/backend/computecommand.cpp b/src/render/backend/computecommand.cpp
index 7c6d655cb..88408dad4 100644
--- a/src/render/backend/computecommand.cpp
+++ b/src/render/backend/computecommand.cpp
@@ -80,7 +80,10 @@ void ComputeCommand::syncFromFrontEnd(const Qt3DCore::QNode *frontEnd, bool firs
if (!node)
return;
+ const bool wasEnabled = isEnabled();
BackendNode::syncFromFrontEnd(frontEnd, firstTime);
+ if (wasEnabled != isEnabled())
+ markDirty(AbstractRenderer::ComputeDirty);
if (m_workGroups[0] != node->workGroupX()) {
m_workGroups[0] = node->workGroupX();
diff --git a/tests/auto/render/computecommand/tst_computecommand.cpp b/tests/auto/render/computecommand/tst_computecommand.cpp
index 34a03b068..facb6c08b 100644
--- a/tests/auto/render/computecommand/tst_computecommand.cpp
+++ b/tests/auto/render/computecommand/tst_computecommand.cpp
@@ -140,6 +140,10 @@ private Q_SLOTS:
backendComputeCommand.setRenderer(&renderer);
simulateInitializationSync(&computeCommand, &backendComputeCommand);
+ // THEN
+ QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::ComputeDirty);
+ renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty);
+
{
// WHEN
const bool newValue = false;
@@ -148,6 +152,8 @@ private Q_SLOTS:
// THEN
QCOMPARE(backendComputeCommand.isEnabled(), newValue);
+ QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::ComputeDirty);
+ renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty);
}
{
// WHEN
@@ -157,6 +163,8 @@ private Q_SLOTS:
// THEN
QCOMPARE(backendComputeCommand.x(), newValue);
+ QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::ComputeDirty);
+ renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty);
}
{
// WHEN
@@ -166,6 +174,8 @@ private Q_SLOTS:
// THEN
QCOMPARE(backendComputeCommand.y(), newValue);
+ QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::ComputeDirty);
+ renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty);
}
{
// WHEN
@@ -175,6 +185,8 @@ private Q_SLOTS:
// THEN
QCOMPARE(backendComputeCommand.z(), newValue);
+ QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::ComputeDirty);
+ renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty);
}
{
// WHEN
@@ -184,6 +196,8 @@ private Q_SLOTS:
// THEN
QCOMPARE(backendComputeCommand.runType(), newValue);
+ QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::ComputeDirty);
+ renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty);
}
{
// WHEN
@@ -193,6 +207,8 @@ private Q_SLOTS:
// THEN
QCOMPARE(backendComputeCommand.frameCount(), newValue);
+ QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::ComputeDirty);
+ renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty);
}
}