summaryrefslogtreecommitdiff
path: root/libs/hwui/pipeline/skia/SkiaDisplayList.cpp
diff options
context:
space:
mode:
authorStan Iliev <stani@google.com>2016-11-08 14:18:31 -0500
committerStan Iliev <stani@google.com>2016-11-22 16:38:20 -0500
commitdb45a4bfaff1120a9b23073e46a0cc6d39f56023 (patch)
tree1b5501d6d3b8de98b4da6d8e431e1d563f99eca0 /libs/hwui/pipeline/skia/SkiaDisplayList.cpp
parent3dfca02da4d1a324fded26ab4bb2251b6fe7a27f (diff)
Fix Skia render node projection to match HWUI
Fix Skia render node projection to match HWUI. Port FrameBuilderTests_projectionReorder test for Skia pipeline. Add new tests in both HWUI and Skia to cover more projection use cases. Test: built and run on angler-eng Change-Id: Ibf27af211452ae95d595aca7723ea63f48b0b282
Diffstat (limited to 'libs/hwui/pipeline/skia/SkiaDisplayList.cpp')
-rw-r--r--libs/hwui/pipeline/skia/SkiaDisplayList.cpp21
1 files changed, 18 insertions, 3 deletions
diff --git a/libs/hwui/pipeline/skia/SkiaDisplayList.cpp b/libs/hwui/pipeline/skia/SkiaDisplayList.cpp
index 2ad7f74560d6..9db8cd3fe2e2 100644
--- a/libs/hwui/pipeline/skia/SkiaDisplayList.cpp
+++ b/libs/hwui/pipeline/skia/SkiaDisplayList.cpp
@@ -64,16 +64,31 @@ bool SkiaDisplayList::prepareListAndChildren(TreeInfo& info, bool functorsNeedLa
info.canvasContext.unpinImages();
}
+ bool hasBackwardProjectedNodesHere = false;
+ bool hasBackwardProjectedNodesSubtree= false;
+
for (auto& child : mChildNodes) {
+ hasBackwardProjectedNodesHere |= child.getNodeProperties().getProjectBackwards();
RenderNode* childNode = child.getRenderNode();
Matrix4 mat4(child.getRecordedMatrix());
info.damageAccumulator->pushTransform(&mat4);
// TODO: a layer is needed if the canvas is rotated or has a non-rect clip
- bool childFunctorsNeedLayer = functorsNeedLayer;
- childFn(childNode, info, childFunctorsNeedLayer);
+ info.hasBackwardProjectedNodes = false;
+ childFn(childNode, info, functorsNeedLayer);
+ hasBackwardProjectedNodesSubtree |= info.hasBackwardProjectedNodes;
info.damageAccumulator->popTransform();
}
+ //The purpose of next block of code is to reset projected display list if there are no
+ //backward projected nodes. This speeds up drawing, by avoiding an extra walk of the tree
+ if (mProjectionReceiver) {
+ mProjectionReceiver->setProjectedDisplayList(hasBackwardProjectedNodesSubtree ? this : nullptr);
+ info.hasBackwardProjectedNodes = hasBackwardProjectedNodesHere;
+ } else {
+ info.hasBackwardProjectedNodes = hasBackwardProjectedNodesSubtree
+ || hasBackwardProjectedNodesHere;
+ }
+
bool isDirty = false;
for (auto& vectorDrawable : mVectorDrawables) {
// If any vector drawable in the display list needs update, damage the node.
@@ -86,7 +101,7 @@ bool SkiaDisplayList::prepareListAndChildren(TreeInfo& info, bool functorsNeedLa
}
void SkiaDisplayList::reset(SkRect bounds) {
- mIsProjectionReceiver = false;
+ mProjectionReceiver = nullptr;
mDrawable->reset(bounds);