From 5876e7df0407cbce8a043ece3a33fd3224311ffc Mon Sep 17 00:00:00 2001 From: Doris Liu Date: Tue, 2 Aug 2016 17:28:30 -0700 Subject: [PATCH] HWUI unit test for AVD on HwLayer This test puts AVD on a HWLayer and check that after prepareTree the correct damage rect for the layer is enqueued. This verifies the fix for bug 30166063 Change-Id: Ia37847357bb00d54f08ee253013db83d46783fbd --- libs/hwui/DisplayList.h | 2 +- libs/hwui/tests/unit/RenderNodeTests.cpp | 36 ++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/libs/hwui/DisplayList.h b/libs/hwui/DisplayList.h index a8205c854c148..c5d87676b7ff9 100644 --- a/libs/hwui/DisplayList.h +++ b/libs/hwui/DisplayList.h @@ -101,7 +101,7 @@ public: const LsaVector& getBitmapResources() const { return bitmapResources; } const LsaVector& getFunctors() const { return functors; } - const LsaVector& getVectorDrawables() { return vectorDrawables; } + const LsaVector& getVectorDrawables() const { return vectorDrawables; } size_t addChild(NodeOpType* childOp); diff --git a/libs/hwui/tests/unit/RenderNodeTests.cpp b/libs/hwui/tests/unit/RenderNodeTests.cpp index fd3cf3731f04b..0d90afa06ab44 100644 --- a/libs/hwui/tests/unit/RenderNodeTests.cpp +++ b/libs/hwui/tests/unit/RenderNodeTests.cpp @@ -15,6 +15,7 @@ */ #include +#include #include "AnimationContext.h" #include "DamageAccumulator.h" @@ -132,3 +133,38 @@ RENDERTHREAD_TEST(RenderNode, prepareTree_nullableDisplayList) { canvasContext->destroy(nullptr); } + +RENDERTHREAD_TEST(RenderNode, prepareTree_HwLayer_AVD_enqueueDamage) { + + VectorDrawable::Group* group = new VectorDrawable::Group(); + VectorDrawableRoot* vectorDrawable = new VectorDrawableRoot(group); + auto rootNode = TestUtils::createNode(0, 0, 200, 400, + [&](RenderProperties& props, Canvas& canvas) { + canvas.drawVectorDrawable(vectorDrawable); + }); + ContextFactory contextFactory; + std::unique_ptr canvasContext(CanvasContext::create( + renderThread, false, rootNode.get(), &contextFactory)); + TreeInfo info(TreeInfo::MODE_RT_ONLY, *canvasContext.get()); + DamageAccumulator damageAccumulator; + LayerUpdateQueue layerUpdateQueue; + info.damageAccumulator = &damageAccumulator; + info.layerUpdateQueue = &layerUpdateQueue; + info.observer = nullptr; + + // Put node on HW layer + rootNode->mutateStagingProperties().mutateLayerProperties().setType(LayerType::RenderLayer); + + TestUtils::syncHierarchyPropertiesAndDisplayList(rootNode); + rootNode->prepareTree(info); + + // Check that the VD is in the dislay list, and the layer update queue contains the correct + // damage rect. + EXPECT_FALSE(rootNode->getDisplayList()->getVectorDrawables().empty()); + EXPECT_FALSE(info.layerUpdateQueue->entries().empty()); + EXPECT_EQ(rootNode.get(), info.layerUpdateQueue->entries().at(0).renderNode); + EXPECT_EQ(uirenderer::Rect(0, 0, 200, 400), info.layerUpdateQueue->entries().at(0).damage); + + delete vectorDrawable; + canvasContext->destroy(nullptr); +}