Layer.h revision 3bbacf27c0be1bae4e4483577fc89ae3113abe5d
1dda570201ac851dd85af3861f7e575721d3345daRomain Guy/* 2dda570201ac851dd85af3861f7e575721d3345daRomain Guy * Copyright (C) 2010 The Android Open Source Project 3dda570201ac851dd85af3861f7e575721d3345daRomain Guy * 4dda570201ac851dd85af3861f7e575721d3345daRomain Guy * Licensed under the Apache License, Version 2.0 (the "License"); 5dda570201ac851dd85af3861f7e575721d3345daRomain Guy * you may not use this file except in compliance with the License. 6dda570201ac851dd85af3861f7e575721d3345daRomain Guy * You may obtain a copy of the License at 7dda570201ac851dd85af3861f7e575721d3345daRomain Guy * 8dda570201ac851dd85af3861f7e575721d3345daRomain Guy * http://www.apache.org/licenses/LICENSE-2.0 9dda570201ac851dd85af3861f7e575721d3345daRomain Guy * 10dda570201ac851dd85af3861f7e575721d3345daRomain Guy * Unless required by applicable law or agreed to in writing, software 11dda570201ac851dd85af3861f7e575721d3345daRomain Guy * distributed under the License is distributed on an "AS IS" BASIS, 12dda570201ac851dd85af3861f7e575721d3345daRomain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13dda570201ac851dd85af3861f7e575721d3345daRomain Guy * See the License for the specific language governing permissions and 14dda570201ac851dd85af3861f7e575721d3345daRomain Guy * limitations under the License. 15dda570201ac851dd85af3861f7e575721d3345daRomain Guy */ 16dda570201ac851dd85af3861f7e575721d3345daRomain Guy 175b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#ifndef ANDROID_HWUI_LAYER_H 185b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#define ANDROID_HWUI_LAYER_H 19dda570201ac851dd85af3861f7e575721d3345daRomain Guy 20f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy#include <sys/types.h> 21f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy 22dda570201ac851dd85af3861f7e575721d3345daRomain Guy#include <GLES2/gl2.h> 23dda570201ac851dd85af3861f7e575721d3345daRomain Guy 245b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#include <ui/Region.h> 255b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy 26dda570201ac851dd85af3861f7e575721d3345daRomain Guy#include <SkXfermode.h> 27dda570201ac851dd85af3861f7e575721d3345daRomain Guy 28dda570201ac851dd85af3861f7e575721d3345daRomain Guy#include "Rect.h" 293bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy#include "RenderBuffer.h" 30171c592f0b7066acf279863c8a52ddabea49d3dbRomain Guy#include "SkiaColorFilter.h" 319ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy#include "Texture.h" 32f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy#include "Vertex.h" 33dda570201ac851dd85af3861f7e575721d3345daRomain Guy 34dda570201ac851dd85af3861f7e575721d3345daRomain Guynamespace android { 35dda570201ac851dd85af3861f7e575721d3345daRomain Guynamespace uirenderer { 36dda570201ac851dd85af3861f7e575721d3345daRomain Guy 378550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy/////////////////////////////////////////////////////////////////////////////// 388550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy// Layers 398550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy/////////////////////////////////////////////////////////////////////////////// 40dda570201ac851dd85af3861f7e575721d3345daRomain Guy 412bf68f063b0077ddef6ebfe54f2ae5e063c2c229Romain Guy// Forward declarations 422bf68f063b0077ddef6ebfe54f2ae5e063c2c229Romain Guyclass OpenGLRenderer; 432bf68f063b0077ddef6ebfe54f2ae5e063c2c229Romain Guyclass DisplayList; 442bf68f063b0077ddef6ebfe54f2ae5e063c2c229Romain Guy 45dda570201ac851dd85af3861f7e575721d3345daRomain Guy/** 46eb99356a0548684a501766e6a524529ab93304c8Romain Guy * A layer has dimensions and is backed by an OpenGL texture or FBO. 47dda570201ac851dd85af3861f7e575721d3345daRomain Guy */ 48dda570201ac851dd85af3861f7e575721d3345daRomain Guystruct Layer { 49603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase Layer(const uint32_t layerWidth, const uint32_t layerHeight); 50d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase ~Layer(); 518550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy 522055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy static uint32_t computeIdealWidth(uint32_t layerWidth); 532055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy static uint32_t computeIdealHeight(uint32_t layerHeight); 542055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy 558ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy /** 568ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy * Calling this method will remove (either by recycling or 578ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy * destroying) the associated FBO, if present, and any render 588ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy * buffer (stencil for instance.) 598ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy */ 608ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy void removeFbo(bool flush = true); 6156257aff8a55c847be72be9924c392033fd8151dDave Burke 62dda570201ac851dd85af3861f7e575721d3345daRomain Guy /** 639fc27819d75e24ad63d7b383d80f5cb66a577a0dRomain Guy * Sets this layer's region to a rectangle. Computes the appropriate 649fc27819d75e24ad63d7b383d80f5cb66a577a0dRomain Guy * texture coordinates. 659fc27819d75e24ad63d7b383d80f5cb66a577a0dRomain Guy */ 669fc27819d75e24ad63d7b383d80f5cb66a577a0dRomain Guy void setRegionAsRect() { 679fc27819d75e24ad63d7b383d80f5cb66a577a0dRomain Guy const android::Rect& bounds = region.getBounds(); 689fc27819d75e24ad63d7b383d80f5cb66a577a0dRomain Guy regionRect.set(bounds.leftTop().x, bounds.leftTop().y, 699fc27819d75e24ad63d7b383d80f5cb66a577a0dRomain Guy bounds.rightBottom().x, bounds.rightBottom().y); 709fc27819d75e24ad63d7b383d80f5cb66a577a0dRomain Guy 719ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy const float texX = 1.0f / float(texture.width); 729ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy const float texY = 1.0f / float(texture.height); 739fc27819d75e24ad63d7b383d80f5cb66a577a0dRomain Guy const float height = layer.getHeight(); 749fc27819d75e24ad63d7b383d80f5cb66a577a0dRomain Guy texCoords.set( 759fc27819d75e24ad63d7b383d80f5cb66a577a0dRomain Guy regionRect.left * texX, (height - regionRect.top) * texY, 769fc27819d75e24ad63d7b383d80f5cb66a577a0dRomain Guy regionRect.right * texX, (height - regionRect.bottom) * texY); 779ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy 789ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy regionRect.translate(layer.left, layer.top); 799ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy } 809ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy 812bf68f063b0077ddef6ebfe54f2ae5e063c2c229Romain Guy void updateDeferred(OpenGLRenderer* renderer, DisplayList* displayList, 822bf68f063b0077ddef6ebfe54f2ae5e063c2c229Romain Guy int left, int top, int right, int bottom) { 832bf68f063b0077ddef6ebfe54f2ae5e063c2c229Romain Guy this->renderer = renderer; 842bf68f063b0077ddef6ebfe54f2ae5e063c2c229Romain Guy this->displayList = displayList; 852bf68f063b0077ddef6ebfe54f2ae5e063c2c229Romain Guy const Rect r(left, top, right, bottom); 862bf68f063b0077ddef6ebfe54f2ae5e063c2c229Romain Guy dirtyRect.unionWith(r); 872bf68f063b0077ddef6ebfe54f2ae5e063c2c229Romain Guy deferredUpdateScheduled = true; 882bf68f063b0077ddef6ebfe54f2ae5e063c2c229Romain Guy } 892bf68f063b0077ddef6ebfe54f2ae5e063c2c229Romain Guy 903bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy inline uint32_t getWidth() const { 919ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy return texture.width; 929ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy } 939ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy 943bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy inline uint32_t getHeight() const { 959ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy return texture.height; 969ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy } 979ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy 982055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy /** 992055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy * Resize the layer and its texture if needed. 1002055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy * 1012055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy * @param width The new width of the layer 1022055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy * @param height The new height of the layer 1032055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy * 1042055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy * @return True if the layer was resized or nothing happened, false if 1052055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy * a failure occurred during the resizing operation 1062055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy */ 1072055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy bool resize(const uint32_t width, const uint32_t height); 1082055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy 1099ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy void setSize(uint32_t width, uint32_t height) { 1109ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy texture.width = width; 1119ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy texture.height = height; 1129ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy } 1139ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy 114d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase ANDROID_API void setPaint(SkPaint* paint); 115d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase 1169ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy inline void setBlend(bool blend) { 1179ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy texture.blend = blend; 1189ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy } 1199ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy 1203bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy inline bool isBlend() const { 1219ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy return texture.blend; 1229ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy } 1239ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy 1249ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy inline void setAlpha(int alpha) { 1259ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy this->alpha = alpha; 1269ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy } 1279ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy 1289ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy inline void setAlpha(int alpha, SkXfermode::Mode mode) { 1299ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy this->alpha = alpha; 1309ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy this->mode = mode; 1319ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy } 1329ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy 1333bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy inline int getAlpha() const { 1349ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy return alpha; 1359ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy } 1369ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy 1373bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy inline SkXfermode::Mode getMode() const { 1389ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy return mode; 1399ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy } 1409ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy 1419ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy inline void setEmpty(bool empty) { 1429ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy this->empty = empty; 1439ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy } 1449ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy 1453bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy inline bool isEmpty() const { 1469ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy return empty; 1479ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy } 1489ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy 1499ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy inline void setFbo(GLuint fbo) { 1509ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy this->fbo = fbo; 1519ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy } 1529ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy 1533bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy inline GLuint getFbo() const { 1549ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy return fbo; 1559ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy } 1569ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy 1573bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy inline void setStencilRenderBuffer(RenderBuffer* renderBuffer) { 1583bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy if (RenderBuffer::isStencilBuffer(renderBuffer->getFormat())) { 1593bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy this->stencil = renderBuffer; 1603bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, 1613bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy GL_RENDERBUFFER, stencil->getName()); 1623bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy } else { 1633bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy ALOGE("The specified render buffer is not a stencil buffer"); 1643bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy } 1658ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy } 1668ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy 1673bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy inline RenderBuffer* getStencilRenderBuffer() const { 1688ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy return stencil; 1698ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy } 1708ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy 1713bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy inline GLuint getTexture() const { 1729ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy return texture.id; 1739ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy } 1749ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy 1753bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy inline GLenum getRenderTarget() const { 1769ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy return renderTarget; 1779ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy } 1789ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy 1799ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy inline void setRenderTarget(GLenum renderTarget) { 1809ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy this->renderTarget = renderTarget; 1819ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy } 1829ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy 183d21b6e1fe337b35f62cf2028e9bd0637fd009a75Romain Guy void setWrap(GLenum wrap, bool bindTexture = false, bool force = false) { 184d21b6e1fe337b35f62cf2028e9bd0637fd009a75Romain Guy texture.setWrap(wrap, bindTexture, force, renderTarget); 1859ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy } 1869ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy 187d21b6e1fe337b35f62cf2028e9bd0637fd009a75Romain Guy void setFilter(GLenum filter, bool bindTexture = false, bool force = false) { 188d21b6e1fe337b35f62cf2028e9bd0637fd009a75Romain Guy texture.setFilter(filter, bindTexture, force, renderTarget); 1899ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy } 1909ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy 1913bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy inline bool isCacheable() const { 1929ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy return cacheable; 1939ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy } 1949ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy 1959ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy inline void setCacheable(bool cacheable) { 1969ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy this->cacheable = cacheable; 1979ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy } 1989ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy 1993bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy inline bool isDirty() const { 2007c25aab491707f7324f9941b8cfa9bd2b4b97e76Romain Guy return dirty; 2017c25aab491707f7324f9941b8cfa9bd2b4b97e76Romain Guy } 2027c25aab491707f7324f9941b8cfa9bd2b4b97e76Romain Guy 2037c25aab491707f7324f9941b8cfa9bd2b4b97e76Romain Guy inline void setDirty(bool dirty) { 2047c25aab491707f7324f9941b8cfa9bd2b4b97e76Romain Guy this->dirty = dirty; 2057c25aab491707f7324f9941b8cfa9bd2b4b97e76Romain Guy } 2067c25aab491707f7324f9941b8cfa9bd2b4b97e76Romain Guy 2073bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy inline bool isTextureLayer() const { 2089ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy return textureLayer; 2099ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy } 2109ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy 2119ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy inline void setTextureLayer(bool textureLayer) { 2129ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy this->textureLayer = textureLayer; 2139ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy } 2149ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy 2153bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy inline SkiaColorFilter* getColorFilter() const { 2169ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy return colorFilter; 2179ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy } 2189ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy 219d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase ANDROID_API void setColorFilter(SkiaColorFilter* filter); 2209ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy 2213bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy inline void bindTexture() const { 222ef09a210dd6ea481158b7028ec2424a7f5769ed2Romain Guy if (texture.id) { 223ef09a210dd6ea481158b7028ec2424a7f5769ed2Romain Guy glBindTexture(renderTarget, texture.id); 224ef09a210dd6ea481158b7028ec2424a7f5769ed2Romain Guy } 2259ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy } 2269ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy 2273bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy inline void bindStencilRenderBuffer() const { 2282055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy if (stencil) { 2293bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy stencil->bind(); 2302055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy } 2312055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy } 2322055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy 2339ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy inline void generateTexture() { 234ef09a210dd6ea481158b7028ec2424a7f5769ed2Romain Guy if (!texture.id) { 235ef09a210dd6ea481158b7028ec2424a7f5769ed2Romain Guy glGenTextures(1, &texture.id); 236ef09a210dd6ea481158b7028ec2424a7f5769ed2Romain Guy } 2379ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy } 2389ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy 2399ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy inline void deleteTexture() { 240ef09a210dd6ea481158b7028ec2424a7f5769ed2Romain Guy if (texture.id) { 241ef09a210dd6ea481158b7028ec2424a7f5769ed2Romain Guy glDeleteTextures(1, &texture.id); 242ef09a210dd6ea481158b7028ec2424a7f5769ed2Romain Guy texture.id = 0; 243ef09a210dd6ea481158b7028ec2424a7f5769ed2Romain Guy } 244ef09a210dd6ea481158b7028ec2424a7f5769ed2Romain Guy } 245ef09a210dd6ea481158b7028ec2424a7f5769ed2Romain Guy 246ef09a210dd6ea481158b7028ec2424a7f5769ed2Romain Guy /** 247ef09a210dd6ea481158b7028ec2424a7f5769ed2Romain Guy * When the caller frees the texture itself, the caller 248ef09a210dd6ea481158b7028ec2424a7f5769ed2Romain Guy * must call this method to tell this layer that it lost 249ef09a210dd6ea481158b7028ec2424a7f5769ed2Romain Guy * the texture. 250ef09a210dd6ea481158b7028ec2424a7f5769ed2Romain Guy */ 251ef09a210dd6ea481158b7028ec2424a7f5769ed2Romain Guy void clearTexture() { 252ef09a210dd6ea481158b7028ec2424a7f5769ed2Romain Guy texture.id = 0; 2539ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy } 2549ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy 2559ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy inline void allocateTexture(GLenum format, GLenum storage) { 256b2e2f2470693e78baed20617f989d9a166864ed4Romain Guy#if DEBUG_LAYERS 257b2e2f2470693e78baed20617f989d9a166864ed4Romain Guy ALOGD(" Allocate layer: %dx%d", getWidth(), getHeight()); 258b2e2f2470693e78baed20617f989d9a166864ed4Romain Guy#endif 2592055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy if (texture.id) { 2602055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy glTexImage2D(renderTarget, 0, format, getWidth(), getHeight(), 0, 2612055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy format, storage, NULL); 2622055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy } 2632055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy } 2642055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy 2659ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy inline mat4& getTexTransform() { 2669ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy return texTransform; 2679fc27819d75e24ad63d7b383d80f5cb66a577a0dRomain Guy } 2689fc27819d75e24ad63d7b383d80f5cb66a577a0dRomain Guy 269302a9df1d50373c82923bb84ff665dfce584fb22Romain Guy inline mat4& getTransform() { 270302a9df1d50373c82923bb84ff665dfce584fb22Romain Guy return transform; 271302a9df1d50373c82923bb84ff665dfce584fb22Romain Guy } 272302a9df1d50373c82923bb84ff665dfce584fb22Romain Guy 2739fc27819d75e24ad63d7b383d80f5cb66a577a0dRomain Guy /** 2748550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy * Bounds of the layer. 275dda570201ac851dd85af3861f7e575721d3345daRomain Guy */ 276dda570201ac851dd85af3861f7e575721d3345daRomain Guy Rect layer; 277dda570201ac851dd85af3861f7e575721d3345daRomain Guy /** 2788550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy * Texture coordinates of the layer. 279dda570201ac851dd85af3861f7e575721d3345daRomain Guy */ 2808550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy Rect texCoords; 281c3fedafc5f50100219449125a000e3138f6fb987Romain Guy /** 282c3fedafc5f50100219449125a000e3138f6fb987Romain Guy * Clipping rectangle. 283c3fedafc5f50100219449125a000e3138f6fb987Romain Guy */ 284c3fedafc5f50100219449125a000e3138f6fb987Romain Guy Rect clipRect; 2858550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy 286dda570201ac851dd85af3861f7e575721d3345daRomain Guy /** 2879ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy * Dirty region indicating what parts of the layer 2889ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy * have been drawn. 289eb99356a0548684a501766e6a524529ab93304c8Romain Guy */ 2909ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy Region region; 291eb99356a0548684a501766e6a524529ab93304c8Romain Guy /** 2929ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy * If the region is a rectangle, coordinates of the 2939ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy * region are stored here. 294dda570201ac851dd85af3861f7e575721d3345daRomain Guy */ 2959ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy Rect regionRect; 2969ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy 297dda570201ac851dd85af3861f7e575721d3345daRomain Guy /** 2989ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy * If the layer can be rendered as a mesh, this is non-null. 299dda570201ac851dd85af3861f7e575721d3345daRomain Guy */ 3009ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy TextureVertex* mesh; 3019ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy uint16_t* meshIndices; 3029ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy GLsizei meshElementCount; 3039ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy 3042bf68f063b0077ddef6ebfe54f2ae5e063c2c229Romain Guy /** 3052bf68f063b0077ddef6ebfe54f2ae5e063c2c229Romain Guy * Used for deferred updates. 3062bf68f063b0077ddef6ebfe54f2ae5e063c2c229Romain Guy */ 3072bf68f063b0077ddef6ebfe54f2ae5e063c2c229Romain Guy bool deferredUpdateScheduled; 3082bf68f063b0077ddef6ebfe54f2ae5e063c2c229Romain Guy OpenGLRenderer* renderer; 3092bf68f063b0077ddef6ebfe54f2ae5e063c2c229Romain Guy DisplayList* displayList; 3102bf68f063b0077ddef6ebfe54f2ae5e063c2c229Romain Guy Rect dirtyRect; 3115bb3c730f5ebd2a0db1b02a8981c6fdbea6c1a2eRomain Guy bool debugDrawUpdate; 3122bf68f063b0077ddef6ebfe54f2ae5e063c2c229Romain Guy 3139ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guyprivate: 314dda570201ac851dd85af3861f7e575721d3345daRomain Guy /** 3159ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy * Name of the FBO used to render the layer. If the name is 0 3169ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy * this layer is not backed by an FBO, but a simple texture. 317dda570201ac851dd85af3861f7e575721d3345daRomain Guy */ 3189ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy GLuint fbo; 3198550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy 32038c85b907a478af96d71b9a5df5a2066b8475311Romain Guy /** 3213bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy * The render buffer used as the stencil buffer. 3228ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy */ 3233bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy RenderBuffer* stencil; 3248ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy 3258ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy /** 3260bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy * Indicates whether this layer has been used already. 32738c85b907a478af96d71b9a5df5a2066b8475311Romain Guy */ 32838c85b907a478af96d71b9a5df5a2066b8475311Romain Guy bool empty; 3298550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy 3308550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy /** 3319ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy * The texture backing this layer. 3328550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy */ 3339ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy Texture texture; 3349ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy 3358550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy /** 3369ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy * If set to true (by default), the layer can be reused. 3378550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy */ 3389ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy bool cacheable; 3395b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy 3405b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy /** 3419ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy * When set to true, this layer must be treated as a texture 3429ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy * layer. 3435b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy */ 3449ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy bool textureLayer; 3459ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy 34640667676e542a9daeafeac9904c30004e8706fd3Romain Guy /** 3477c25aab491707f7324f9941b8cfa9bd2b4b97e76Romain Guy * When set to true, this layer is dirty and should be cleared 3487c25aab491707f7324f9941b8cfa9bd2b4b97e76Romain Guy * before any rendering occurs. 3497c25aab491707f7324f9941b8cfa9bd2b4b97e76Romain Guy */ 3507c25aab491707f7324f9941b8cfa9bd2b4b97e76Romain Guy bool dirty; 3517c25aab491707f7324f9941b8cfa9bd2b4b97e76Romain Guy 3527c25aab491707f7324f9941b8cfa9bd2b4b97e76Romain Guy /** 3539ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy * Indicates the render target. 35440667676e542a9daeafeac9904c30004e8706fd3Romain Guy */ 3559ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy GLenum renderTarget; 356171c592f0b7066acf279863c8a52ddabea49d3dbRomain Guy 357171c592f0b7066acf279863c8a52ddabea49d3dbRomain Guy /** 358171c592f0b7066acf279863c8a52ddabea49d3dbRomain Guy * Color filter used to draw this layer. Optional. 359171c592f0b7066acf279863c8a52ddabea49d3dbRomain Guy */ 360171c592f0b7066acf279863c8a52ddabea49d3dbRomain Guy SkiaColorFilter* colorFilter; 361f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy 362f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy /** 3639ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy * Opacity of the layer. 364aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy */ 3659ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy int alpha; 366aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy /** 3679ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy * Blending mode of the layer. 368aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy */ 3699ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy SkXfermode::Mode mode; 370aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy 371aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy /** 372aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy * Optional texture coordinates transform. 373aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy */ 374aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy mat4 texTransform; 3758f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy 376302a9df1d50373c82923bb84ff665dfce584fb22Romain Guy /** 377302a9df1d50373c82923bb84ff665dfce584fb22Romain Guy * Optional transform. 378302a9df1d50373c82923bb84ff665dfce584fb22Romain Guy */ 379302a9df1d50373c82923bb84ff665dfce584fb22Romain Guy mat4 transform; 380302a9df1d50373c82923bb84ff665dfce584fb22Romain Guy 381dda570201ac851dd85af3861f7e575721d3345daRomain Guy}; // struct Layer 382dda570201ac851dd85af3861f7e575721d3345daRomain Guy 383dda570201ac851dd85af3861f7e575721d3345daRomain Guy}; // namespace uirenderer 384dda570201ac851dd85af3861f7e575721d3345daRomain Guy}; // namespace android 385dda570201ac851dd85af3861f7e575721d3345daRomain Guy 3865b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_LAYER_H 387