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