Layer.cpp revision 448455fe783b0a711340322dca272b8cc0ebe473
13a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen/*
289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Copyright (C) 2012 The Android Open Source Project
389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *
489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * you may not use this file except in compliance with the License.
689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * You may obtain a copy of the License at
789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *
889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *
1089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
1189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
1289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * See the License for the specific language governing permissions and
1489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * limitations under the License.
1589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */
1689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
1789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#define LOG_TAG "OpenGLRenderer"
1889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
19c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent#include <utils/Log.h>
2089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include "DisplayList.h"
2289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include "DeferredDisplayList.h"
2389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include "Layer.h"
2489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include "LayerRenderer.h"
257562408b2261d38415453378b6188f74fda99d88Mathias Agopian#include "OpenGLRenderer.h"
2689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include "Caches.h"
2789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace android {
2989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace uirenderer {
3089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
3189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectLayer::Layer(const uint32_t layerWidth, const uint32_t layerHeight):
3289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        caches(Caches::getInstance()), texture(caches) {
3389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mesh = NULL;
3489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    meshElementCount = 0;
355876f2f28f31c1bd99864ba3bb1590e3d6765018Glenn Kasten    cacheable = true;
3689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    dirty = false;
3789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    textureLayer = false;
3889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    renderTarget = GL_TEXTURE_2D;
3989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    texture.width = layerWidth;
4089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    texture.height = layerHeight;
4189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    colorFilter = NULL;
4289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    deferredUpdateScheduled = false;
4389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    renderer = NULL;
4489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    displayList = NULL;
4589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    fbo = 0;
4689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    stencil = NULL;
4789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    debugDrawUpdate = false;
4889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    hasDrawnSinceUpdate = false;
4989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    deferredList = NULL;
50c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    caches.resourceCache.incrementRefcount(this);
51c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent}
5289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
5389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectLayer::~Layer() {
54c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    if (colorFilter) caches.resourceCache.decrementRefcount(colorFilter);
55c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    removeFbo();
56c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    deleteTexture();
57c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
58c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    delete[] mesh;
59c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    delete deferredList;
60c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent}
61f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent
62342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurentuint32_t Layer::computeIdealWidth(uint32_t layerWidth) {
6305bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent    return uint32_t(ceilf(layerWidth / float(LAYER_SIZE)) * LAYER_SIZE);
64be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent}
65be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
663a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissenuint32_t Layer::computeIdealHeight(uint32_t layerHeight) {
673a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    return uint32_t(ceilf(layerHeight / float(LAYER_SIZE)) * LAYER_SIZE);
68be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent}
69ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent
70be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurentbool Layer::resize(const uint32_t width, const uint32_t height) {
71de070137f11d346fba77605bd76a44c040a618fcEric Laurent    uint32_t desiredWidth = computeIdealWidth(width);
72a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent    uint32_t desiredHeight = computeIdealWidth(height);
73cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten
74cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    if (desiredWidth <= getWidth() && desiredHeight <= getHeight()) {
75cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        return true;
764182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten    }
7789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
7889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    const uint32_t maxTextureSize = caches.maxTextureSize;
7989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (desiredWidth > maxTextureSize || desiredHeight > maxTextureSize) {
8089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        ALOGW("Layer exceeds max. dimensions supported by the GPU (%dx%d, max=%dx%d)",
8189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                desiredWidth, desiredHeight, maxTextureSize, maxTextureSize);
8289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return false;
8389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
8489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
8589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    uint32_t oldWidth = getWidth();
8689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    uint32_t oldHeight = getHeight();
8789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
88fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten    setSize(desiredWidth, desiredHeight);
8989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
9058f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten    if (fbo) {
91dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten        caches.activeTexture(0);
92e33054eb968cbf8ccaee1b0ff0301403902deed6Glenn Kasten        bindTexture();
93e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten        allocateTexture();
9489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
9572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        if (glGetError() != GL_NO_ERROR) {
963acbd053c842e76e1a40fc8a0bf62de87eebf00fGlenn Kasten            setSize(oldWidth, oldHeight);
97be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return false;
98d054c32443a493513ab63529b0c8b1aca290278cGlenn Kasten        }
9989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
10089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
10189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (stencil) {
1025841db78dff14898538200287d246577b1fc37e2Eric Laurent        stencil->bind();
10389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        stencil->resize(desiredWidth, desiredHeight);
104fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten
10589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (glGetError() != GL_NO_ERROR) {
10689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            setSize(oldWidth, oldHeight);
1070d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi            return false;
10889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
109b26e3e9f2ab0334bff21a4fa4851dbf6e57fba5dGlenn Kasten    }
110e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten
11189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return true;
11272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten}
1133acbd053c842e76e1a40fc8a0bf62de87eebf00fGlenn Kasten
114be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurentvoid Layer::removeFbo(bool flush) {
115be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    if (stencil) {
116be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        GLuint previousFbo;
117be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        glGetIntegerv(GL_FRAMEBUFFER_BINDING, (GLint*) &previousFbo);
118be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (fbo != previousFbo) glBindFramebuffer(GL_FRAMEBUFFER, fbo);
11989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, 0);
12089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (fbo != previousFbo) glBindFramebuffer(GL_FRAMEBUFFER, previousFbo);
12129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block
1225841db78dff14898538200287d246577b1fc37e2Eric Laurent        caches.renderBufferCache.put(stencil);
123e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten        stencil = NULL;
124e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten    }
125e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten
126e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten    if (fbo) {
127be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (flush) LayerRenderer::flushLayer(this);
128be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        // If put fails the cache will delete the FBO
129be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        caches.fboCache.put(fbo);
130be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        fbo = 0;
131d054c32443a493513ab63529b0c8b1aca290278cGlenn Kasten    }
1325841db78dff14898538200287d246577b1fc37e2Eric Laurent}
1335841db78dff14898538200287d246577b1fc37e2Eric Laurent
13489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid Layer::setPaint(SkPaint* paint) {
135507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten    OpenGLRenderer::getAlphaAndModeDirect(paint, &alpha, &mode);
13689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
13789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
1385841db78dff14898538200287d246577b1fc37e2Eric Laurentvoid Layer::setColorFilter(SkiaColorFilter* filter) {
13989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (colorFilter) {
14089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        caches.resourceCache.decrementRefcount(colorFilter);
14189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
14272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    colorFilter = filter;
14389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (colorFilter) {
14458f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten        caches.resourceCache.incrementRefcount(colorFilter);
14528b76b334f92a15a2be3cc9e2f7d229a3275d1acGlenn Kasten    }
146e33054eb968cbf8ccaee1b0ff0301403902deed6Glenn Kasten}
147eeca32671896739e84050da5992d5f151a1629deGlenn Kasten
1481879fff068422852c1483dcf8365c2ff0e2fadfcGlenn Kastenvoid Layer::bindTexture() const {
149be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    if (texture.id) {
15089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        caches.bindTexture(renderTarget, texture.id);
15189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
15289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
1535841db78dff14898538200287d246577b1fc37e2Eric Laurent
15489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid Layer::bindStencilRenderBuffer() const {
15572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    if (stencil) {
15689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        stencil->bind();
15789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
1580d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi}
15989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
160eeca32671896739e84050da5992d5f151a1629deGlenn Kastenvoid Layer::generateTexture() {
161eeca32671896739e84050da5992d5f151a1629deGlenn Kasten    if (!texture.id) {
1621879fff068422852c1483dcf8365c2ff0e2fadfcGlenn Kasten        glGenTextures(1, &texture.id);
163be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
164be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent}
165be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
166be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurentvoid Layer::deleteTexture() {
167be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    if (texture.id) {
1685841db78dff14898538200287d246577b1fc37e2Eric Laurent        texture.deleteTexture();
1695841db78dff14898538200287d246577b1fc37e2Eric Laurent        texture.id = 0;
17029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block    }
1715841db78dff14898538200287d246577b1fc37e2Eric Laurent}
172eeca32671896739e84050da5992d5f151a1629deGlenn Kasten
173eeca32671896739e84050da5992d5f151a1629deGlenn Kastenvoid Layer::clearTexture() {
174eeca32671896739e84050da5992d5f151a1629deGlenn Kasten    texture.id = 0;
175eeca32671896739e84050da5992d5f151a1629deGlenn Kasten}
176be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
177be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurentvoid Layer::allocateTexture() {
178be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent#if DEBUG_LAYERS
179be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    ALOGD("  Allocate layer: %dx%d", getWidth(), getHeight());
1805841db78dff14898538200287d246577b1fc37e2Eric Laurent#endif
1815841db78dff14898538200287d246577b1fc37e2Eric Laurent    if (texture.id) {
1825841db78dff14898538200287d246577b1fc37e2Eric Laurent        glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
183507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        glTexImage2D(renderTarget, 0, GL_RGBA, getWidth(), getHeight(), 0,
18489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                GL_RGBA, GL_UNSIGNED_BYTE, NULL);
18589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
1865841db78dff14898538200287d246577b1fc37e2Eric Laurent}
18789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
18889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid Layer::defer() {
18972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    const float width = layer.getWidth();
19089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    const float height = layer.getHeight();
19189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
19289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (dirtyRect.isEmpty() || (dirtyRect.left <= 0 && dirtyRect.top <= 0 &&
19372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            dirtyRect.right >= width && dirtyRect.bottom >= height)) {
19489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        dirtyRect.set(0, 0, width, height);
19589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
19689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
19789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (deferredList) {
19872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        deferredList->reset(dirtyRect);
19989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    } else {
20089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        deferredList = new DeferredDisplayList(dirtyRect);
20189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
20272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    DeferStateStruct deferredState(*deferredList, *renderer,
20389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            DisplayList::kReplayFlag_ClipChildren);
20458f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten
20589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    renderer->initViewport(width, height);
20689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    renderer->setupFrameState(dirtyRect.left, dirtyRect.top,
20772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            dirtyRect.right, dirtyRect.bottom, !isBlend());
20889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
20989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    displayList->defer(deferredState, 0);
21089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
21172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    deferredUpdateScheduled = false;
21289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
21389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
21489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid Layer::cancelDefer() {
21589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    renderer = NULL;
21672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    displayList = NULL;
21789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    deferredUpdateScheduled = false;
21889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (deferredList) {
21989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        delete deferredList;
22072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        deferredList = NULL;
22189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
22289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
22389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
22489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid Layer::flush() {
22589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    // renderer is checked as layer may be destroyed/put in layer cache with flush scheduled
22689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (deferredList && renderer) {
22789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        renderer->setViewport(layer.getWidth(), layer.getHeight());
22889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        renderer->prepareDirty(dirtyRect.left, dirtyRect.top, dirtyRect.right, dirtyRect.bottom,
22989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                !isBlend());
23089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
23189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        deferredList->flush(*renderer, dirtyRect);
23289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
23389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        renderer->finish();
23489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        renderer = NULL;
23589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
23689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        dirtyRect.setEmpty();
23789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        displayList = NULL;
23889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
23989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
24089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
24189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid Layer::render() {
24289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    renderer->setViewport(layer.getWidth(), layer.getHeight());
24389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    renderer->prepareDirty(dirtyRect.left, dirtyRect.top, dirtyRect.right, dirtyRect.bottom,
24489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            !isBlend());
24589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
24689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    renderer->drawDisplayList(displayList, dirtyRect, DisplayList::kReplayFlag_ClipChildren);
24789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
24889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    renderer->finish();
24989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    renderer = NULL;
25089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
25189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    dirtyRect.setEmpty();
25289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
25389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    deferredUpdateScheduled = false;
25489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    displayList = NULL;
25589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
25689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
25789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; // namespace uirenderer
25889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; // namespace android
25972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten