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