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