105f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik/* 205f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik * Copyright (C) 2013 The Android Open Source Project 305f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik * 405f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik * Licensed under the Apache License, Version 2.0 (the "License"); 505f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik * you may not use this file except in compliance with the License. 605f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik * You may obtain a copy of the License at 705f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik * 805f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik * http://www.apache.org/licenses/LICENSE-2.0 905f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik * 1005f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik * Unless required by applicable law or agreed to in writing, software 1105f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik * distributed under the License is distributed on an "AS IS" BASIS, 1205f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1305f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik * See the License for the specific language governing permissions and 1405f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik * limitations under the License. 1505f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik */ 1605f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik 1705f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik#ifndef ANDROID_HWUI_TESSELLATION_CACHE_H 1805f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik#define ANDROID_HWUI_TESSELLATION_CACHE_H 1905f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik 2005f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik#include "Debug.h" 2182f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck#include "Matrix.h" 2282f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck#include "Rect.h" 2382f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck#include "Vector.h" 24d8165e863b37d82c937ad960dc970f2d2cf72c2aChris Craik#include "VertexBuffer.h" 2582f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck#include "thread/TaskProcessor.h" 2605f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik#include "utils/Macros.h" 2705f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik#include "utils/Pair.h" 2805f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik 2982f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck#include <SkPaint.h> 306e068c0182f6f85bccb855a647510724d1c65a13Chris Craik#include <SkPath.h> 3182f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck 3282f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck#include <utils/LruCache.h> 3382f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck#include <utils/Mutex.h> 3482f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck#include <utils/StrongPointer.h> 3582f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck 3605f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craikclass SkBitmap; 3705f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craikclass SkCanvas; 3805f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craikstruct SkRect; 3905f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik 4005f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craiknamespace android { 4105f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craiknamespace uirenderer { 4205f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik 4305f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craikclass Caches; 442dc236b2bae13b9a0ed9b3f7320502aecd7983b3Tom Hudsonclass VertexBuffer; 4505f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik 4605f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik/////////////////////////////////////////////////////////////////////////////// 4705f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik// Classes 4805f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik/////////////////////////////////////////////////////////////////////////////// 4905f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik 5005f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craikclass TessellationCache { 5105f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craikpublic: 5205f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik typedef Pair<VertexBuffer*, VertexBuffer*> vertexBuffer_pair_t; 5305f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik 5405f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik struct Description { 557224e2b624daea67b5653285c9640f170c096bdbsergeyv HASHABLE_TYPE(Description); 567224e2b624daea67b5653285c9640f170c096bdbsergeyv enum class Type { 577224e2b624daea67b5653285c9640f170c096bdbsergeyv None, 587224e2b624daea67b5653285c9640f170c096bdbsergeyv RoundRect, 5905f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik }; 6005f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik 6105f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik Type type; 626ac174b97246ed40fe780b29561603b61770fa17Chris Craik float scaleX; 636ac174b97246ed40fe780b29561603b61770fa17Chris Craik float scaleY; 64ed4ef0bc17c33ecd7e689e3c40244a7c1c6063d0Chris Craik bool aa; 6505f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik SkPaint::Cap cap; 6605f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik SkPaint::Style style; 6705f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik float strokeWidth; 6805f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik union Shape { 6905f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik struct RoundRect { 706ac174b97246ed40fe780b29561603b61770fa17Chris Craik float width; 716ac174b97246ed40fe780b29561603b61770fa17Chris Craik float height; 726ac174b97246ed40fe780b29561603b61770fa17Chris Craik float rx; 736ac174b97246ed40fe780b29561603b61770fa17Chris Craik float ry; 7405f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik } roundRect; 7505f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik } shape; 7605f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik 7705f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik Description(); 786ac174b97246ed40fe780b29561603b61770fa17Chris Craik Description(Type type, const Matrix4& transform, const SkPaint& paint); 796ac174b97246ed40fe780b29561603b61770fa17Chris Craik void setupMatrixAndPaint(Matrix4* matrix, SkPaint* paint) const; 8005f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik }; 8105f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik 8205f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik struct ShadowDescription { 837224e2b624daea67b5653285c9640f170c096bdbsergeyv HASHABLE_TYPE(ShadowDescription); 847224e2b624daea67b5653285c9640f170c096bdbsergeyv const SkPath* nodeKey; 8505f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik float matrixData[16]; 8605f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik 8705f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik ShadowDescription(); 887224e2b624daea67b5653285c9640f170c096bdbsergeyv ShadowDescription(const SkPath* nodeKey, const Matrix4* drawTransform); 8905f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik }; 9005f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik 91d8165e863b37d82c937ad960dc970f2d2cf72c2aChris Craik class ShadowTask : public Task<vertexBuffer_pair_t> { 926e068c0182f6f85bccb855a647510724d1c65a13Chris Craik public: 936e068c0182f6f85bccb855a647510724d1c65a13Chris Craik ShadowTask(const Matrix4* drawTransform, const Rect& localClip, bool opaque, 946e068c0182f6f85bccb855a647510724d1c65a13Chris Craik const SkPath* casterPerimeter, const Matrix4* transformXY, const Matrix4* transformZ, 956e068c0182f6f85bccb855a647510724d1c65a13Chris Craik const Vector3& lightCenter, float lightRadius) 966e068c0182f6f85bccb855a647510724d1c65a13Chris Craik : drawTransform(*drawTransform) 976e068c0182f6f85bccb855a647510724d1c65a13Chris Craik , localClip(localClip) 986e068c0182f6f85bccb855a647510724d1c65a13Chris Craik , opaque(opaque) 996e068c0182f6f85bccb855a647510724d1c65a13Chris Craik , casterPerimeter(*casterPerimeter) 1006e068c0182f6f85bccb855a647510724d1c65a13Chris Craik , transformXY(*transformXY) 1016e068c0182f6f85bccb855a647510724d1c65a13Chris Craik , transformZ(*transformZ) 1026e068c0182f6f85bccb855a647510724d1c65a13Chris Craik , lightCenter(lightCenter) 1036e068c0182f6f85bccb855a647510724d1c65a13Chris Craik , lightRadius(lightRadius) { 1046e068c0182f6f85bccb855a647510724d1c65a13Chris Craik } 1056e068c0182f6f85bccb855a647510724d1c65a13Chris Craik 1066e068c0182f6f85bccb855a647510724d1c65a13Chris Craik /* Note - we deep copy all task parameters, because *even though* pointers into Allocator 1076e068c0182f6f85bccb855a647510724d1c65a13Chris Craik * controlled objects (like the SkPath and Matrix4s) should be safe for the entire frame, 1086e068c0182f6f85bccb855a647510724d1c65a13Chris Craik * certain Allocators are destroyed before trim() is called to flush incomplete tasks. 1096e068c0182f6f85bccb855a647510724d1c65a13Chris Craik * 110d8165e863b37d82c937ad960dc970f2d2cf72c2aChris Craik * These deep copies could be avoided, long term, by canceling or flushing outstanding 1116e068c0182f6f85bccb855a647510724d1c65a13Chris Craik * tasks before tearing down single-frame LinearAllocators. 1126e068c0182f6f85bccb855a647510724d1c65a13Chris Craik */ 1136e068c0182f6f85bccb855a647510724d1c65a13Chris Craik const Matrix4 drawTransform; 1146e068c0182f6f85bccb855a647510724d1c65a13Chris Craik const Rect localClip; 1156e068c0182f6f85bccb855a647510724d1c65a13Chris Craik bool opaque; 1166e068c0182f6f85bccb855a647510724d1c65a13Chris Craik const SkPath casterPerimeter; 1176e068c0182f6f85bccb855a647510724d1c65a13Chris Craik const Matrix4 transformXY; 1186e068c0182f6f85bccb855a647510724d1c65a13Chris Craik const Matrix4 transformZ; 1196e068c0182f6f85bccb855a647510724d1c65a13Chris Craik const Vector3 lightCenter; 1206e068c0182f6f85bccb855a647510724d1c65a13Chris Craik const float lightRadius; 121d8165e863b37d82c937ad960dc970f2d2cf72c2aChris Craik VertexBuffer ambientBuffer; 122d8165e863b37d82c937ad960dc970f2d2cf72c2aChris Craik VertexBuffer spotBuffer; 1236e068c0182f6f85bccb855a647510724d1c65a13Chris Craik }; 1246e068c0182f6f85bccb855a647510724d1c65a13Chris Craik 12505f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik TessellationCache(); 12605f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik ~TessellationCache(); 12705f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik 12805f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik /** 12905f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik * Clears the cache. This causes all TessellationBuffers to be deleted. 13005f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik */ 13105f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik void clear(); 13205f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik /** 13305f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik * Returns the maximum size of the cache in bytes. 13405f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik */ 13505f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik uint32_t getMaxSize(); 13605f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik /** 13705f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik * Returns the current size of the cache in bytes. 13805f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik */ 13905f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik uint32_t getSize(); 14005f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik 14105f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik /** 14205f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik * Trims the contents of the cache, removing items until it's under its 14305f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik * specified limit. 14405f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik * 14505f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik * Trimming is used for caches that support pre-caching from a worker 14605f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik * thread. During pre-caching the maximum limit of the cache can be 14705f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik * exceeded for the duration of the frame. It is therefore required to 14805f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik * trim the cache at the end of the frame to keep the total amount of 14905f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik * memory used under control. 15005f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik * 15105f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik * Also removes transient Shadow VertexBuffers, which aren't cached between frames. 15205f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik */ 15305f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik void trim(); 15405f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik 15505f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik // TODO: precache/get for Oval, Lines, Points, etc. 15605f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik 1576ac174b97246ed40fe780b29561603b61770fa17Chris Craik void precacheRoundRect(const Matrix4& transform, const SkPaint& paint, 1586ac174b97246ed40fe780b29561603b61770fa17Chris Craik float width, float height, float rx, float ry) { 1596ac174b97246ed40fe780b29561603b61770fa17Chris Craik getRoundRectBuffer(transform, paint, width, height, rx, ry); 16005f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik } 1616ac174b97246ed40fe780b29561603b61770fa17Chris Craik const VertexBuffer* getRoundRect(const Matrix4& transform, const SkPaint& paint, 1626ac174b97246ed40fe780b29561603b61770fa17Chris Craik float width, float height, float rx, float ry); 16305f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik 1646e068c0182f6f85bccb855a647510724d1c65a13Chris Craik // TODO: delete these when switching to HWUI_NEW_OPS 16505f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik void precacheShadows(const Matrix4* drawTransform, const Rect& localClip, 16605f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik bool opaque, const SkPath* casterPerimeter, 16705f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik const Matrix4* transformXY, const Matrix4* transformZ, 16805f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik const Vector3& lightCenter, float lightRadius); 16905f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik void getShadowBuffers(const Matrix4* drawTransform, const Rect& localClip, 17005f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik bool opaque, const SkPath* casterPerimeter, 17105f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik const Matrix4* transformXY, const Matrix4* transformZ, 17205f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik const Vector3& lightCenter, float lightRadius, 17305f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik vertexBuffer_pair_t& outBuffers); 17405f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik 1756e068c0182f6f85bccb855a647510724d1c65a13Chris Craik sp<ShadowTask> getShadowTask(const Matrix4* drawTransform, const Rect& localClip, 1766e068c0182f6f85bccb855a647510724d1c65a13Chris Craik bool opaque, const SkPath* casterPerimeter, 1776e068c0182f6f85bccb855a647510724d1c65a13Chris Craik const Matrix4* transformXY, const Matrix4* transformZ, 1786e068c0182f6f85bccb855a647510724d1c65a13Chris Craik const Vector3& lightCenter, float lightRadius); 1796e068c0182f6f85bccb855a647510724d1c65a13Chris Craik 18005f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craikprivate: 18105f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik class Buffer; 18205f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik class TessellationTask; 18305f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik class TessellationProcessor; 18405f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik 1856ac174b97246ed40fe780b29561603b61770fa17Chris Craik typedef VertexBuffer* (*Tessellator)(const Description&); 18605f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik 1876ac174b97246ed40fe780b29561603b61770fa17Chris Craik Buffer* getRectBuffer(const Matrix4& transform, const SkPaint& paint, 1886ac174b97246ed40fe780b29561603b61770fa17Chris Craik float width, float height); 1896ac174b97246ed40fe780b29561603b61770fa17Chris Craik Buffer* getRoundRectBuffer(const Matrix4& transform, const SkPaint& paint, 1906ac174b97246ed40fe780b29561603b61770fa17Chris Craik float width, float height, float rx, float ry); 19105f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik 1926ac174b97246ed40fe780b29561603b61770fa17Chris Craik Buffer* getOrCreateBuffer(const Description& entry, Tessellator tessellator); 19305f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik 19448a8f431fa52ae2ee25ffba9d20676f03bb710ffChris Craik const uint32_t mMaxSize; 19505f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik 19605f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik bool mDebugEnabled; 19705f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik 19805f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik mutable Mutex mLock; 19905f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik 20005f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik /////////////////////////////////////////////////////////////////////////////// 20105f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik // General tessellation caching 20205f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik /////////////////////////////////////////////////////////////////////////////// 20305f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik sp<TaskProcessor<VertexBuffer*> > mProcessor; 20405f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik LruCache<Description, Buffer*> mCache; 20505f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik class BufferRemovedListener : public OnEntryRemoved<Description, Buffer*> { 206e84a208317e0ed388fcdad1e6743c7849acb51b0Chris Craik void operator()(Description& description, Buffer*& buffer) override; 20705f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik }; 20805f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik BufferRemovedListener mBufferRemovedListener; 20905f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik 21005f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik /////////////////////////////////////////////////////////////////////////////// 21105f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik // Shadow tessellation caching 21205f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik /////////////////////////////////////////////////////////////////////////////// 213d8165e863b37d82c937ad960dc970f2d2cf72c2aChris Craik sp<TaskProcessor<vertexBuffer_pair_t> > mShadowProcessor; 21405f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik 21505f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik // holds a pointer, and implicit strong ref to each shadow task of the frame 216d8165e863b37d82c937ad960dc970f2d2cf72c2aChris Craik LruCache<ShadowDescription, Task<vertexBuffer_pair_t>*> mShadowCache; 217d8165e863b37d82c937ad960dc970f2d2cf72c2aChris Craik class BufferPairRemovedListener : public OnEntryRemoved<ShadowDescription, Task<vertexBuffer_pair_t>*> { 218d8165e863b37d82c937ad960dc970f2d2cf72c2aChris Craik void operator()(ShadowDescription& description, Task<vertexBuffer_pair_t>*& bufferPairTask) override { 219e84a208317e0ed388fcdad1e6743c7849acb51b0Chris Craik bufferPairTask->decStrong(nullptr); 22005f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik } 22105f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik }; 22205f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik BufferPairRemovedListener mBufferPairRemovedListener; 22305f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik 22405f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik}; // class TessellationCache 22505f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik 22682f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reckvoid tessellateShadows( 22782f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck const Matrix4* drawTransform, const Rect* localClip, 22882f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck bool isCasterOpaque, const SkPath* casterPerimeter, 22982f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck const Matrix4* casterTransformXY, const Matrix4* casterTransformZ, 23082f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck const Vector3& lightCenter, float lightRadius, 23182f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck VertexBuffer& ambientBuffer, VertexBuffer& spotBuffer); 23282f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck 23305f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik}; // namespace uirenderer 23405f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik}; // namespace android 23505f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik 23605f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik#endif // ANDROID_HWUI_PATH_CACHE_H 237