SkiaDisplayListTests.cpp revision 0df6209a02d0ea99d2dff3a46ed9febd5925df4b
10df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger/* 20df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger * Copyright (C) 2016 The Android Open Source Project 30df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger * 40df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger * Licensed under the Apache License, Version 2.0 (the "License"); 50df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger * you may not use this file except in compliance with the License. 60df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger * You may obtain a copy of the License at 70df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger * 80df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger * http://www.apache.org/licenses/LICENSE-2.0 90df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger * 100df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger * Unless required by applicable law or agreed to in writing, software 110df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger * distributed under the License is distributed on an "AS IS" BASIS, 120df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger * See the License for the specific language governing permissions and 140df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger * limitations under the License. 150df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger */ 160df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger 170df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger#include <gtest/gtest.h> 180df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger#include <VectorDrawable.h> 190df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger 200df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger#include "AnimationContext.h" 210df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger#include "DamageAccumulator.h" 220df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger#include "IContextFactory.h" 230df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger#include "SkiaDisplayList.h" 240df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger#include "renderthread/CanvasContext.h" 250df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger#include "tests/common/TestUtils.h" 260df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger 270df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger 280df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenbergerusing namespace android; 290df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenbergerusing namespace android::uirenderer; 300df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenbergerusing namespace android::uirenderer::renderthread; 310df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger 320df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek SollenbergerTEST(SkiaDisplayList, create) { 330df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger SkRect bounds = SkRect::MakeWH(200, 200); 340df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger SkiaDisplayList skiaDL(bounds); 350df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger ASSERT_TRUE(skiaDL.isEmpty()); 360df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger ASSERT_FALSE(skiaDL.mIsProjectionReceiver); 370df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger ASSERT_EQ(skiaDL.mDrawable->getBounds(), bounds); 380df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger} 390df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger 400df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek SollenbergerTEST(SkiaDisplayList, reset) { 410df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger SkRect bounds = SkRect::MakeWH(200, 200); 420df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger SkiaDisplayList skiaDL(bounds); 430df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger 440df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger SkCanvas dummyCanvas; 450df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger skiaDL.mChildNodes.emplace_back(nullptr, &dummyCanvas); 460df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger skiaDL.mChildFunctors.emplace_back(nullptr, nullptr, &dummyCanvas); 470df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger skiaDL.mMutableImages.push_back(nullptr); 480df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger skiaDL.mVectorDrawables.push_back(nullptr); 490df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger skiaDL.mDrawable->drawAnnotation(bounds, "testAnnotation", nullptr); 500df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger skiaDL.mIsProjectionReceiver = true; 510df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger 520df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger ASSERT_EQ(skiaDL.mDrawable->getBounds(), bounds); 530df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger ASSERT_FALSE(skiaDL.mChildNodes.empty()); 540df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger ASSERT_FALSE(skiaDL.mChildFunctors.empty()); 550df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger ASSERT_FALSE(skiaDL.mMutableImages.empty()); 560df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger ASSERT_FALSE(skiaDL.mVectorDrawables.empty()); 570df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger ASSERT_FALSE(skiaDL.isEmpty()); 580df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger ASSERT_TRUE(skiaDL.mIsProjectionReceiver); 590df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger 600df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger bounds = SkRect::MakeWH(100, 100); 610df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger skiaDL.reset(nullptr, bounds); 620df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger 630df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger ASSERT_EQ(skiaDL.mDrawable->getBounds(), bounds); 640df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger ASSERT_TRUE(skiaDL.mChildNodes.empty()); 650df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger ASSERT_TRUE(skiaDL.mChildFunctors.empty()); 660df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger ASSERT_TRUE(skiaDL.mMutableImages.empty()); 670df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger ASSERT_TRUE(skiaDL.mVectorDrawables.empty()); 680df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger ASSERT_TRUE(skiaDL.isEmpty()); 690df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger ASSERT_FALSE(skiaDL.mIsProjectionReceiver); 700df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger} 710df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger 720df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek SollenbergerTEST(SkiaDisplayList, reuseDisplayList) { 730df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger sp<RenderNode> renderNode = new RenderNode(); 740df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger std::unique_ptr<SkiaDisplayList> availableList; 750df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger 760df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger // no list has been attached so it should return a nullptr 770df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger availableList = renderNode->detachAvailableList(); 780df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger ASSERT_EQ(availableList.get(), nullptr); 790df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger 800df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger // attach a displayList for reuse 810df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger SkiaDisplayList skiaDL(SkRect::MakeWH(200, 200)); 820df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger ASSERT_TRUE(skiaDL.reuseDisplayList(renderNode.get(), nullptr)); 830df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger 840df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger // detach the list that you just attempted to reuse 850df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger availableList = renderNode->detachAvailableList(); 860df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger ASSERT_EQ(availableList.get(), &skiaDL); 870df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger availableList.release(); // prevents an invalid free since our DL is stack allocated 880df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger 890df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger // after detaching there should return no available list 900df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger availableList = renderNode->detachAvailableList(); 910df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger ASSERT_EQ(availableList.get(), nullptr); 920df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger} 930df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger 940df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenbergerclass TestFunctor : public Functor { 950df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenbergerpublic: 960df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger bool didSync = false; 970df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger 980df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger virtual status_t operator ()(int what, void* data) { 990df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger if (what == DrawGlInfo::kModeSync) { didSync = true; } 1000df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger return DrawGlInfo::kStatusDone; 1010df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger } 1020df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger}; 1030df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger 1040df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek SollenbergerTEST(SkiaDisplayList, syncContexts) { 1050df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger SkRect bounds = SkRect::MakeWH(200, 200); 1060df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger SkiaDisplayList skiaDL(bounds); 1070df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger 1080df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger SkCanvas dummyCanvas; 1090df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger TestFunctor functor; 1100df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger skiaDL.mChildFunctors.emplace_back(&functor, nullptr, &dummyCanvas); 1110df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger 1120df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger VectorDrawableRoot vectorDrawable(new VectorDrawable::Group()); 1130df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger vectorDrawable.mutateStagingProperties()->setBounds(bounds); 1140df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger skiaDL.mVectorDrawables.push_back(&vectorDrawable); 1150df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger 1160df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger // ensure that the functor and vectorDrawable are properly synced 1170df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger skiaDL.syncContents(); 1180df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger 1190df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger ASSERT_TRUE(functor.didSync); 1200df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger ASSERT_EQ(vectorDrawable.mutateProperties()->getBounds(), bounds); 1210df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger} 1220df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger 1230df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenbergerclass ContextFactory : public IContextFactory { 1240df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenbergerpublic: 1250df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger virtual AnimationContext* createAnimationContext(renderthread::TimeLord& clock) override { 1260df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger return new AnimationContext(clock); 1270df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger } 1280df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger}; 1290df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger 1300df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek SollenbergerRENDERTHREAD_TEST(SkiaDisplayList, prepareListAndChildren) { 1310df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger auto rootNode = TestUtils::createNode(0, 0, 200, 400, nullptr); 1320df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger ContextFactory contextFactory; 1330df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger std::unique_ptr<CanvasContext> canvasContext(CanvasContext::create( 1340df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger renderThread, false, rootNode.get(), &contextFactory)); 1350df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger TreeInfo info(TreeInfo::MODE_FULL, *canvasContext.get()); 1360df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger DamageAccumulator damageAccumulator; 1370df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger info.damageAccumulator = &damageAccumulator; 1380df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger info.observer = nullptr; 1390df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger 1400df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger SkiaDisplayList skiaDL(SkRect::MakeWH(200, 200)); 1410df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger 1420df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger // prepare with a clean VD 1430df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger VectorDrawableRoot cleanVD(new VectorDrawable::Group()); 1440df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger skiaDL.mVectorDrawables.push_back(&cleanVD); 1450df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger cleanVD.getBitmapUpdateIfDirty(); // this clears the dirty bit 1460df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger 1470df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger ASSERT_FALSE(cleanVD.isDirty()); 1480df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger ASSERT_FALSE(cleanVD.getPropertyChangeWillBeConsumed()); 1490df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger ASSERT_FALSE(skiaDL.prepareListAndChildren(info, false, [](RenderNode*, TreeInfo&, bool) {})); 1500df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger ASSERT_TRUE(cleanVD.getPropertyChangeWillBeConsumed()); 1510df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger 1520df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger // prepare again this time adding a dirty VD 1530df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger VectorDrawableRoot dirtyVD(new VectorDrawable::Group()); 1540df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger skiaDL.mVectorDrawables.push_back(&dirtyVD); 1550df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger 1560df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger ASSERT_TRUE(dirtyVD.isDirty()); 1570df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger ASSERT_FALSE(dirtyVD.getPropertyChangeWillBeConsumed()); 1580df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger ASSERT_TRUE(skiaDL.prepareListAndChildren(info, false, [](RenderNode*, TreeInfo&, bool) {})); 1590df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger ASSERT_TRUE(dirtyVD.getPropertyChangeWillBeConsumed()); 1600df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger 1610df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger // prepare again this time adding a RenderNode and a callback 1620df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger sp<RenderNode> renderNode = new RenderNode(); 1630df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger TreeInfo* infoPtr = &info; 1640df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger SkCanvas dummyCanvas; 1650df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger skiaDL.mChildNodes.emplace_back(renderNode.get(), &dummyCanvas); 1660df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger bool hasRun = false; 1670df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger ASSERT_TRUE(skiaDL.prepareListAndChildren(info, false, 1680df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger [&hasRun, renderNode, infoPtr](RenderNode* n, TreeInfo& i, bool r) { 1690df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger hasRun = true; 1700df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger ASSERT_EQ(renderNode.get(), n); 1710df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger ASSERT_EQ(infoPtr, &i); 1720df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger ASSERT_FALSE(r); 1730df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger })); 1740df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger ASSERT_TRUE(hasRun); 1750df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger 1760df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger canvasContext->destroy(nullptr); 1770df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger} 1780df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger 1790df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek SollenbergerTEST(SkiaDisplayList, updateChildren) { 1800df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger SkRect bounds = SkRect::MakeWH(200, 200); 1810df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger SkiaDisplayList skiaDL(bounds); 1820df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger 1830df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger sp<RenderNode> renderNode = new RenderNode(); 1840df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger SkCanvas dummyCanvas; 1850df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger skiaDL.mChildNodes.emplace_back(renderNode.get(), &dummyCanvas); 1860df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger skiaDL.updateChildren([renderNode](RenderNode* n) { 1870df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger ASSERT_EQ(renderNode.get(), n); 1880df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger }); 1890df6209a02d0ea99d2dff3a46ed9febd5925df4bDerek Sollenberger} 190