Layer.h revision 02b49b70ede0b9eb760ff334823aee1d9520ed85
1dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase/* 2dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase * Copyright (C) 2010 The Android Open Source Project 3dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase * 4dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase * Licensed under the Apache License, Version 2.0 (the "License"); 5dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase * you may not use this file except in compliance with the License. 6dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase * You may obtain a copy of the License at 7dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase * 8dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase * http://www.apache.org/licenses/LICENSE-2.0 9dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase * 10dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase * Unless required by applicable law or agreed to in writing, software 11dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase * distributed under the License is distributed on an "AS IS" BASIS, 12dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase * See the License for the specific language governing permissions and 14dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase * limitations under the License. 15dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase */ 16dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase 17dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase#ifndef ANDROID_HWUI_LAYER_H 18dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase#define ANDROID_HWUI_LAYER_H 19c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy 209c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase#include <sys/types.h> 21c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy 22dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase#include <GLES2/gl2.h> 23bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy 24e190aa69756aecfaffabdd4c6d32cb6b3220d842Romain Guy#include <ui/Region.h> 2509b7c91de73b59aa3f679b3ae3ba299f82ec9f8aRomain Guy 26dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase#include <SkPaint.h> 27dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase#include <SkXfermode.h> 28dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase 29dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase#include "Rect.h" 30dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase#include "RenderBuffer.h" 31dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase#include "SkiaColorFilter.h" 32dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase#include "Texture.h" 33dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase#include "Vertex.h" 34dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase 35dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haasenamespace android { 36dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haasenamespace uirenderer { 37bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy 38bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy/////////////////////////////////////////////////////////////////////////////// 39bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy// Layers 40bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy/////////////////////////////////////////////////////////////////////////////// 415baa3a62a97544669fba6d65a11c07f252e654ddSteve Block 42bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy// Forward declarations 43bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guyclass OpenGLRenderer; 44bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guyclass DisplayList; 45bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guyclass DeferredDisplayList; 46bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guyclass DeferStateStruct; 47dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase 48dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase/** 49dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase * A layer has dimensions and is backed by an OpenGL texture or FBO. 503bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy */ 518ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guystruct Layer { 52b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy Layer(const uint32_t layerWidth, const uint32_t layerHeight); 53dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy ~Layer(); 544ff0cf4b83605bff630c4e6f1fabe4f72a3f93a1Romain Guy 550f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy static uint32_t computeIdealWidth(uint32_t layerWidth); 56e190aa69756aecfaffabdd4c6d32cb6b3220d842Romain Guy static uint32_t computeIdealHeight(uint32_t layerHeight); 57e190aa69756aecfaffabdd4c6d32cb6b3220d842Romain Guy 585baa3a62a97544669fba6d65a11c07f252e654ddSteve Block /** 59dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase * Calling this method will remove (either by recycling or 60dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase * destroying) the associated FBO, if present, and any render 618ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy * buffer (stencil for instance.) 628ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy */ 638ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy void removeFbo(bool flush = true); 648ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy 658ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy /** 668ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy * Sets this layer's region to a rectangle. Computes the appropriate 678ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy * texture coordinates. 688ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy */ 6915bc6437f8b4cf10dba55c7638d349e7b9563f4fRomain Guy void setRegionAsRect() { 70f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy const android::Rect& bounds = region.getBounds(); 71cb4d6009576cf08195dc23f341a3f4939c0878bbChris Craik regionRect.set(bounds.leftTop().x, bounds.leftTop().y, 72f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy bounds.rightBottom().x, bounds.rightBottom().y); 73f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 7415bc6437f8b4cf10dba55c7638d349e7b9563f4fRomain Guy const float texX = 1.0f / float(texture.width); 7515bc6437f8b4cf10dba55c7638d349e7b9563f4fRomain Guy const float texY = 1.0f / float(texture.height); 76b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy const float height = layer.getHeight(); 77586cae3ac69c0c667fbf8a954edbd399f620a717Romain Guy texCoords.set( 788f85e80b64b89fd38cc23b129f61ec36ddde7f15Romain Guy regionRect.left * texX, (height - regionRect.top) * texY, 798f85e80b64b89fd38cc23b129f61ec36ddde7f15Romain Guy regionRect.right * texX, (height - regionRect.bottom) * texY); 80a1d3c91afbd52c7e8b01f4a9060c5459f02ae7a5Romain Guy 81a1d3c91afbd52c7e8b01f4a9060c5459f02ae7a5Romain Guy regionRect.translate(layer.left, layer.top); 82a1d3c91afbd52c7e8b01f4a9060c5459f02ae7a5Romain Guy } 838ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy 848ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy void updateDeferred(OpenGLRenderer* renderer, DisplayList* displayList, 858ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy int left, int top, int right, int bottom) { 868ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy this->renderer = renderer; 878ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy this->displayList = displayList; 888ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy const Rect r(left, top, right, bottom); 898ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy dirtyRect.unionWith(r); 9054c1a64d5441a964890b44280e4457e11f4f924aRomain Guy deferredUpdateScheduled = true; 9154c1a64d5441a964890b44280e4457e11f4f924aRomain Guy } 92c2a972131f1870042eb63847d4b24fbe718d8e3fRomain Guy 93c2a972131f1870042eb63847d4b24fbe718d8e3fRomain Guy inline uint32_t getWidth() const { 943ff0bfdd144bba3b023eda8c49b25fb0d0de8653Romain Guy return texture.width; 95c2a972131f1870042eb63847d4b24fbe718d8e3fRomain Guy } 968ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy 978ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy inline uint32_t getHeight() const { 988ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy return texture.height; 99b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy } 100b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy 101b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy /** 102b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy * Resize the layer and its texture if needed. 103dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy * 1043bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy * @param width The new width of the layer 105dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy * @param height The new height of the layer 1060f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy * 107ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik * @return True if the layer was resized or nothing happened, false if 108ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik * a failure occurred during the resizing operation 109dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy */ 110dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy bool resize(const uint32_t width, const uint32_t height); 111dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy 112dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy void setSize(uint32_t width, uint32_t height) { 113dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy texture.width = width; 114dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy texture.height = height; 1150f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy } 116dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy 117dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy ANDROID_API void setPaint(SkPaint* paint); 118dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy 119dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy inline void setBlend(bool blend) { 120dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy texture.blend = blend; 121dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy } 122dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy 123dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy inline bool isBlend() const { 124dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy return texture.blend; 125dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy } 126dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy 127dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy inline void setAlpha(int alpha) { 128dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy this->alpha = alpha; 129dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy } 130dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy 131dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy inline void setAlpha(int alpha, SkXfermode::Mode mode) { 132dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy this->alpha = alpha; 133dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy this->mode = mode; 1345bb3c730f5ebd2a0db1b02a8981c6fdbea6c1a2eRomain Guy } 1355bb3c730f5ebd2a0db1b02a8981c6fdbea6c1a2eRomain Guy 1365bb3c730f5ebd2a0db1b02a8981c6fdbea6c1a2eRomain Guy inline int getAlpha() const { 1373ff0bfdd144bba3b023eda8c49b25fb0d0de8653Romain Guy return alpha; 1385bb3c730f5ebd2a0db1b02a8981c6fdbea6c1a2eRomain Guy } 1394ff0cf4b83605bff630c4e6f1fabe4f72a3f93a1Romain Guy 1404ff0cf4b83605bff630c4e6f1fabe4f72a3f93a1Romain Guy inline SkXfermode::Mode getMode() const { 1414ff0cf4b83605bff630c4e6f1fabe4f72a3f93a1Romain Guy return mode; 1424ff0cf4b83605bff630c4e6f1fabe4f72a3f93a1Romain Guy } 1434ff0cf4b83605bff630c4e6f1fabe4f72a3f93a1Romain Guy 1444ff0cf4b83605bff630c4e6f1fabe4f72a3f93a1Romain Guy inline void setEmpty(bool empty) { 1454ff0cf4b83605bff630c4e6f1fabe4f72a3f93a1Romain Guy this->empty = empty; 1467c450aaa3caac2a05fcb20a177483d0e92378426Romain Guy } 1477c450aaa3caac2a05fcb20a177483d0e92378426Romain Guy 1487c450aaa3caac2a05fcb20a177483d0e92378426Romain Guy inline bool isEmpty() const { 1497c450aaa3caac2a05fcb20a177483d0e92378426Romain Guy return empty; 1507c450aaa3caac2a05fcb20a177483d0e92378426Romain Guy } 1517c450aaa3caac2a05fcb20a177483d0e92378426Romain Guy 1527c450aaa3caac2a05fcb20a177483d0e92378426Romain Guy inline void setFbo(GLuint fbo) { 1535bb3c730f5ebd2a0db1b02a8981c6fdbea6c1a2eRomain Guy this->fbo = fbo; 1543ff0bfdd144bba3b023eda8c49b25fb0d0de8653Romain Guy } 1553ff0bfdd144bba3b023eda8c49b25fb0d0de8653Romain Guy 1563ff0bfdd144bba3b023eda8c49b25fb0d0de8653Romain Guy inline GLuint getFbo() const { 1573ff0bfdd144bba3b023eda8c49b25fb0d0de8653Romain Guy return fbo; 1583ff0bfdd144bba3b023eda8c49b25fb0d0de8653Romain Guy } 1593ff0bfdd144bba3b023eda8c49b25fb0d0de8653Romain Guy 1603ff0bfdd144bba3b023eda8c49b25fb0d0de8653Romain Guy inline void setStencilRenderBuffer(RenderBuffer* renderBuffer) { 1613ff0bfdd144bba3b023eda8c49b25fb0d0de8653Romain Guy if (RenderBuffer::isStencilBuffer(renderBuffer->getFormat())) { 1623ff0bfdd144bba3b023eda8c49b25fb0d0de8653Romain Guy this->stencil = renderBuffer; 1633ff0bfdd144bba3b023eda8c49b25fb0d0de8653Romain Guy glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, 1643ff0bfdd144bba3b023eda8c49b25fb0d0de8653Romain Guy GL_RENDERBUFFER, stencil->getName()); 1653ff0bfdd144bba3b023eda8c49b25fb0d0de8653Romain Guy } else { 1663ff0bfdd144bba3b023eda8c49b25fb0d0de8653Romain Guy ALOGE("The specified render buffer is not a stencil buffer"); 1673ff0bfdd144bba3b023eda8c49b25fb0d0de8653Romain Guy } 1680f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy } 1690f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy 1700f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy inline RenderBuffer* getStencilRenderBuffer() const { 1710f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy return stencil; 1720f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy } 1730f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy 1740f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy inline GLuint getTexture() const { 1750f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy return texture.id; 1760f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy } 1770f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy 1780f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy inline GLenum getRenderTarget() const { 1790f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy return renderTarget; 1800f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy } 1810f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy 1825bb3c730f5ebd2a0db1b02a8981c6fdbea6c1a2eRomain Guy inline void setRenderTarget(GLenum renderTarget) { 1833ff0bfdd144bba3b023eda8c49b25fb0d0de8653Romain Guy this->renderTarget = renderTarget; 1843ff0bfdd144bba3b023eda8c49b25fb0d0de8653Romain Guy } 1854ff0cf4b83605bff630c4e6f1fabe4f72a3f93a1Romain Guy 1864ff0cf4b83605bff630c4e6f1fabe4f72a3f93a1Romain Guy void setWrap(GLenum wrap, bool bindTexture = false, bool force = false) { 1878ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy texture.setWrap(wrap, bindTexture, force, renderTarget); 1888ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy } 1898ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy 1908ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy void setFilter(GLenum filter, bool bindTexture = false, bool force = false) { 1918ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy texture.setFilter(filter, bindTexture, force, renderTarget); 1928ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy } 1938ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy 1945b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy inline bool isCacheable() const { 1958ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy return cacheable; 1968ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy } 1978ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy 1988ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy inline void setCacheable(bool cacheable) { 1998ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy this->cacheable = cacheable; 2008ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy } 2018ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy 2028ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy inline bool isDirty() const { 2035b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy return dirty; 2045b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy } 2055b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy 206c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy inline void setDirty(bool dirty) { 207c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy this->dirty = dirty; 208c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy } 209c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy 2109c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase inline bool isTextureLayer() const { 2119c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase return textureLayer; 2125baa3a62a97544669fba6d65a11c07f252e654ddSteve Block } 2139c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase 2149c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase inline void setTextureLayer(bool textureLayer) { 2159c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase this->textureLayer = textureLayer; 2169c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase } 2179c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase 2189c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase inline SkiaColorFilter* getColorFilter() const { 2199c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase return colorFilter; 2209c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase } 2218d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy 2228d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy ANDROID_API void setColorFilter(SkiaColorFilter* filter); 2239c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase 2249c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase inline void bindTexture() const { 2259c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase if (texture.id) { 2269c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase glBindTexture(renderTarget, texture.id); 2279c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase } 22801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy } 2299c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase 2302fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy inline void bindStencilRenderBuffer() const { 2319c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase if (stencil) { 23201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy stencil->bind(); 2339c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase } 2342fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy } 2359c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase 2362fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy inline void generateTexture() { 2379c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase if (!texture.id) { 238c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy glGenTextures(1, &texture.id); 239b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy } 240b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy } 2419c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase 242c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy inline void deleteTexture() { 243d2ba50ab861ec0950bda18dd0f463b687e66249fRomain Guy if (texture.id) { 2449c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase glDeleteTextures(1, &texture.id); 2459c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase texture.id = 0; 2469c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase } 2479c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase } 248c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy 249c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy /** 250c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy * When the caller frees the texture itself, the caller 251c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy * must call this method to tell this layer that it lost 2528d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy * the texture. 253c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy */ 254c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy void clearTexture() { 255c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy texture.id = 0; 2562fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy } 2572fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy 2582fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy inline void allocateTexture(GLenum format, GLenum storage) { 2592fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy#if DEBUG_LAYERS 2602fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy ALOGD(" Allocate layer: %dx%d", getWidth(), getHeight()); 261b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy#endif 262b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy if (texture.id) { 263c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy glTexImage2D(renderTarget, 0, format, getWidth(), getHeight(), 0, 264c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy format, storage, NULL); 2659c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase } 2669c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase } 267c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy 268c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy inline mat4& getTexTransform() { 269c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy return texTransform; 270fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy } 271fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy 272fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy inline mat4& getTransform() { 273fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy return transform; 274fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy } 275fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy 27657066eb64c9a190d1afc87bb060bbb2d31e5b86cRomain Guy void defer(); 27717ef62cc1f9d092669af0fed465a9a77e0dc1a4fMathias Agopian void flush(); 27817ef62cc1f9d092669af0fed465a9a77e0dc1a4fMathias Agopian void render(); 27917ef62cc1f9d092669af0fed465a9a77e0dc1a4fMathias Agopian 28017ef62cc1f9d092669af0fed465a9a77e0dc1a4fMathias Agopian /** 28117ef62cc1f9d092669af0fed465a9a77e0dc1a4fMathias Agopian * Bounds of the layer. 28217ef62cc1f9d092669af0fed465a9a77e0dc1a4fMathias Agopian */ 28317ef62cc1f9d092669af0fed465a9a77e0dc1a4fMathias Agopian Rect layer; 28417ef62cc1f9d092669af0fed465a9a77e0dc1a4fMathias Agopian /** 28517ef62cc1f9d092669af0fed465a9a77e0dc1a4fMathias Agopian * Texture coordinates of the layer. 28617ef62cc1f9d092669af0fed465a9a77e0dc1a4fMathias Agopian */ 28757066eb64c9a190d1afc87bb060bbb2d31e5b86cRomain Guy Rect texCoords; 28817ef62cc1f9d092669af0fed465a9a77e0dc1a4fMathias Agopian /** 28957066eb64c9a190d1afc87bb060bbb2d31e5b86cRomain Guy * Clipping rectangle. 29017ef62cc1f9d092669af0fed465a9a77e0dc1a4fMathias Agopian */ 29117ef62cc1f9d092669af0fed465a9a77e0dc1a4fMathias Agopian Rect clipRect; 29257066eb64c9a190d1afc87bb060bbb2d31e5b86cRomain Guy 293bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy /** 29417ef62cc1f9d092669af0fed465a9a77e0dc1a4fMathias Agopian * Dirty region indicating what parts of the layer 295bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy * have been drawn. 29617ef62cc1f9d092669af0fed465a9a77e0dc1a4fMathias Agopian */ 29717ef62cc1f9d092669af0fed465a9a77e0dc1a4fMathias Agopian Region region; 298bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy /** 29917ef62cc1f9d092669af0fed465a9a77e0dc1a4fMathias Agopian * If the region is a rectangle, coordinates of the 30057066eb64c9a190d1afc87bb060bbb2d31e5b86cRomain Guy * region are stored here. 30157066eb64c9a190d1afc87bb060bbb2d31e5b86cRomain Guy */ 302ada830f639591b99c3e40de22b07296c7932a33fRomain Guy Rect regionRect; 30357066eb64c9a190d1afc87bb060bbb2d31e5b86cRomain Guy 304ada830f639591b99c3e40de22b07296c7932a33fRomain Guy /** 305fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy * If the layer can be rendered as a mesh, this is non-null. 306fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy */ 307bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy TextureVertex* mesh; 308bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy uint16_t* meshIndices; 309bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy GLsizei meshElementCount; 310bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy 311bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy /** 312bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy * Used for deferred updates. 313bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy */ 314bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy bool deferredUpdateScheduled; 315bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy OpenGLRenderer* renderer; 316bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy DisplayList* displayList; 317bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy Rect dirtyRect; 318bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy bool debugDrawUpdate; 319bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy 320bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guyprivate: 321b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy /** 322211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy * Name of the FBO used to render the layer. If the name is 0 323bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy * this layer is not backed by an FBO, but a simple texture. 324bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy */ 325b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy GLuint fbo; 326eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy 327bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy /** 328bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy * The render buffer used as the stencil buffer. 329bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy */ 330bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy RenderBuffer* stencil; 331bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy 332bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy /** 3336d7475d666baefaa3ba9f0dcee25238739454241Romain Guy * Indicates whether this layer has been used already. 3346d7475d666baefaa3ba9f0dcee25238739454241Romain Guy */ 3356d7475d666baefaa3ba9f0dcee25238739454241Romain Guy bool empty; 3368d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy 337bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy /** 338bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy * The texture backing this layer. 3396a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase */ 3406a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase Texture texture; 341bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy 342bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy /** 343fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy * If set to true (by default), the layer can be reused. 3445b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy */ 3455b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy bool cacheable; 3465b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy 347f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy /** 348f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy * When set to true, this layer must be treated as a texture 349dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase * layer. 350dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase */ 351f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy bool textureLayer; 3529bca4793a33d2714b306d69ceb870925a588fe71Romain Guy 353dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase /** 3549bca4793a33d2714b306d69ceb870925a588fe71Romain Guy * When set to true, this layer is dirty and should be cleared 355f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy * before any rendering occurs. 356dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase */ 357f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy bool dirty; 358dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase 359dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase /** 360f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy * Indicates the render target. 3619bca4793a33d2714b306d69ceb870925a588fe71Romain Guy */ 362dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase GLenum renderTarget; 3639bca4793a33d2714b306d69ceb870925a588fe71Romain Guy 364f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy /** 365f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy * Color filter used to draw this layer. Optional. 366f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy */ 367f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy SkiaColorFilter* colorFilter; 368f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 36915bc6437f8b4cf10dba55c7638d349e7b9563f4fRomain Guy /** 37015bc6437f8b4cf10dba55c7638d349e7b9563f4fRomain Guy * Opacity of the layer. 37115bc6437f8b4cf10dba55c7638d349e7b9563f4fRomain Guy */ 37215bc6437f8b4cf10dba55c7638d349e7b9563f4fRomain Guy int alpha; 37315bc6437f8b4cf10dba55c7638d349e7b9563f4fRomain Guy /** 37415bc6437f8b4cf10dba55c7638d349e7b9563f4fRomain Guy * Blending mode of the layer. 37515bc6437f8b4cf10dba55c7638d349e7b9563f4fRomain Guy */ 37615bc6437f8b4cf10dba55c7638d349e7b9563f4fRomain Guy SkXfermode::Mode mode; 37715bc6437f8b4cf10dba55c7638d349e7b9563f4fRomain Guy 37815bc6437f8b4cf10dba55c7638d349e7b9563f4fRomain Guy /** 37915bc6437f8b4cf10dba55c7638d349e7b9563f4fRomain Guy * Optional texture coordinates transform. 38015bc6437f8b4cf10dba55c7638d349e7b9563f4fRomain Guy */ 38115bc6437f8b4cf10dba55c7638d349e7b9563f4fRomain Guy mat4 texTransform; 38215bc6437f8b4cf10dba55c7638d349e7b9563f4fRomain Guy 38315bc6437f8b4cf10dba55c7638d349e7b9563f4fRomain Guy /** 38415bc6437f8b4cf10dba55c7638d349e7b9563f4fRomain Guy * Optional transform. 38515bc6437f8b4cf10dba55c7638d349e7b9563f4fRomain Guy */ 38615bc6437f8b4cf10dba55c7638d349e7b9563f4fRomain Guy mat4 transform; 38785ef80d8902afe8d26cb75fa7837fd9e6d019620Romain Guy 38885ef80d8902afe8d26cb75fa7837fd9e6d019620Romain Guy /** 38985ef80d8902afe8d26cb75fa7837fd9e6d019620Romain Guy * Used to defer display lists when the layer is updated with a 39085ef80d8902afe8d26cb75fa7837fd9e6d019620Romain Guy * display list. 391cb4d6009576cf08195dc23f341a3f4939c0878bbChris Craik */ 392cb4d6009576cf08195dc23f341a3f4939c0878bbChris Craik DeferredDisplayList* deferredList; 393cb4d6009576cf08195dc23f341a3f4939c0878bbChris Craik 394f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy}; // struct Layer 395f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 396cb4d6009576cf08195dc23f341a3f4939c0878bbChris Craik}; // namespace uirenderer 397dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase}; // namespace android 398dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase 399dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase#endif // ANDROID_HWUI_LAYER_H 400ff316ec7a76e52572a2e89b691e6b3bba0cafba3Romain Guy