1fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy/* 2fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy * Copyright (C) 2010 The Android Open Source Project 3fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy * 4fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy * Licensed under the Apache License, Version 2.0 (the "License"); 5fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy * you may not use this file except in compliance with the License. 6fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy * You may obtain a copy of the License at 7fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy * 8fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy * http://www.apache.org/licenses/LICENSE-2.0 9fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy * 10fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy * Unless required by applicable law or agreed to in writing, software 11fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy * distributed under the License is distributed on an "AS IS" BASIS, 12fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy * See the License for the specific language governing permissions and 14fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy * limitations under the License. 15fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy */ 16fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy 175b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#ifndef ANDROID_HWUI_CACHES_H 185b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#define ANDROID_HWUI_CACHES_H 19fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy 2096a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "AssetAtlas.h" 2196a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "Dither.h" 2296a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "Extensions.h" 2396a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "FboCache.h" 24c08820f587ad94698691a6657e87712de07e484cChris Craik#include "GammaFontRenderer.h" 2596a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "GradientCache.h" 2696a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "LayerCache.h" 2796a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "PatchCache.h" 2896a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "ProgramCache.h" 2996a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "PathCache.h" 3096a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "RenderBufferCache.h" 3196a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "renderstate/PixelBufferState.h" 3244eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik#include "renderstate/TextureState.h" 3396a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "ResourceCache.h" 3496a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "TessellationCache.h" 3596a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "TextDropShadowCache.h" 3696a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "TextureCache.h" 3796a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "thread/TaskProcessor.h" 3896a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "thread/TaskManager.h" 3996a5c4c7bab6718524de7253da8309143ab48befChris Craik 4059744b79ec302000802cd56d30a1bf70f0183c80Chris Craik#include <vector> 4196a5c4c7bab6718524de7253da8309143ab48befChris Craik#include <memory> 4259744b79ec302000802cd56d30a1bf70f0183c80Chris Craik 433b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy#include <GLES3/gl3.h> 443b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy 453b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy#include <utils/KeyedVector.h> 46fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy 477953745dd565167113f8cbfc461bc0521d32d870Romain Guy#include <cutils/compiler.h> 487953745dd565167113f8cbfc461bc0521d32d870Romain Guy 492dc236b2bae13b9a0ed9b3f7320502aecd7983b3Tom Hudson#include <SkPath.h> 502dc236b2bae13b9a0ed9b3f7320502aecd7983b3Tom Hudson 51272a685f17cc4828257e521a6f62b7b17870f75eJohn Reck#include <vector> 52272a685f17cc4828257e521a6f62b7b17870f75eJohn Reck 53fb8b763f762ae21923c58d64caa729b012f40e05Romain Guynamespace android { 54fb8b763f762ae21923c58d64caa729b012f40e05Romain Guynamespace uirenderer { 55fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy 5603750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy/////////////////////////////////////////////////////////////////////////////// 5703750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy// Caches 5803750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy/////////////////////////////////////////////////////////////////////////////// 5903750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy 60e18264b079481a244b30e3f71012c53bbd861f92John Reckclass RenderNode; 6117035b0211a3c9d45ea46a99217a6acbe76e8fbeJohn Reckclass RenderState; 62bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy 6396a5c4c7bab6718524de7253da8309143ab48befChris Craikclass ANDROID_API Caches { 6496a5c4c7bab6718524de7253da8309143ab48befChris Craikpublic: 6596a5c4c7bab6718524de7253da8309143ab48befChris Craik static Caches& createInstance(RenderState& renderState) { 6696a5c4c7bab6718524de7253da8309143ab48befChris Craik LOG_ALWAYS_FATAL_IF(sInstance, "double create of Caches attempted"); 6796a5c4c7bab6718524de7253da8309143ab48befChris Craik sInstance = new Caches(renderState); 6896a5c4c7bab6718524de7253da8309143ab48befChris Craik return *sInstance; 6996a5c4c7bab6718524de7253da8309143ab48befChris Craik } 70fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy 7196a5c4c7bab6718524de7253da8309143ab48befChris Craik static Caches& getInstance() { 7296a5c4c7bab6718524de7253da8309143ab48befChris Craik LOG_ALWAYS_FATAL_IF(!sInstance, "instance not yet created"); 7396a5c4c7bab6718524de7253da8309143ab48befChris Craik return *sInstance; 7496a5c4c7bab6718524de7253da8309143ab48befChris Craik } 75fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy 7696a5c4c7bab6718524de7253da8309143ab48befChris Craik static bool hasInstance() { 772507c34d91bb0d722b6012e85cb47387b2aa6873Chris Craik return sInstance != nullptr; 7896a5c4c7bab6718524de7253da8309143ab48befChris Craik } 7996a5c4c7bab6718524de7253da8309143ab48befChris Craikprivate: 8096a5c4c7bab6718524de7253da8309143ab48befChris Craik Caches(RenderState& renderState); 8196a5c4c7bab6718524de7253da8309143ab48befChris Craik static Caches* sInstance; 829bca4793a33d2714b306d69ceb870925a588fe71Romain Guy 83fb8b763f762ae21923c58d64caa729b012f40e05Romain Guypublic: 84b9ce116dac378b4cf4490f265dcbd5704a1dd43cChris Craik enum class FlushMode { 85b9ce116dac378b4cf4490f265dcbd5704a1dd43cChris Craik Layers = 0, 86b9ce116dac378b4cf4490f265dcbd5704a1dd43cChris Craik Moderate, 87b9ce116dac378b4cf4490f265dcbd5704a1dd43cChris Craik Full 88bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy }; 89bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy 90bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy /** 91dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy * Initialize caches. 928ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy */ 933b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy bool init(); 948ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy 95db009173f800bb0d626c42786b5bd0f57cc6545aJohn Reck bool isInitialized() { return mInitialized; } 96db009173f800bb0d626c42786b5bd0f57cc6545aJohn Reck 978ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy /** 98bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy * Flush the cache. 99bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy * 100bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy * @param mode Indicates how much of the cache should be flushed 101bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy */ 102bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy void flush(FlushMode mode); 103bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy 1045b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy /** 1058ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy * Destroys all resources associated with this cache. This should 106b9ce116dac378b4cf4490f265dcbd5704a1dd43cChris Craik * be called after a flush(FlushMode::Full). 1078ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy */ 1088ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy void terminate(); 1098ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy 1108ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy /** 111627c6fd91377ead85f74a365438e25610ef1e2eeRomain Guy * Returns a non-premultiplied ARGB color for the specified 112627c6fd91377ead85f74a365438e25610ef1e2eeRomain Guy * amount of overdraw (1 for 1x, 2 for 2x, etc.) 113627c6fd91377ead85f74a365438e25610ef1e2eeRomain Guy */ 114627c6fd91377ead85f74a365438e25610ef1e2eeRomain Guy uint32_t getOverdrawColor(uint32_t amount) const; 115627c6fd91377ead85f74a365438e25610ef1e2eeRomain Guy 116627c6fd91377ead85f74a365438e25610ef1e2eeRomain Guy /** 117fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy * Call this on each frame to ensure that garbage is deleted from 118fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy * GPU memory. 119fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy */ 120fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy void clearGarbage(); 121fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy 122fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy /** 123ada830f639591b99c3e40de22b07296c7932a33fRomain Guy * Can be used to delete a layer from a non EGL thread. 12457066eb64c9a190d1afc87bb060bbb2d31e5b86cRomain Guy */ 125ada830f639591b99c3e40de22b07296c7932a33fRomain Guy void deleteLayerDeferred(Layer* layer); 12657066eb64c9a190d1afc87bb060bbb2d31e5b86cRomain Guy 12782bc7a772747fcf8a6fe7097f70bf2981429ffe9Romain Guy /** 1285b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy * Returns the mesh used to draw regions. Calling this method will 1295b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy * bind a VBO of type GL_ELEMENT_ARRAY_BUFFER that contains the 1305b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy * indices for the region mesh. 1315b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy */ 1325b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy TextureVertex* getRegionMesh(); 1335b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy 134c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy /** 135c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy * Displays the memory usage of each cache and the total sum. 136c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy */ 137c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy void dumpMemoryUsage(); 1389c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase void dumpMemoryUsage(String8& log); 139c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy 140746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy // Misc 141746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy GLint maxTextureSize; 1423ff0bfdd144bba3b023eda8c49b25fb0d0de8653Romain Guy 143117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craikprivate: 144117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik // Declared before gradientCache and programCache which need this to initialize. 145117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik // TODO: cleanup / move elsewhere 146117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik Extensions mExtensions; 147117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craikpublic: 148fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy TextureCache textureCache; 149fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy LayerCache layerCache; 1508d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy RenderBufferCache renderBufferCache; 151fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy GradientCache gradientCache; 152fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy PatchCache patchCache; 153117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik PathCache pathCache; 154117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik ProgramCache programCache; 15505f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik TessellationCache tessellationCache; 156fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy TextDropShadowCache dropShadowCache; 157e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy FboCache fboCache; 15829d8997bd43b7c4ad37fc3d6f91eaafa74913c88Romain Guy 159c08820f587ad94698691a6657e87712de07e484cChris Craik GammaFontRenderer fontRenderer; 160b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy 1615dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy TaskManager tasks; 1625dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy 1630baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy Dither dither; 1640baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy 165f9f0016b1ff816eb2c7561eed482c056189005f8Romain Guy bool gpuPixelBuffersEnabled; 166f9f0016b1ff816eb2c7561eed482c056189005f8Romain Guy 167dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy // Debug methods 16813631f3da855f200a151e7837ed9f6b079622b58Romain Guy PFNGLINSERTEVENTMARKEREXTPROC eventMark; 16913631f3da855f200a151e7837ed9f6b079622b58Romain Guy PFNGLPUSHGROUPMARKEREXTPROC startMark; 17013631f3da855f200a151e7837ed9f6b079622b58Romain Guy PFNGLPOPGROUPMARKEREXTPROC endMark; 17113631f3da855f200a151e7837ed9f6b079622b58Romain Guy 1726c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik void setProgram(const ProgramDescription& description); 1736c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik void setProgram(Program* program); 1746c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik 175117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik Extensions& extensions() { return mExtensions; } 1766c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik Program& program() { return *mProgram; } 17744eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik PixelBufferState& pixelBufferState() { return *mPixelBufferState; } 17844eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik TextureState& textureState() { return *mTextureState; } 17996a5c4c7bab6718524de7253da8309143ab48befChris Craik 180e190aa69756aecfaffabdd4c6d32cb6b3220d842Romain Guyprivate: 181dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy void initExtensions(); 182dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy void initConstraints(); 183f9f0016b1ff816eb2c7561eed482c056189005f8Romain Guy void initStaticProperties(); 184dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy 18564bb413a664001c95c8439cf097dc3033f4ed733Andreas Gampe static void eventMarkNull(GLsizei length, const GLchar* marker) { } 18664bb413a664001c95c8439cf097dc3033f4ed733Andreas Gampe static void startMarkNull(GLsizei length, const GLchar* marker) { } 18713631f3da855f200a151e7837ed9f6b079622b58Romain Guy static void endMarkNull() { } 18813631f3da855f200a151e7837ed9f6b079622b58Romain Guy 18996a5c4c7bab6718524de7253da8309143ab48befChris Craik RenderState* mRenderState; 1903bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy 191f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy // Used to render layers 19251d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik std::unique_ptr<TextureVertex[]> mRegionMesh; 1933b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy 194f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy mutable Mutex mGarbageLock; 195272a685f17cc4828257e521a6f62b7b17870f75eJohn Reck std::vector<Layer*> mLayerGarbage; 196f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 1978ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy bool mInitialized; 19854c1a64d5441a964890b44280e4457e11f4f924aRomain Guy 1996c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik // TODO: move below to RenderState 2006c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik PixelBufferState* mPixelBufferState = nullptr; 2016c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik TextureState* mTextureState = nullptr; 2026c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik Program* mProgram = nullptr; // note: object owned by ProgramCache 2036c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik 204fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy}; // class Caches 205fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy 206fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy}; // namespace uirenderer 207fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy}; // namespace android 208fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy 2095b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_CACHES_H 210