17db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck/* 27db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck * Copyright (C) 2016 The Android Open Source Project 37db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck * 47db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck * Licensed under the Apache License, Version 2.0 (the "License"); 57db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck * you may not use this file except in compliance with the License. 67db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck * You may obtain a copy of the License at 77db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck * 87db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck * http://www.apache.org/licenses/LICENSE-2.0 97db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck * 107db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck * Unless required by applicable law or agreed to in writing, software 117db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck * distributed under the License is distributed on an "AS IS" BASIS, 127db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck * See the License for the specific language governing permissions and 147db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck * limitations under the License. 157db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck */ 167db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck 177db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck#include "BakedOpRenderer.h" 187db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck#include "BakedOpDispatcher.h" 197db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck#include "FrameBuilder.h" 207db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck#include "LayerUpdateQueue.h" 217db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck#include "RecordingCanvas.h" 227db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck#include "tests/common/TestUtils.h" 237db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck 247db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck#include <gtest/gtest.h> 257db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck 267db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reckusing namespace android; 277db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reckusing namespace android::uirenderer; 287db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck 296e068c0182f6f85bccb855a647510724d1c65a13Chris Craikconst FrameBuilder::LightGeometry sLightGeometery = { {100, 100, 100}, 50}; 306e068c0182f6f85bccb855a647510724d1c65a13Chris Craikconst BakedOpRenderer::LightInfo sLightInfo = { 128, 128 }; 317db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck 3274af6e282f8a8f75928a071e8200039517cf5c12Chris CraikRENDERTHREAD_TEST(LeakCheck, saveLayer_overdrawRejection) { 3374af6e282f8a8f75928a071e8200039517cf5c12Chris Craik auto node = TestUtils::createNode(0, 0, 100, 100, 3474af6e282f8a8f75928a071e8200039517cf5c12Chris Craik [](RenderProperties& props, RecordingCanvas& canvas) { 3574af6e282f8a8f75928a071e8200039517cf5c12Chris Craik canvas.saveLayerAlpha(0, 0, 100, 100, 128, SaveFlags::ClipToLayer); 3674af6e282f8a8f75928a071e8200039517cf5c12Chris Craik canvas.drawRect(0, 0, 100, 100, SkPaint()); 3774af6e282f8a8f75928a071e8200039517cf5c12Chris Craik canvas.restore(); 3874af6e282f8a8f75928a071e8200039517cf5c12Chris Craik 3974af6e282f8a8f75928a071e8200039517cf5c12Chris Craik // opaque draw, rejects saveLayer beneath 4074af6e282f8a8f75928a071e8200039517cf5c12Chris Craik canvas.drawRect(0, 0, 100, 100, SkPaint()); 4174af6e282f8a8f75928a071e8200039517cf5c12Chris Craik }); 4274af6e282f8a8f75928a071e8200039517cf5c12Chris Craik RenderState& renderState = renderThread.renderState(); 4374af6e282f8a8f75928a071e8200039517cf5c12Chris Craik Caches& caches = Caches::getInstance(); 4474af6e282f8a8f75928a071e8200039517cf5c12Chris Craik 459cd1bbe5c9e14472e631d8cc10005613925f34afChris Craik FrameBuilder frameBuilder(SkRect::MakeWH(100, 100), 100, 100, 469cd1bbe5c9e14472e631d8cc10005613925f34afChris Craik sLightGeometery, Caches::getInstance()); 479cd1bbe5c9e14472e631d8cc10005613925f34afChris Craik frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node)); 4874af6e282f8a8f75928a071e8200039517cf5c12Chris Craik BakedOpRenderer renderer(caches, renderState, true, sLightInfo); 4974af6e282f8a8f75928a071e8200039517cf5c12Chris Craik frameBuilder.replayBakedOps<BakedOpDispatcher>(renderer); 5074af6e282f8a8f75928a071e8200039517cf5c12Chris Craik} 5174af6e282f8a8f75928a071e8200039517cf5c12Chris Craik 527db5ffb7dbd30202468459e2ef4426e91d4fcbb3John ReckRENDERTHREAD_TEST(LeakCheck, saveLayerUnclipped_simple) { 537db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck auto node = TestUtils::createNode(0, 0, 200, 200, 547db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck [](RenderProperties& props, RecordingCanvas& canvas) { 55eecff56fed5dd5206acfbc5007b4912081b36d3bFlorin Malita canvas.saveLayerAlpha(10, 10, 190, 190, 128, (SaveFlags::Flags)(0)); 567db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck canvas.drawRect(0, 0, 200, 200, SkPaint()); 577db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck canvas.restore(); 587db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck }); 597db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck RenderState& renderState = renderThread.renderState(); 607db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck Caches& caches = Caches::getInstance(); 617db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck 629cd1bbe5c9e14472e631d8cc10005613925f34afChris Craik FrameBuilder frameBuilder(SkRect::MakeWH(200, 200), 200, 200, 639cd1bbe5c9e14472e631d8cc10005613925f34afChris Craik sLightGeometery, Caches::getInstance()); 649cd1bbe5c9e14472e631d8cc10005613925f34afChris Craik frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node)); 656e068c0182f6f85bccb855a647510724d1c65a13Chris Craik BakedOpRenderer renderer(caches, renderState, true, sLightInfo); 667db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck frameBuilder.replayBakedOps<BakedOpDispatcher>(renderer); 677db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck} 68