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
This commit is contained in:
Doris Liu
2016-08-02 17:28:30 -07:00
parent d02c611c9e
commit 5876e7df04
2 changed files with 37 additions and 1 deletions

View File

@@ -101,7 +101,7 @@ public:
const LsaVector<const SkBitmap*>& getBitmapResources() const { return bitmapResources; }
const LsaVector<FunctorContainer>& getFunctors() const { return functors; }
const LsaVector<VectorDrawableRoot*>& getVectorDrawables() { return vectorDrawables; }
const LsaVector<VectorDrawableRoot*>& getVectorDrawables() const { return vectorDrawables; }
size_t addChild(NodeOpType* childOp);

View File

@@ -15,6 +15,7 @@
*/
#include <gtest/gtest.h>
#include <VectorDrawable.h>
#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(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);
}