diff options
| author | Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io> | 2024-05-30 08:44:02 +0200 |
|---|---|---|
| committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2024-05-30 23:25:52 +0000 |
| commit | 994bfd41b21b38246a85c4fe9f49d8714dac32c5 (patch) | |
| tree | 371878fda923c3022714ef148aaaadeec1aff885 | |
| parent | f5f99985b8cb1d04a3d230a21ccf603b220dcdfd (diff) | |
Don't update transform if it hasn't changed
Updating the transform marks it as dirty and causes rebatching.
Since we were doing this even when nothing had changed, we were
essentially rebatching every time there was any update to the
shape. We should leave it to the node to decide if it has
been updated.
This adds two tests that verify that rebatching still happens
when changing the color/gradient of the shape.
Change-Id: Iefb7a21a89ac2c31053e473cf689fa06e34a40d5
Reviewed-by: Eirik Aavitsland <eirik.aavitsland@qt.io>
(cherry picked from commit e3d0233bbe3e130c72e3957c45007097c019530d)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
| -rw-r--r-- | src/quickshapes/qquickshape.cpp | 5 | ||||
| -rw-r--r-- | tests/baseline/scenegraph/data/shape/shape_updatecolor.qml | 77 | ||||
| -rw-r--r-- | tests/baseline/scenegraph/data/shape/shape_updategradient.qml | 105 |
3 files changed, 186 insertions, 1 deletions
diff --git a/src/quickshapes/qquickshape.cpp b/src/quickshapes/qquickshape.cpp index 5b9ca8180c..4eec05e70d 100644 --- a/src/quickshapes/qquickshape.cpp +++ b/src/quickshapes/qquickshape.cpp @@ -1213,7 +1213,10 @@ QSGNode *QQuickShape::updatePaintNode(QSGNode *node, UpdatePaintNodeData *) ty = (height() - h) / 2; fillModeTransform.translate(tx / xScale, ty / yScale); } - static_cast<QSGTransformNode *>(node)->setMatrix(fillModeTransform); + + QSGTransformNode *transformNode = static_cast<QSGTransformNode *>(node); + if (fillModeTransform != transformNode->matrix()) + transformNode->setMatrix(fillModeTransform); } return node; } diff --git a/tests/baseline/scenegraph/data/shape/shape_updatecolor.qml b/tests/baseline/scenegraph/data/shape/shape_updatecolor.qml new file mode 100644 index 0000000000..32cc73ad45 --- /dev/null +++ b/tests/baseline/scenegraph/data/shape/shape_updatecolor.qml @@ -0,0 +1,77 @@ +import QtQuick +import QtQuick.Shapes + +Item { + width: 320 + height: 800 + + ListModel { + id: renderers + ListElement { renderer: Shape.GeometryRenderer } + ListElement { renderer: Shape.CurveRenderer } + } + + Row { + Repeater { + model: renderers + Column { + Shape { + preferredRendererType: renderer + width: 160 + height: 150 + + ShapePath { + strokeColor: "transparent" + fillColor: "red" + + startX: 10; startY: 10 + PathLine { relativeX: 140; relativeY: 0 } + PathLine { relativeX: 0; relativeY: 100 } + PathLine { relativeX: -140; relativeY: 0 } + PathLine { relativeX: 0; relativeY: -100 } + } + } + + Shape { + preferredRendererType: renderer + width: 160 + height: 150 + + ShapePath { + strokeColor: "transparent" + fillColor: "red" + + startX: 10; startY: 10 + 1 * 140 + PathLine { relativeX: 140; relativeY: 0 } + PathLine { relativeX: 0; relativeY: 100 } + PathLine { relativeX: -140; relativeY: 0 } + PathLine { relativeX: 0; relativeY: -100 } + } + } + + Shape { + preferredRendererType: renderer + width: 160 + height: 150 + Timer { + interval: 100 + running: true + onTriggered: s.fillColor = Qt.rgba(0, 1, 0, 1) + } + + ShapePath { + id: s + strokeColor: "transparent" + fillColor: "red" + + startX: 10; startY: 10 + 2 * 140 + PathLine { relativeX: 140; relativeY: 0 } + PathLine { relativeX: 0; relativeY: 100 } + PathLine { relativeX: -140; relativeY: 0 } + PathLine { relativeX: 0; relativeY: -100 } + } + } + } + } + } +} diff --git a/tests/baseline/scenegraph/data/shape/shape_updategradient.qml b/tests/baseline/scenegraph/data/shape/shape_updategradient.qml new file mode 100644 index 0000000000..f1fa0f0f3d --- /dev/null +++ b/tests/baseline/scenegraph/data/shape/shape_updategradient.qml @@ -0,0 +1,105 @@ +import QtQuick +import QtQuick.Shapes + +Item { + width: 320 + height: 800 + + ListModel { + id: renderers + ListElement { renderer: Shape.GeometryRenderer } + ListElement { renderer: Shape.CurveRenderer } + } + + RadialGradient { + id: radialGradient + centerX: 80 + centerY: 75 + centerRadius: centerY + focalX: centerX + focalY: centerY + GradientStop { position: 0; color: "black" } + GradientStop { position: .5; color: "cyan" } + GradientStop { position: 1; color: "black" } + } + + Row { + Repeater { + model: renderers + Column { + Shape { + preferredRendererType: renderer + width: 160 + height: 150 + + ShapePath { + strokeColor: "transparent" + fillGradient: LinearGradient { + y1: 50; y2: 80 + GradientStop { position: 0; color: "black" } + GradientStop { position: 1; color: "cyan" } + } + fillTransform: PlanarTransform.fromAffineMatrix(0.8, 0.2, 0.3, 1.5, 20, -50 + startY) + + startX: 10; startY: 10 + PathLine { relativeX: 140; relativeY: 0 } + PathLine { relativeX: 0; relativeY: 100 } + PathLine { relativeX: -140; relativeY: 0 } + PathLine { relativeX: 0; relativeY: -100 } + } + } + + Shape { + preferredRendererType: renderer + width: 160 + height: 150 + + ShapePath { + strokeColor: "transparent" + fillGradient: LinearGradient { + y1: 50; y2: 80 + GradientStop { position: 0; color: "black" } + GradientStop { position: 1; color: "cyan" } + } + fillTransform: PlanarTransform.fromAffineMatrix(0.8, 0.2, 0.3, 1.5, 20, -50 + startY) + + startX: 10; startY: 10 + 1 * 140 + PathLine { relativeX: 140; relativeY: 0 } + PathLine { relativeX: 0; relativeY: 100 } + PathLine { relativeX: -140; relativeY: 0 } + PathLine { relativeX: 0; relativeY: -100 } + } + } + + Shape { + preferredRendererType: renderer + width: 160 + height: 150 + Timer { + interval: 100 + running: true + onTriggered: s.fillGradient = radialGradient + } + + ShapePath { + id: s + strokeColor: "transparent" + fillGradient: LinearGradient { + y1: 50; y2: 80 + GradientStop { position: 0; color: "black" } + GradientStop { position: 1; color: "cyan" } + } + fillTransform: PlanarTransform.fromAffineMatrix(0.8, 0.2, 0.3, 1.5, 20, -50 + startY) + + + startX: 10; startY: 10 + 2 * 140 + PathLine { relativeX: 140; relativeY: 0 } + PathLine { relativeX: 0; relativeY: 100 } + PathLine { relativeX: -140; relativeY: 0 } + PathLine { relativeX: 0; relativeY: -100 } + } + } + } + } + } +} |
