TextureCache.h revision 029f64303b8fe506ef34c12777da86b830d3bf7a
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 22029f64303b8fe506ef34c12777da86b830d3bf7aDerek Sollenberger#include <utils/Mutex.h> 23fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy#include <utils/Vector.h> 24fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy 25c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy#include "Debug.h" 26ce0537b80087a6225273040a987414b1dd081aa0Romain Guy#include "Texture.h" 2721b028a44f3e0bd9b0f0432b8b92c45f661d22a4Romain Guy#include "utils/GenerationCache.h" 28ce0537b80087a6225273040a987414b1dd081aa0Romain Guy 29ce0537b80087a6225273040a987414b1dd081aa0Romain Guynamespace android { 30ce0537b80087a6225273040a987414b1dd081aa0Romain Guynamespace uirenderer { 31ce0537b80087a6225273040a987414b1dd081aa0Romain Guy 32d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase/////////////////////////////////////////////////////////////////////////////// 33d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase// Defines 34d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase/////////////////////////////////////////////////////////////////////////////// 35d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase 36d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase// Debug 37d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase#if DEBUG_TEXTURES 385baa3a62a97544669fba6d65a11c07f252e654ddSteve Block #define TEXTURE_LOGD(...) ALOGD(__VA_ARGS__) 39d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase#else 40d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase #define TEXTURE_LOGD(...) 41d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase#endif 42d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase 439e10841c27d973b930e1b49a099c69d866659505Romain Guy/////////////////////////////////////////////////////////////////////////////// 449e10841c27d973b930e1b49a099c69d866659505Romain Guy// Classes 459e10841c27d973b930e1b49a099c69d866659505Romain Guy/////////////////////////////////////////////////////////////////////////////// 469e10841c27d973b930e1b49a099c69d866659505Romain Guy 47121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy/** 48121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy * A simple LRU texture cache. The cache has a maximum size expressed in bytes. 49121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy * Any texture added to the cache causing the cache to grow beyond the maximum 50121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy * allowed size will also cause the oldest texture to be kicked out. 51121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy */ 52ce0537b80087a6225273040a987414b1dd081aa0Romain Guyclass TextureCache: public OnEntryRemoved<SkBitmap*, Texture*> { 53ce0537b80087a6225273040a987414b1dd081aa0Romain Guypublic: 54fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy TextureCache(); 557d139ba2c331f11e9b485753cc727a0ff202f2a4Romain Guy TextureCache(uint32_t maxByteSize); 56ce0537b80087a6225273040a987414b1dd081aa0Romain Guy ~TextureCache(); 57ce0537b80087a6225273040a987414b1dd081aa0Romain Guy 58121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy /** 59121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy * Used as a callback when an entry is removed from the cache. 60121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy * Do not invoke directly. 61121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy */ 62dda570201ac851dd85af3861f7e575721d3345daRomain Guy void operator()(SkBitmap*& bitmap, Texture*& texture); 63ce0537b80087a6225273040a987414b1dd081aa0Romain Guy 64121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy /** 65121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy * Returns the texture associated with the specified bitmap. If the texture 66121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy * cannot be found in the cache, a new texture is generated. 67121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy */ 68ce0537b80087a6225273040a987414b1dd081aa0Romain Guy Texture* get(SkBitmap* bitmap); 69121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy /** 70fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy * Removes the texture associated with the specified bitmap. 71fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy * Upon remove the texture is freed. 72121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy */ 73121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy void remove(SkBitmap* bitmap); 74121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy /** 75fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy * Removes the texture associated with the specified bitmap. This is meant 76fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy * to be called from threads that are not the EGL context thread. 77fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy */ 78fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy void removeDeferred(SkBitmap* bitmap); 79fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy /** 80fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy * Process deferred removals. 81fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy */ 82fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy void clearGarbage(); 83fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy 84fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy /** 85121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy * Clears the cache. This causes all textures to be deleted. 86121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy */ 87ce0537b80087a6225273040a987414b1dd081aa0Romain Guy void clear(); 88ce0537b80087a6225273040a987414b1dd081aa0Romain Guy 89121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy /** 90121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy * Sets the maximum size of the cache in bytes. 91121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy */ 927d139ba2c331f11e9b485753cc727a0ff202f2a4Romain Guy void setMaxSize(uint32_t maxSize); 93121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy /** 94121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy * Returns the maximum size of the cache in bytes. 95121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy */ 967d139ba2c331f11e9b485753cc727a0ff202f2a4Romain Guy uint32_t getMaxSize(); 97121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy /** 98121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy * Returns the current size of the cache in bytes. 99121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy */ 1007d139ba2c331f11e9b485753cc727a0ff202f2a4Romain Guy uint32_t getSize(); 101121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy 102eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy /** 103eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy * Partially flushes the cache. The amount of memory freed by a flush 104eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy * is defined by the flush rate. 105eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy */ 106eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy void flush(); 107eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy /** 108eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy * Indicates the percentage of the cache to retain when a 109eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy * memory trim is requested (see Caches::flush). 110eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy */ 111eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy void setFlushRate(float flushRate); 112eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy 113ce0537b80087a6225273040a987414b1dd081aa0Romain Guyprivate: 114121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy /** 115121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy * Generates the texture from a bitmap into the specified texture structure. 116121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy * 117121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy * @param regenerate If true, the bitmap data is reuploaded into the texture, but 118121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy * no new texture is generated. 119121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy */ 120fe8809471a40cac8acc984adfa51c39e13e83947Romain Guy void generateTexture(SkBitmap* bitmap, Texture* texture, bool regenerate = false); 121ce0537b80087a6225273040a987414b1dd081aa0Romain Guy 1225b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy void uploadLoFiTexture(bool resize, SkBitmap* bitmap, uint32_t width, uint32_t height); 1238c749f87d29e1a363ddf9027c3a51753c612d510Romain Guy void uploadToTexture(bool resize, GLenum format, GLsizei width, GLsizei height, 1248c749f87d29e1a363ddf9027c3a51753c612d510Romain Guy GLenum type, const GLvoid * data); 1258c749f87d29e1a363ddf9027c3a51753c612d510Romain Guy 126fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy void init(); 127fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy 1286c81893c626499e58c8eeb20d6c35ec4e1ce808bRomain Guy GenerationCache<SkBitmap*, Texture*> mCache; 129121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy 1307d139ba2c331f11e9b485753cc727a0ff202f2a4Romain Guy uint32_t mSize; 1317d139ba2c331f11e9b485753cc727a0ff202f2a4Romain Guy uint32_t mMaxSize; 132163935113919a184122b8b3bd672ef08c8df65dcRomain Guy GLint mMaxTextureSize; 1339aaa8269a3e7291aab84d01c3fc9c744d8f2d2f4Romain Guy 134eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy float mFlushRate; 135eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy 136e190aa69756aecfaffabdd4c6d32cb6b3220d842Romain Guy bool mDebugEnabled; 137e190aa69756aecfaffabdd4c6d32cb6b3220d842Romain Guy 138fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy Vector<SkBitmap*> mGarbage; 1399aaa8269a3e7291aab84d01c3fc9c744d8f2d2f4Romain Guy mutable Mutex mLock; 140ce0537b80087a6225273040a987414b1dd081aa0Romain Guy}; // class TextureCache 141ce0537b80087a6225273040a987414b1dd081aa0Romain Guy 142ce0537b80087a6225273040a987414b1dd081aa0Romain Guy}; // namespace uirenderer 143ce0537b80087a6225273040a987414b1dd081aa0Romain Guy}; // namespace android 144ce0537b80087a6225273040a987414b1dd081aa0Romain Guy 1455b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_TEXTURE_CACHE_H 146