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