BakedOpRenderer.cpp revision 818c9fbf1d76d5df19253ba4eb964efa939ec9ec
1b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik/* 2b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * Copyright (C) 2015 The Android Open Source Project 3b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * 4b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * Licensed under the Apache License, Version 2.0 (the "License"); 5b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * you may not use this file except in compliance with the License. 6b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * You may obtain a copy of the License at 7b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * 8b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * http://www.apache.org/licenses/LICENSE-2.0 9b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * 10b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * Unless required by applicable law or agreed to in writing, software 11b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * distributed under the License is distributed on an "AS IS" BASIS, 12b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * See the License for the specific language governing permissions and 14b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * limitations under the License. 15b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik */ 16b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 17b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#include "BakedOpRenderer.h" 18b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 19b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#include "Caches.h" 20b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#include "Glop.h" 21b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#include "GlopBuilder.h" 22b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#include "renderstate/RenderState.h" 23b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#include "utils/GLUtils.h" 24b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 25b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craiknamespace android { 26b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craiknamespace uirenderer { 27b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 28818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craikvoid BakedOpRenderer::Info::setViewport(uint32_t width, uint32_t height) { 29818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik viewportWidth = width; 30818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik viewportHeight = height; 31818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik orthoMatrix.loadOrtho(viewportWidth, viewportHeight); 32818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik 33818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik renderState.setViewport(width, height); 34818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik renderState.blend().syncEnabled(); 35818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik} 36818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik 37b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris CraikTexture* BakedOpRenderer::Info::getTexture(const SkBitmap* bitmap) { 38b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik Texture* texture = renderState.assetAtlas().getEntryTexture(bitmap); 39b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik if (!texture) { 40b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik return caches.textureCache.get(bitmap); 41b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik } 42b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik return texture; 43b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik} 44b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 45b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikvoid BakedOpRenderer::Info::renderGlop(const BakedOpState& state, const Glop& glop) { 46b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik bool useScissor = state.computedState.clipSideFlags != OpClipSideFlags::None; 47b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik renderState.scissor().setEnabled(useScissor); 48b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik if (useScissor) { 49b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik const Rect& clip = state.computedState.clipRect; 50b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik renderState.scissor().set(clip.left, viewportHeight - clip.bottom, 51b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik clip.getWidth(), clip.getHeight()); 52b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik } 53b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik renderState.render(glop, orthoMatrix); 54b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik didDraw = true; 55b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik} 56b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 57818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris CraikLayer* BakedOpRenderer::startLayer(Info& info, uint32_t width, uint32_t height) { 58818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik info.caches.textureState().activateTexture(0); 59818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik Layer* layer = info.caches.layerCache.get(info.renderState, width, height); 60818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik LOG_ALWAYS_FATAL_IF(!layer, "need layer..."); 61818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik 62818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik info.layer = layer; 63818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik layer->texCoords.set(0.0f, width / float(layer->getHeight()), 64818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik height / float(layer->getWidth()), 0.0f); 65818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik 66818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik layer->setFbo(info.renderState.genFramebuffer()); 67818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik info.renderState.bindFramebuffer(layer->getFbo()); 68818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik layer->bindTexture(); 69818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik 70818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik // Initialize the texture if needed 71818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik if (layer->isEmpty()) { 72818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik layer->allocateTexture(); 73818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik layer->setEmpty(false); 74818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik } 75818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik 76818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik // attach the texture to the FBO 77818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 78818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik layer->getTextureId(), 0); 79818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik LOG_ALWAYS_FATAL_IF(GLUtils::dumpGLErrors(), "startLayer FAILED"); 80818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik LOG_ALWAYS_FATAL_IF(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE, 81818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik "framebuffer incomplete!"); 82818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik 83818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik // Clear the FBO 84818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik info.renderState.scissor().setEnabled(false); 85818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik glClear(GL_COLOR_BUFFER_BIT); 86818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik 87818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik // Change the viewport & ortho projection 88818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik info.setViewport(width, height); 89818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik return layer; 90818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik} 91818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik 92818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craikvoid BakedOpRenderer::endLayer(Info& info) { 93818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik Layer* layer = info.layer; 94818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik info.layer = nullptr; 95818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik 96818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik // Detach the texture from the FBO 97818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0); 98818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik LOG_ALWAYS_FATAL_IF(GLUtils::dumpGLErrors(), "endLayer FAILED"); 99818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik layer->removeFbo(false); 100818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik} 101818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik 102818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craikvoid BakedOpRenderer::startFrame(Info& info, uint32_t width, uint32_t height) { 103818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik info.renderState.bindFramebuffer(0); 104818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik info.setViewport(width, height); 105b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik Caches::getInstance().clearGarbage(); 106b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 107b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik if (!info.opaque) { 108b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik // TODO: partial invalidate! 109b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik info.renderState.scissor().setEnabled(false); 110b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik glClear(GL_COLOR_BUFFER_BIT); 111b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik info.didDraw = true; 112b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik } 113b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik} 114b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikvoid BakedOpRenderer::endFrame(Info& info) { 115b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik info.caches.pathCache.trim(); 116b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik info.caches.tessellationCache.trim(); 117b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 118b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#if DEBUG_OPENGL 119b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik GLUtils::dumpGLErrors(); 120b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#endif 121b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 122b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#if DEBUG_MEMORY_USAGE 123b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik info.caches.dumpMemoryUsage(); 124b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#else 125b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik if (Properties::debugLevel & kDebugMemory) { 126b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik info.caches.dumpMemoryUsage(); 127b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik } 128b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#endif 129b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik} 130b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 1316fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craikvoid BakedOpRenderer::onRenderNodeOp(Info&, const RenderNodeOp&, const BakedOpState&) { 132b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik LOG_ALWAYS_FATAL("unsupported operation"); 133b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik} 134b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 1356fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craikvoid BakedOpRenderer::onBitmapOp(Info& info, const BitmapOp& op, const BakedOpState& state) { 1366fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik info.caches.textureState().activateTexture(0); // TODO: should this be automatic, and/or elsewhere? 1376fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik Texture* texture = info.getTexture(op.bitmap); 138b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik if (!texture) return; 139b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik const AutoTexture autoCleanup(texture); 140b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 141b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik const int textureFillFlags = (op.bitmap->colorType() == kAlpha_8_SkColorType) 142b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik ? TextureFillFlags::IsAlphaMaskTexture : TextureFillFlags::None; 143b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik Glop glop; 1446fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik GlopBuilder(info.renderState, info.caches, &glop) 145b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik .setRoundRectClipState(state.roundRectClipState) 146b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik .setMeshTexturedUnitQuad(texture->uvMapper) 147b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik .setFillTexturePaint(*texture, textureFillFlags, op.paint, state.alpha) 148b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik .setTransform(state.computedState.transform, TransformFlags::None) 149b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik .setModelViewMapUnitToRectSnap(Rect(0, 0, texture->width, texture->height)) 150b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik .build(); 1516fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik info.renderGlop(state, glop); 152b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik} 153b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 1546fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craikvoid BakedOpRenderer::onRectOp(Info& info, const RectOp& op, const BakedOpState& state) { 155b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik Glop glop; 1566fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik GlopBuilder(info.renderState, info.caches, &glop) 157b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik .setRoundRectClipState(state.roundRectClipState) 158b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik .setMeshUnitQuad() 159b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik .setFillPaint(*op.paint, state.alpha) 160b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik .setTransform(state.computedState.transform, TransformFlags::None) 161b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik .setModelViewMapUnitToRect(op.unmappedBounds) 162b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik .build(); 1636fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik info.renderGlop(state, glop); 164b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik} 165b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 1666fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craikvoid BakedOpRenderer::onSimpleRectsOp(Info& info, const SimpleRectsOp& op, const BakedOpState& state) { 167b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik Glop glop; 1686fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik GlopBuilder(info.renderState, info.caches, &glop) 169b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik .setRoundRectClipState(state.roundRectClipState) 170b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik .setMeshIndexedQuads(&op.vertices[0], op.vertexCount / 4) 171b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik .setFillPaint(*op.paint, state.alpha) 172b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik .setTransform(state.computedState.transform, TransformFlags::None) 173b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik .setModelViewOffsetRect(0, 0, op.unmappedBounds) 174b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik .build(); 1756fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik info.renderGlop(state, glop); 176b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik} 177b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 1786fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craikvoid BakedOpRenderer::onBeginLayerOp(Info& info, const BeginLayerOp& op, const BakedOpState& state) { 1796fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik LOG_ALWAYS_FATAL("unsupported operation"); 1806fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik} 1816fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik 1826fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craikvoid BakedOpRenderer::onEndLayerOp(Info& info, const EndLayerOp& op, const BakedOpState& state) { 1836fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik LOG_ALWAYS_FATAL("unsupported operation"); 1846fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik} 1856fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik 1866fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craikvoid BakedOpRenderer::onLayerOp(Info& info, const LayerOp& op, const BakedOpState& state) { 187818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik Layer* layer = *op.layerHandle; 188818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik 189818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik // TODO: make this work for HW layers 190818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik layer->setPaint(op.paint); 191818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik layer->setBlend(true); 192818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik float layerAlpha = (layer->getAlpha() / 255.0f) * state.alpha; 193818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik 194818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik const bool tryToSnap = state.computedState.transform.isPureTranslate(); 195818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik Glop glop; 196818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik GlopBuilder(info.renderState, info.caches, &glop) 197818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik .setRoundRectClipState(state.roundRectClipState) 198818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik .setMeshTexturedUvQuad(nullptr, layer->texCoords) 199818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik .setFillLayer(layer->getTexture(), layer->getColorFilter(), layerAlpha, layer->getMode(), Blend::ModeOrderSwap::NoSwap) 200818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik .setTransform(state.computedState.transform, TransformFlags::None) 201818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik .setModelViewMapUnitToRectOptionalSnap(tryToSnap, op.unmappedBounds) 202818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik .build(); 203818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik info.renderGlop(state, glop); 204818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik 205818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik // return layer to cache, since each clipped savelayer is only drawn once. 206818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik layer->setConvexMask(nullptr); 207818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik if (!info.caches.layerCache.put(layer)) { 208818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik // Failing to add the layer to the cache should happen only if the layer is too large 209818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik LAYER_LOGD("Deleting layer"); 210818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik layer->decStrong(nullptr); 211818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik } 2126fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik} 213b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 214b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik} // namespace uirenderer 215b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik} // namespace android 216