diff options
| author | Stan Iliev <stani@google.com> | 2016-11-08 14:18:31 -0500 |
|---|---|---|
| committer | Stan Iliev <stani@google.com> | 2016-11-22 16:38:20 -0500 |
| commit | db45a4bfaff1120a9b23073e46a0cc6d39f56023 (patch) | |
| tree | 1b5501d6d3b8de98b4da6d8e431e1d563f99eca0 /libs/hwui/pipeline/skia/SkiaDisplayList.cpp | |
| parent | 3dfca02da4d1a324fded26ab4bb2251b6fe7a27f (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.cpp | 21 |
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); |
