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 <utils/LruCache.h>
2105f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik#include <utils/Mutex.h>
2205f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik#include <utils/Vector.h>
2305f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik
2405f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik#include "Debug.h"
2505f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik#include "utils/Macros.h"
2605f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik#include "utils/Pair.h"
2705f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik#include "VertexBuffer.h"
2805f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik
2905f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craikclass SkBitmap;
3005f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craikclass SkCanvas;
3105f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craikclass SkPaint;
3205f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craikclass SkPath;
3305f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craikstruct SkRect;
3405f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik
3505f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craiknamespace android {
3605f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craiknamespace uirenderer {
3705f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik
3805f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craikclass Caches;
3905f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik
4005f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik///////////////////////////////////////////////////////////////////////////////
4105f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik// Classes
4205f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik///////////////////////////////////////////////////////////////////////////////
4305f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik
4405f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craikclass TessellationCache {
4505f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craikpublic:
4605f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik    typedef Pair<VertexBuffer*, VertexBuffer*> vertexBuffer_pair_t;
4705f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik
4805f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik    struct Description {
4905f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik        DESCRIPTION_TYPE(Description);
5005f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik        enum Type {
5105f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik            kNone,
5205f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik            kRoundRect,
5305f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik        };
5405f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik
5505f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik        Type type;
566ac174b97246ed40fe780b29561603b61770fa17Chris Craik        float scaleX;
576ac174b97246ed40fe780b29561603b61770fa17Chris Craik        float scaleY;
58ed4ef0bc17c33ecd7e689e3c40244a7c1c6063d0Chris Craik        bool aa;
5905f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik        SkPaint::Cap cap;
6005f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik        SkPaint::Style style;
6105f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik        float strokeWidth;
6205f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik        union Shape {
6305f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik            struct RoundRect {
646ac174b97246ed40fe780b29561603b61770fa17Chris Craik                float width;
656ac174b97246ed40fe780b29561603b61770fa17Chris Craik                float height;
666ac174b97246ed40fe780b29561603b61770fa17Chris Craik                float rx;
676ac174b97246ed40fe780b29561603b61770fa17Chris Craik                float ry;
6805f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik            } roundRect;
6905f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik        } shape;
7005f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik
7105f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik        Description();
726ac174b97246ed40fe780b29561603b61770fa17Chris Craik        Description(Type type, const Matrix4& transform, const SkPaint& paint);
7305f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik        hash_t hash() const;
746ac174b97246ed40fe780b29561603b61770fa17Chris Craik        void setupMatrixAndPaint(Matrix4* matrix, SkPaint* paint) const;
7505f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik    };
7605f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik
7705f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik    struct ShadowDescription {
7805f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik        DESCRIPTION_TYPE(ShadowDescription);
7905f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik        const void* nodeKey;
8005f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik        float matrixData[16];
8105f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik
8205f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik        ShadowDescription();
8305f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik        ShadowDescription(const void* nodeKey, const Matrix4* drawTransform);
8405f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik        hash_t hash() const;
8505f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik    };
8605f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik
8705f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik    TessellationCache();
8805f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik    ~TessellationCache();
8905f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik
9005f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik    /**
9105f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik     * Clears the cache. This causes all TessellationBuffers to be deleted.
9205f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik     */
9305f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik    void clear();
9405f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik
9505f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik    /**
9605f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik     * Sets the maximum size of the cache in bytes.
9705f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik     */
9805f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik    void setMaxSize(uint32_t maxSize);
9905f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik    /**
10005f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik     * Returns the maximum size of the cache in bytes.
10105f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik     */
10205f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik    uint32_t getMaxSize();
10305f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik    /**
10405f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik     * Returns the current size of the cache in bytes.
10505f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik     */
10605f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik    uint32_t getSize();
10705f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik
10805f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik    /**
10905f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik     * Trims the contents of the cache, removing items until it's under its
11005f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik     * specified limit.
11105f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik     *
11205f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik     * Trimming is used for caches that support pre-caching from a worker
11305f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik     * thread. During pre-caching the maximum limit of the cache can be
11405f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik     * exceeded for the duration of the frame. It is therefore required to
11505f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik     * trim the cache at the end of the frame to keep the total amount of
11605f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik     * memory used under control.
11705f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik     *
11805f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik     * Also removes transient Shadow VertexBuffers, which aren't cached between frames.
11905f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik     */
12005f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik    void trim();
12105f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik
12205f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik    // TODO: precache/get for Oval, Lines, Points, etc.
12305f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik
1246ac174b97246ed40fe780b29561603b61770fa17Chris Craik    void precacheRoundRect(const Matrix4& transform, const SkPaint& paint,
1256ac174b97246ed40fe780b29561603b61770fa17Chris Craik            float width, float height, float rx, float ry) {
1266ac174b97246ed40fe780b29561603b61770fa17Chris Craik        getRoundRectBuffer(transform, paint, width, height, rx, ry);
12705f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik    }
1286ac174b97246ed40fe780b29561603b61770fa17Chris Craik    const VertexBuffer* getRoundRect(const Matrix4& transform, const SkPaint& paint,
1296ac174b97246ed40fe780b29561603b61770fa17Chris Craik            float width, float height, float rx, float ry);
13005f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik
13105f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik    void precacheShadows(const Matrix4* drawTransform, const Rect& localClip,
13205f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik            bool opaque, const SkPath* casterPerimeter,
13305f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik            const Matrix4* transformXY, const Matrix4* transformZ,
13405f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik            const Vector3& lightCenter, float lightRadius);
13505f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik
13605f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik    void getShadowBuffers(const Matrix4* drawTransform, const Rect& localClip,
13705f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik            bool opaque, const SkPath* casterPerimeter,
13805f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik            const Matrix4* transformXY, const Matrix4* transformZ,
13905f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik            const Vector3& lightCenter, float lightRadius,
14005f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik            vertexBuffer_pair_t& outBuffers);
14105f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik
14205f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craikprivate:
14305f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik    class Buffer;
14405f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik    class TessellationTask;
14505f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik    class TessellationProcessor;
14605f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik
1476ac174b97246ed40fe780b29561603b61770fa17Chris Craik    typedef VertexBuffer* (*Tessellator)(const Description&);
14805f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik
1496ac174b97246ed40fe780b29561603b61770fa17Chris Craik    Buffer* getRectBuffer(const Matrix4& transform, const SkPaint& paint,
1506ac174b97246ed40fe780b29561603b61770fa17Chris Craik            float width, float height);
1516ac174b97246ed40fe780b29561603b61770fa17Chris Craik    Buffer* getRoundRectBuffer(const Matrix4& transform, const SkPaint& paint,
1526ac174b97246ed40fe780b29561603b61770fa17Chris Craik            float width, float height, float rx, float ry);
15305f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik
1546ac174b97246ed40fe780b29561603b61770fa17Chris Craik    Buffer* getOrCreateBuffer(const Description& entry, Tessellator tessellator);
15505f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik
15605f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik    uint32_t mSize;
15705f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik    uint32_t mMaxSize;
15805f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik
15905f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik    bool mDebugEnabled;
16005f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik
16105f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik    mutable Mutex mLock;
16205f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik
16305f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik    ///////////////////////////////////////////////////////////////////////////////
16405f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik    // General tessellation caching
16505f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik    ///////////////////////////////////////////////////////////////////////////////
16605f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik    sp<TaskProcessor<VertexBuffer*> > mProcessor;
16705f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik    LruCache<Description, Buffer*> mCache;
16805f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik    class BufferRemovedListener : public OnEntryRemoved<Description, Buffer*> {
16905f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik        void operator()(Description& description, Buffer*& buffer);
17005f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik    };
17105f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik    BufferRemovedListener mBufferRemovedListener;
17205f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik
17305f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik    ///////////////////////////////////////////////////////////////////////////////
17405f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik    // Shadow tessellation caching
17505f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik    ///////////////////////////////////////////////////////////////////////////////
17605f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik    sp<TaskProcessor<vertexBuffer_pair_t*> > mShadowProcessor;
17705f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik
17805f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik    // holds a pointer, and implicit strong ref to each shadow task of the frame
17905f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik    LruCache<ShadowDescription, Task<vertexBuffer_pair_t*>*> mShadowCache;
18005f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik    class BufferPairRemovedListener : public OnEntryRemoved<ShadowDescription, Task<vertexBuffer_pair_t*>*> {
18105f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik        void operator()(ShadowDescription& description, Task<vertexBuffer_pair_t*>*& bufferPairTask) {
18205f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik            bufferPairTask->decStrong(NULL);
18305f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik        }
18405f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik    };
18505f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik    BufferPairRemovedListener mBufferPairRemovedListener;
18605f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik
18705f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik}; // class TessellationCache
18805f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik
18905f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik}; // namespace uirenderer
19005f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik}; // namespace android
19105f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik
19205f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik#endif // ANDROID_HWUI_PATH_CACHE_H
193