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 /** 70e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy * Returns the texture associated with the specified bitmap. The generated 71e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy * texture is not kept in the cache. The caller must destroy the texture. 72e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy */ 73e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy Texture* getTransient(SkBitmap* bitmap); 74e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy /** 75fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy * Removes the texture associated with the specified bitmap. 76fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy * Upon remove the texture is freed. 77121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy */ 78121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy void remove(SkBitmap* bitmap); 79121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy /** 80fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy * Removes the texture associated with the specified bitmap. This is meant 81fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy * to be called from threads that are not the EGL context thread. 82fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy */ 83fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy void removeDeferred(SkBitmap* bitmap); 84fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy /** 85fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy * Process deferred removals. 86fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy */ 87fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy void clearGarbage(); 88fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy 89fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy /** 90121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy * Clears the cache. This causes all textures to be deleted. 91121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy */ 92ce0537b80087a6225273040a987414b1dd081aa0Romain Guy void clear(); 93ce0537b80087a6225273040a987414b1dd081aa0Romain Guy 94121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy /** 95121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy * Sets the maximum size of the cache in bytes. 96121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy */ 977d139ba2c331f11e9b485753cc727a0ff202f2a4Romain Guy void setMaxSize(uint32_t maxSize); 98121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy /** 99121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy * Returns the maximum size of the cache in bytes. 100121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy */ 1017d139ba2c331f11e9b485753cc727a0ff202f2a4Romain Guy uint32_t getMaxSize(); 102121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy /** 103121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy * Returns the current size of the cache in bytes. 104121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy */ 1057d139ba2c331f11e9b485753cc727a0ff202f2a4Romain Guy uint32_t getSize(); 106121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy 107eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy /** 108eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy * Partially flushes the cache. The amount of memory freed by a flush 109eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy * is defined by the flush rate. 110eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy */ 111eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy void flush(); 112eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy /** 113eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy * Indicates the percentage of the cache to retain when a 114eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy * memory trim is requested (see Caches::flush). 115eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy */ 116eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy void setFlushRate(float flushRate); 117eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy 118ce0537b80087a6225273040a987414b1dd081aa0Romain Guyprivate: 119121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy /** 120121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy * Generates the texture from a bitmap into the specified texture structure. 121121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy * 122121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy * @param regenerate If true, the bitmap data is reuploaded into the texture, but 123121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy * no new texture is generated. 124121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy */ 125fe8809471a40cac8acc984adfa51c39e13e83947Romain Guy void generateTexture(SkBitmap* bitmap, Texture* texture, bool regenerate = false); 126ce0537b80087a6225273040a987414b1dd081aa0Romain Guy 1275b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy void uploadLoFiTexture(bool resize, SkBitmap* bitmap, uint32_t width, uint32_t height); 1288c749f87d29e1a363ddf9027c3a51753c612d510Romain Guy void uploadToTexture(bool resize, GLenum format, GLsizei width, GLsizei height, 1298c749f87d29e1a363ddf9027c3a51753c612d510Romain Guy GLenum type, const GLvoid * data); 1308c749f87d29e1a363ddf9027c3a51753c612d510Romain Guy 131fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy void init(); 132fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy 1336c81893c626499e58c8eeb20d6c35ec4e1ce808bRomain Guy GenerationCache<SkBitmap*, Texture*> mCache; 134121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy 1357d139ba2c331f11e9b485753cc727a0ff202f2a4Romain Guy uint32_t mSize; 1367d139ba2c331f11e9b485753cc727a0ff202f2a4Romain Guy uint32_t mMaxSize; 137163935113919a184122b8b3bd672ef08c8df65dcRomain Guy GLint mMaxTextureSize; 1389aaa8269a3e7291aab84d01c3fc9c744d8f2d2f4Romain Guy 139eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy float mFlushRate; 140eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy 141e190aa69756aecfaffabdd4c6d32cb6b3220d842Romain Guy bool mDebugEnabled; 142e190aa69756aecfaffabdd4c6d32cb6b3220d842Romain Guy 143fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy Vector<SkBitmap*> mGarbage; 1449aaa8269a3e7291aab84d01c3fc9c744d8f2d2f4Romain Guy mutable Mutex mLock; 145ce0537b80087a6225273040a987414b1dd081aa0Romain Guy}; // class TextureCache 146ce0537b80087a6225273040a987414b1dd081aa0Romain Guy 147ce0537b80087a6225273040a987414b1dd081aa0Romain Guy}; // namespace uirenderer 148ce0537b80087a6225273040a987414b1dd081aa0Romain Guy}; // namespace android 149ce0537b80087a6225273040a987414b1dd081aa0Romain Guy 1505b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_TEXTURE_CACHE_H 151