TextureCache.h revision eca0ca2424afc1e98912405906edfc32f7733e16
1ce0537b80087a6225273040a987414b1dd081aa0Romain Guy/* 2ce0537b80087a6225273040a987414b1dd081aa0Romain Guy * Copyright (C) 2010 The Android Open Source Project 3ce0537b80087a6225273040a987414b1dd081aa0Romain Guy * 4ce0537b80087a6225273040a987414b1dd081aa0Romain Guy * Licensed under the Apache License, Version 2.0 (the "License"); 5ce0537b80087a6225273040a987414b1dd081aa0Romain Guy * you may not use this file except in compliance with the License. 6ce0537b80087a6225273040a987414b1dd081aa0Romain Guy * You may obtain a copy of the License at 7ce0537b80087a6225273040a987414b1dd081aa0Romain Guy * 8ce0537b80087a6225273040a987414b1dd081aa0Romain Guy * http://www.apache.org/licenses/LICENSE-2.0 9ce0537b80087a6225273040a987414b1dd081aa0Romain Guy * 10ce0537b80087a6225273040a987414b1dd081aa0Romain Guy * Unless required by applicable law or agreed to in writing, software 11ce0537b80087a6225273040a987414b1dd081aa0Romain Guy * distributed under the License is distributed on an "AS IS" BASIS, 12ce0537b80087a6225273040a987414b1dd081aa0Romain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ce0537b80087a6225273040a987414b1dd081aa0Romain Guy * See the License for the specific language governing permissions and 14ce0537b80087a6225273040a987414b1dd081aa0Romain Guy * limitations under the License. 15ce0537b80087a6225273040a987414b1dd081aa0Romain Guy */ 16ce0537b80087a6225273040a987414b1dd081aa0Romain Guy 175b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#ifndef ANDROID_HWUI_TEXTURE_CACHE_H 185b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#define ANDROID_HWUI_TEXTURE_CACHE_H 19ce0537b80087a6225273040a987414b1dd081aa0Romain Guy 20ce0537b80087a6225273040a987414b1dd081aa0Romain Guy#include <SkBitmap.h> 21ce0537b80087a6225273040a987414b1dd081aa0Romain Guy 22fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy#include <utils/Vector.h> 23fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy 24c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy#include "Debug.h" 25ce0537b80087a6225273040a987414b1dd081aa0Romain Guy#include "Texture.h" 2621b028a44f3e0bd9b0f0432b8b92c45f661d22a4Romain Guy#include "utils/GenerationCache.h" 27ce0537b80087a6225273040a987414b1dd081aa0Romain Guy 28ce0537b80087a6225273040a987414b1dd081aa0Romain Guynamespace android { 29ce0537b80087a6225273040a987414b1dd081aa0Romain Guynamespace uirenderer { 30ce0537b80087a6225273040a987414b1dd081aa0Romain Guy 31d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase/////////////////////////////////////////////////////////////////////////////// 32d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase// Defines 33d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase/////////////////////////////////////////////////////////////////////////////// 34d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase 35d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase// Debug 36d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase#if DEBUG_TEXTURES 37d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase #define TEXTURE_LOGD(...) LOGD(__VA_ARGS__) 38d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase#else 39d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase #define TEXTURE_LOGD(...) 40d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase#endif 41d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase 429e10841c27d973b930e1b49a099c69d866659505Romain Guy/////////////////////////////////////////////////////////////////////////////// 439e10841c27d973b930e1b49a099c69d866659505Romain Guy// Classes 449e10841c27d973b930e1b49a099c69d866659505Romain Guy/////////////////////////////////////////////////////////////////////////////// 459e10841c27d973b930e1b49a099c69d866659505Romain Guy 46121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy/** 47121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy * A simple LRU texture cache. The cache has a maximum size expressed in bytes. 48121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy * Any texture added to the cache causing the cache to grow beyond the maximum 49121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy * allowed size will also cause the oldest texture to be kicked out. 50121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy */ 51ce0537b80087a6225273040a987414b1dd081aa0Romain Guyclass TextureCache: public OnEntryRemoved<SkBitmap*, Texture*> { 52ce0537b80087a6225273040a987414b1dd081aa0Romain Guypublic: 53fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy TextureCache(); 547d139ba2c331f11e9b485753cc727a0ff202f2a4Romain Guy TextureCache(uint32_t maxByteSize); 55ce0537b80087a6225273040a987414b1dd081aa0Romain Guy ~TextureCache(); 56ce0537b80087a6225273040a987414b1dd081aa0Romain Guy 57121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy /** 58121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy * Used as a callback when an entry is removed from the cache. 59121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy * Do not invoke directly. 60121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy */ 61dda570201ac851dd85af3861f7e575721d3345daRomain Guy void operator()(SkBitmap*& bitmap, Texture*& texture); 62ce0537b80087a6225273040a987414b1dd081aa0Romain Guy 63121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy /** 64121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy * Returns the texture associated with the specified bitmap. If the texture 65121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy * cannot be found in the cache, a new texture is generated. 66121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy */ 67ce0537b80087a6225273040a987414b1dd081aa0Romain Guy Texture* get(SkBitmap* bitmap); 68121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy /** 69fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy * Removes the texture associated with the specified bitmap. 70fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy * Upon remove the texture is freed. 71121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy */ 72121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy void remove(SkBitmap* bitmap); 73121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy /** 74fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy * Removes the texture associated with the specified bitmap. This is meant 75fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy * to be called from threads that are not the EGL context thread. 76fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy */ 77fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy void removeDeferred(SkBitmap* bitmap); 78fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy /** 79fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy * Process deferred removals. 80fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy */ 81fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy void clearGarbage(); 82fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy 83fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy /** 84121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy * Clears the cache. This causes all textures to be deleted. 85121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy */ 86ce0537b80087a6225273040a987414b1dd081aa0Romain Guy void clear(); 87ce0537b80087a6225273040a987414b1dd081aa0Romain Guy 88121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy /** 89121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy * Sets the maximum size of the cache in bytes. 90121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy */ 917d139ba2c331f11e9b485753cc727a0ff202f2a4Romain Guy void setMaxSize(uint32_t maxSize); 92121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy /** 93121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy * Returns the maximum size of the cache in bytes. 94121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy */ 957d139ba2c331f11e9b485753cc727a0ff202f2a4Romain Guy uint32_t getMaxSize(); 96121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy /** 97121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy * Returns the current size of the cache in bytes. 98121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy */ 997d139ba2c331f11e9b485753cc727a0ff202f2a4Romain Guy uint32_t getSize(); 100121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy 101eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy /** 102eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy * Partially flushes the cache. The amount of memory freed by a flush 103eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy * is defined by the flush rate. 104eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy */ 105eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy void flush(); 106eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy /** 107eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy * Indicates the percentage of the cache to retain when a 108eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy * memory trim is requested (see Caches::flush). 109eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy */ 110eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy void setFlushRate(float flushRate); 111eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy 112ce0537b80087a6225273040a987414b1dd081aa0Romain Guyprivate: 113121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy /** 114121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy * Generates the texture from a bitmap into the specified texture structure. 115121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy * 116121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy * @param regenerate If true, the bitmap data is reuploaded into the texture, but 117121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy * no new texture is generated. 118121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy */ 119fe8809471a40cac8acc984adfa51c39e13e83947Romain Guy void generateTexture(SkBitmap* bitmap, Texture* texture, bool regenerate = false); 120ce0537b80087a6225273040a987414b1dd081aa0Romain Guy 1215b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy void uploadLoFiTexture(bool resize, SkBitmap* bitmap, uint32_t width, uint32_t height); 1228c749f87d29e1a363ddf9027c3a51753c612d510Romain Guy void uploadToTexture(bool resize, GLenum format, GLsizei width, GLsizei height, 1238c749f87d29e1a363ddf9027c3a51753c612d510Romain Guy GLenum type, const GLvoid * data); 1248c749f87d29e1a363ddf9027c3a51753c612d510Romain Guy 125fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy void init(); 126fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy 1276c81893c626499e58c8eeb20d6c35ec4e1ce808bRomain Guy GenerationCache<SkBitmap*, Texture*> mCache; 128121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy 1297d139ba2c331f11e9b485753cc727a0ff202f2a4Romain Guy uint32_t mSize; 1307d139ba2c331f11e9b485753cc727a0ff202f2a4Romain Guy uint32_t mMaxSize; 131163935113919a184122b8b3bd672ef08c8df65dcRomain Guy GLint mMaxTextureSize; 1329aaa8269a3e7291aab84d01c3fc9c744d8f2d2f4Romain Guy 133eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy float mFlushRate; 134eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy 135e190aa69756aecfaffabdd4c6d32cb6b3220d842Romain Guy bool mDebugEnabled; 136e190aa69756aecfaffabdd4c6d32cb6b3220d842Romain Guy 137fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy Vector<SkBitmap*> mGarbage; 1389aaa8269a3e7291aab84d01c3fc9c744d8f2d2f4Romain Guy mutable Mutex mLock; 139ce0537b80087a6225273040a987414b1dd081aa0Romain Guy}; // class TextureCache 140ce0537b80087a6225273040a987414b1dd081aa0Romain Guy 141ce0537b80087a6225273040a987414b1dd081aa0Romain Guy}; // namespace uirenderer 142ce0537b80087a6225273040a987414b1dd081aa0Romain Guy}; // namespace android 143ce0537b80087a6225273040a987414b1dd081aa0Romain Guy 1445b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_TEXTURE_CACHE_H 145