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