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