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 175e00c7ce063116c11315639f0035aca8ad73e8ccChris Craik#pragma once 18fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy 19642ebea6e14b72c512ef1168dc6edb061035ddedJohn Reck#include "DeviceInfo.h" 2096a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "Extensions.h" 2196a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "FboCache.h" 22c08820f587ad94698691a6657e87712de07e484cChris Craik#include "GammaFontRenderer.h" 2396a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "GradientCache.h" 2496a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "PatchCache.h" 2596a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "ProgramCache.h" 2696a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "PathCache.h" 2796a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "RenderBufferCache.h" 2896a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "renderstate/PixelBufferState.h" 2944eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik#include "renderstate/TextureState.h" 3096a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "ResourceCache.h" 3196a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "TessellationCache.h" 3296a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "TextDropShadowCache.h" 3396a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "TextureCache.h" 3496a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "thread/TaskProcessor.h" 3596a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "thread/TaskManager.h" 3696a5c4c7bab6718524de7253da8309143ab48befChris Craik 3759744b79ec302000802cd56d30a1bf70f0183c80Chris Craik#include <vector> 3896a5c4c7bab6718524de7253da8309143ab48befChris Craik#include <memory> 3959744b79ec302000802cd56d30a1bf70f0183c80Chris Craik 403b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy#include <GLES3/gl3.h> 413b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy 423b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy#include <utils/KeyedVector.h> 43fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy 447953745dd565167113f8cbfc461bc0521d32d870Romain Guy#include <cutils/compiler.h> 457953745dd565167113f8cbfc461bc0521d32d870Romain Guy 462dc236b2bae13b9a0ed9b3f7320502aecd7983b3Tom Hudson#include <SkPath.h> 472dc236b2bae13b9a0ed9b3f7320502aecd7983b3Tom Hudson 48272a685f17cc4828257e521a6f62b7b17870f75eJohn Reck#include <vector> 49272a685f17cc4828257e521a6f62b7b17870f75eJohn Reck 50fb8b763f762ae21923c58d64caa729b012f40e05Romain Guynamespace android { 51fb8b763f762ae21923c58d64caa729b012f40e05Romain Guynamespace uirenderer { 52fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy 5303750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy/////////////////////////////////////////////////////////////////////////////// 5403750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy// Caches 5503750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy/////////////////////////////////////////////////////////////////////////////// 5603750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy 57e18264b079481a244b30e3f71012c53bbd861f92John Reckclass RenderNode; 5817035b0211a3c9d45ea46a99217a6acbe76e8fbeJohn Reckclass RenderState; 59bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy 6096a5c4c7bab6718524de7253da8309143ab48befChris Craikclass ANDROID_API Caches { 6196a5c4c7bab6718524de7253da8309143ab48befChris Craikpublic: 6296a5c4c7bab6718524de7253da8309143ab48befChris Craik static Caches& createInstance(RenderState& renderState) { 6396a5c4c7bab6718524de7253da8309143ab48befChris Craik LOG_ALWAYS_FATAL_IF(sInstance, "double create of Caches attempted"); 6496a5c4c7bab6718524de7253da8309143ab48befChris Craik sInstance = new Caches(renderState); 6596a5c4c7bab6718524de7253da8309143ab48befChris Craik return *sInstance; 6696a5c4c7bab6718524de7253da8309143ab48befChris Craik } 67fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy 6896a5c4c7bab6718524de7253da8309143ab48befChris Craik static Caches& getInstance() { 6996a5c4c7bab6718524de7253da8309143ab48befChris Craik LOG_ALWAYS_FATAL_IF(!sInstance, "instance not yet created"); 7096a5c4c7bab6718524de7253da8309143ab48befChris Craik return *sInstance; 7196a5c4c7bab6718524de7253da8309143ab48befChris Craik } 72fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy 7396a5c4c7bab6718524de7253da8309143ab48befChris Craik static bool hasInstance() { 742507c34d91bb0d722b6012e85cb47387b2aa6873Chris Craik return sInstance != nullptr; 7596a5c4c7bab6718524de7253da8309143ab48befChris Craik } 7696a5c4c7bab6718524de7253da8309143ab48befChris Craikprivate: 77faecb78a6b11c780db47bc940ca7662899ab5d5eChih-Hung Hsieh explicit Caches(RenderState& renderState); 7896a5c4c7bab6718524de7253da8309143ab48befChris Craik static Caches* sInstance; 799bca4793a33d2714b306d69ceb870925a588fe71Romain Guy 80fb8b763f762ae21923c58d64caa729b012f40e05Romain Guypublic: 81b9ce116dac378b4cf4490f265dcbd5704a1dd43cChris Craik enum class FlushMode { 82b9ce116dac378b4cf4490f265dcbd5704a1dd43cChris Craik Layers = 0, 83b9ce116dac378b4cf4490f265dcbd5704a1dd43cChris Craik Moderate, 84b9ce116dac378b4cf4490f265dcbd5704a1dd43cChris Craik Full 85bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy }; 86bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy 87bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy /** 88dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy * Initialize caches. 898ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy */ 903b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy bool init(); 918ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy 92db009173f800bb0d626c42786b5bd0f57cc6545aJohn Reck bool isInitialized() { return mInitialized; } 93db009173f800bb0d626c42786b5bd0f57cc6545aJohn Reck 948ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy /** 95bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy * Flush the cache. 96bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy * 97bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy * @param mode Indicates how much of the cache should be flushed 98bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy */ 99bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy void flush(FlushMode mode); 100bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy 1015b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy /** 1028ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy * Destroys all resources associated with this cache. This should 103b9ce116dac378b4cf4490f265dcbd5704a1dd43cChris Craik * be called after a flush(FlushMode::Full). 1048ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy */ 1058ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy void terminate(); 1068ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy 1078ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy /** 108627c6fd91377ead85f74a365438e25610ef1e2eeRomain Guy * Returns a non-premultiplied ARGB color for the specified 109627c6fd91377ead85f74a365438e25610ef1e2eeRomain Guy * amount of overdraw (1 for 1x, 2 for 2x, etc.) 110627c6fd91377ead85f74a365438e25610ef1e2eeRomain Guy */ 111627c6fd91377ead85f74a365438e25610ef1e2eeRomain Guy uint32_t getOverdrawColor(uint32_t amount) const; 112627c6fd91377ead85f74a365438e25610ef1e2eeRomain Guy 113627c6fd91377ead85f74a365438e25610ef1e2eeRomain Guy /** 114fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy * Call this on each frame to ensure that garbage is deleted from 115fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy * GPU memory. 116fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy */ 117fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy void clearGarbage(); 118fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy 119fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy /** 120ada830f639591b99c3e40de22b07296c7932a33fRomain Guy * Can be used to delete a layer from a non EGL thread. 12157066eb64c9a190d1afc87bb060bbb2d31e5b86cRomain Guy */ 122ada830f639591b99c3e40de22b07296c7932a33fRomain Guy void deleteLayerDeferred(Layer* layer); 12357066eb64c9a190d1afc87bb060bbb2d31e5b86cRomain Guy 12482bc7a772747fcf8a6fe7097f70bf2981429ffe9Romain Guy /** 1255b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy * Returns the mesh used to draw regions. Calling this method will 1265b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy * bind a VBO of type GL_ELEMENT_ARRAY_BUFFER that contains the 1275b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy * indices for the region mesh. 1285b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy */ 1295b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy TextureVertex* getRegionMesh(); 1305b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy 131c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy /** 132253f2c213f6ecda63b6872aee77bd30d5ec07c82Romain Guy * Returns the GL RGBA internal format to use for the current device 133253f2c213f6ecda63b6872aee77bd30d5ec07c82Romain Guy * If the device supports linear blending and needSRGB is true, 134253f2c213f6ecda63b6872aee77bd30d5ec07c82Romain Guy * this function returns GL_SRGB8_ALPHA8, otherwise it returns GL_RGBA 135253f2c213f6ecda63b6872aee77bd30d5ec07c82Romain Guy */ 136253f2c213f6ecda63b6872aee77bd30d5ec07c82Romain Guy constexpr GLint rgbaInternalFormat(bool needSRGB = true) const { 137efb4b06493fe7b1604c762a448b13c7af2845a8dRomain Guy return extensions().hasLinearBlending() && needSRGB ? GL_SRGB8_ALPHA8 : GL_RGBA; 138253f2c213f6ecda63b6872aee77bd30d5ec07c82Romain Guy } 139253f2c213f6ecda63b6872aee77bd30d5ec07c82Romain Guy 140253f2c213f6ecda63b6872aee77bd30d5ec07c82Romain Guy /** 141c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy * Displays the memory usage of each cache and the total sum. 142c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy */ 143c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy void dumpMemoryUsage(); 1449c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase void dumpMemoryUsage(String8& log); 145c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy 146746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy // Misc 147746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy GLint maxTextureSize; 1483ff0bfdd144bba3b023eda8c49b25fb0d0de8653Romain Guy 149117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craikpublic: 150fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy TextureCache textureCache; 1518d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy RenderBufferCache renderBufferCache; 152fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy GradientCache gradientCache; 153fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy PatchCache patchCache; 154117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik PathCache pathCache; 155117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik ProgramCache programCache; 15605f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik TessellationCache tessellationCache; 157fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy TextDropShadowCache dropShadowCache; 158e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy FboCache fboCache; 15929d8997bd43b7c4ad37fc3d6f91eaafa74913c88Romain Guy 160c08820f587ad94698691a6657e87712de07e484cChris Craik GammaFontRenderer fontRenderer; 161b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy 1625dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy TaskManager tasks; 1635dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy 164f9f0016b1ff816eb2c7561eed482c056189005f8Romain Guy bool gpuPixelBuffersEnabled; 165f9f0016b1ff816eb2c7561eed482c056189005f8Romain Guy 166dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy // Debug methods 16713631f3da855f200a151e7837ed9f6b079622b58Romain Guy PFNGLINSERTEVENTMARKEREXTPROC eventMark; 16813631f3da855f200a151e7837ed9f6b079622b58Romain Guy PFNGLPUSHGROUPMARKEREXTPROC startMark; 16913631f3da855f200a151e7837ed9f6b079622b58Romain Guy PFNGLPOPGROUPMARKEREXTPROC endMark; 17013631f3da855f200a151e7837ed9f6b079622b58Romain Guy 1716c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik void setProgram(const ProgramDescription& description); 1726c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik void setProgram(Program* program); 1736c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik 174642ebea6e14b72c512ef1168dc6edb061035ddedJohn Reck const Extensions& extensions() const { return DeviceInfo::get()->extensions(); } 1756c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik Program& program() { return *mProgram; } 17644eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik PixelBufferState& pixelBufferState() { return *mPixelBufferState; } 17744eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik TextureState& textureState() { return *mTextureState; } 17896a5c4c7bab6718524de7253da8309143ab48befChris Craik 179e190aa69756aecfaffabdd4c6d32cb6b3220d842Romain Guyprivate: 180dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy void initExtensions(); 181dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy void initConstraints(); 182f9f0016b1ff816eb2c7561eed482c056189005f8Romain Guy void initStaticProperties(); 183dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy 18464bb413a664001c95c8439cf097dc3033f4ed733Andreas Gampe static void eventMarkNull(GLsizei length, const GLchar* marker) { } 18564bb413a664001c95c8439cf097dc3033f4ed733Andreas Gampe static void startMarkNull(GLsizei length, const GLchar* marker) { } 18613631f3da855f200a151e7837ed9f6b079622b58Romain Guy static void endMarkNull() { } 18713631f3da855f200a151e7837ed9f6b079622b58Romain Guy 18896a5c4c7bab6718524de7253da8309143ab48befChris Craik RenderState* mRenderState; 1893bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy 190f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy // Used to render layers 19151d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik std::unique_ptr<TextureVertex[]> mRegionMesh; 1923b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy 193f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy mutable Mutex mGarbageLock; 194272a685f17cc4828257e521a6f62b7b17870f75eJohn Reck std::vector<Layer*> mLayerGarbage; 195f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 1968ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy bool mInitialized; 19754c1a64d5441a964890b44280e4457e11f4f924aRomain Guy 1986c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik // TODO: move below to RenderState 1996c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik PixelBufferState* mPixelBufferState = nullptr; 2006c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik TextureState* mTextureState = nullptr; 2016c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik Program* mProgram = nullptr; // note: object owned by ProgramCache 2026c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik 203fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy}; // class Caches 204fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy 205fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy}; // namespace uirenderer 206fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy}; // namespace android 207