BakedOpRenderer.cpp revision 9fded232a9548a304e0145011df8849fba0dcda7
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" 229fded232a9548a304e0145011df8849fba0dcda7Chris Craik#include "renderstate/OffscreenBufferPool.h" 23b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#include "renderstate/RenderState.h" 24b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#include "utils/GLUtils.h" 259fded232a9548a304e0145011df8849fba0dcda7Chris Craik#include "VertexBuffer.h" 26b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 27b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craiknamespace android { 28b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craiknamespace uirenderer { 29b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 305854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik//////////////////////////////////////////////////////////////////////////////// 315854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik// BakedOpRenderer 325854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik//////////////////////////////////////////////////////////////////////////////// 33818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik 34d3daa3198e2212c985c634821682d5819346b653Chris CraikOffscreenBuffer* BakedOpRenderer::startTemporaryLayer(uint32_t width, uint32_t height) { 359fded232a9548a304e0145011df8849fba0dcda7Chris Craik LOG_ALWAYS_FATAL_IF(mRenderTarget.offscreenBuffer, "already has layer..."); 369fded232a9548a304e0145011df8849fba0dcda7Chris Craik 379fded232a9548a304e0145011df8849fba0dcda7Chris Craik OffscreenBuffer* buffer = mRenderState.layerPool().get(mRenderState, width, height); 38d3daa3198e2212c985c634821682d5819346b653Chris Craik startRepaintLayer(buffer); 390b7e8245db728d127ada698be63d78b33fc6e4daChris Craik return buffer; 400b7e8245db728d127ada698be63d78b33fc6e4daChris Craik} 410b7e8245db728d127ada698be63d78b33fc6e4daChris Craik 42d3daa3198e2212c985c634821682d5819346b653Chris Craikvoid BakedOpRenderer::startRepaintLayer(OffscreenBuffer* offscreenBuffer) { 43d3daa3198e2212c985c634821682d5819346b653Chris Craik LOG_ALWAYS_FATAL_IF(mRenderTarget.offscreenBuffer, "already has layer..."); 44d3daa3198e2212c985c634821682d5819346b653Chris Craik 450b7e8245db728d127ada698be63d78b33fc6e4daChris Craik mRenderTarget.offscreenBuffer = offscreenBuffer; 46818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik 475854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik // create and bind framebuffer 485854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik mRenderTarget.frameBufferId = mRenderState.genFramebuffer(); 495854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik mRenderState.bindFramebuffer(mRenderTarget.frameBufferId); 50818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik 51818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik // attach the texture to the FBO 52818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 530b7e8245db728d127ada698be63d78b33fc6e4daChris Craik offscreenBuffer->texture.id, 0); 54818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik LOG_ALWAYS_FATAL_IF(GLUtils::dumpGLErrors(), "startLayer FAILED"); 55818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik LOG_ALWAYS_FATAL_IF(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE, 56818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik "framebuffer incomplete!"); 57818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik 58818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik // Clear the FBO 595854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik mRenderState.scissor().setEnabled(false); 60818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik glClear(GL_COLOR_BUFFER_BIT); 61818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik 62818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik // Change the viewport & ortho projection 630b7e8245db728d127ada698be63d78b33fc6e4daChris Craik setViewport(offscreenBuffer->viewportWidth, offscreenBuffer->viewportHeight); 64818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik} 65818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik 665854b34881b1a747ac80b5077869ef270a92b1f4Chris Craikvoid BakedOpRenderer::endLayer() { 678d2cf943d9c7292e54726399faefdec4a01c084bChris Craik mRenderTarget.offscreenBuffer->updateMeshFromRegion(); 685854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik mRenderTarget.offscreenBuffer = nullptr; 69818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik 70818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik // Detach the texture from the FBO 71818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0); 72818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik LOG_ALWAYS_FATAL_IF(GLUtils::dumpGLErrors(), "endLayer FAILED"); 735854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik mRenderState.deleteFramebuffer(mRenderTarget.frameBufferId); 745854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik mRenderTarget.frameBufferId = -1; 75818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik} 76818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik 775854b34881b1a747ac80b5077869ef270a92b1f4Chris Craikvoid BakedOpRenderer::startFrame(uint32_t width, uint32_t height) { 785854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik mRenderState.bindFramebuffer(0); 795854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik setViewport(width, height); 805854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik mCaches.clearGarbage(); 81b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 825854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik if (!mOpaque) { 83b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik // TODO: partial invalidate! 845854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik mRenderState.scissor().setEnabled(false); 85b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik glClear(GL_COLOR_BUFFER_BIT); 865854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik mHasDrawn = true; 87b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik } 88b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik} 895854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik 905854b34881b1a747ac80b5077869ef270a92b1f4Chris Craikvoid BakedOpRenderer::endFrame() { 915854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik mCaches.pathCache.trim(); 925854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik mCaches.tessellationCache.trim(); 93b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 94b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#if DEBUG_OPENGL 95b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik GLUtils::dumpGLErrors(); 96b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#endif 97b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 98b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#if DEBUG_MEMORY_USAGE 995854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik mCaches.dumpMemoryUsage(); 100b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#else 101b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik if (Properties::debugLevel & kDebugMemory) { 1025854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik mCaches.dumpMemoryUsage(); 103b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik } 104b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#endif 105b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik} 106b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 1075854b34881b1a747ac80b5077869ef270a92b1f4Chris Craikvoid BakedOpRenderer::setViewport(uint32_t width, uint32_t height) { 1085854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik mRenderTarget.viewportWidth = width; 1095854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik mRenderTarget.viewportHeight = height; 1105854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik mRenderTarget.orthoMatrix.loadOrtho(width, height); 1115854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik 1125854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik mRenderState.setViewport(width, height); 1135854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik mRenderState.blend().syncEnabled(); 1145854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik} 1155854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik 1165854b34881b1a747ac80b5077869ef270a92b1f4Chris CraikTexture* BakedOpRenderer::getTexture(const SkBitmap* bitmap) { 1175854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik Texture* texture = mRenderState.assetAtlas().getEntryTexture(bitmap); 1185854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik if (!texture) { 1195854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik return mCaches.textureCache.get(bitmap); 1205854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik } 1215854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik return texture; 1225854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik} 1235854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik 1245854b34881b1a747ac80b5077869ef270a92b1f4Chris Craikvoid BakedOpRenderer::renderGlop(const BakedOpState& state, const Glop& glop) { 1255854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik bool useScissor = state.computedState.clipSideFlags != OpClipSideFlags::None; 1265854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik mRenderState.scissor().setEnabled(useScissor); 1275854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik if (useScissor) { 1285854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik const Rect& clip = state.computedState.clipRect; 1295854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik mRenderState.scissor().set(clip.left, mRenderTarget.viewportHeight - clip.bottom, 1305854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik clip.getWidth(), clip.getHeight()); 1315854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik } 1328d2cf943d9c7292e54726399faefdec4a01c084bChris Craik if (mRenderTarget.offscreenBuffer) { // TODO: not with multi-draw 1338d2cf943d9c7292e54726399faefdec4a01c084bChris Craik // register layer damage to draw-back region 1348d2cf943d9c7292e54726399faefdec4a01c084bChris Craik const Rect& uiDirty = state.computedState.clippedBounds; 1358d2cf943d9c7292e54726399faefdec4a01c084bChris Craik android::Rect dirty(uiDirty.left, uiDirty.top, uiDirty.right, uiDirty.bottom); 1368d2cf943d9c7292e54726399faefdec4a01c084bChris Craik mRenderTarget.offscreenBuffer->region.orSelf(dirty); 1378d2cf943d9c7292e54726399faefdec4a01c084bChris Craik } 1385854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik mRenderState.render(glop, mRenderTarget.orthoMatrix); 1395854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik mHasDrawn = true; 1405854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik} 1415854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik 1425854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik//////////////////////////////////////////////////////////////////////////////// 1435854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik// static BakedOpDispatcher methods 1445854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik//////////////////////////////////////////////////////////////////////////////// 1455854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik 1465854b34881b1a747ac80b5077869ef270a92b1f4Chris Craikvoid BakedOpDispatcher::onRenderNodeOp(BakedOpRenderer&, const RenderNodeOp&, const BakedOpState&) { 147b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik LOG_ALWAYS_FATAL("unsupported operation"); 148b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik} 149b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 1508d2cf943d9c7292e54726399faefdec4a01c084bChris Craikvoid BakedOpDispatcher::onBeginLayerOp(BakedOpRenderer& renderer, const BeginLayerOp& op, const BakedOpState& state) { 1518d2cf943d9c7292e54726399faefdec4a01c084bChris Craik LOG_ALWAYS_FATAL("unsupported operation"); 1528d2cf943d9c7292e54726399faefdec4a01c084bChris Craik} 1538d2cf943d9c7292e54726399faefdec4a01c084bChris Craik 1548d2cf943d9c7292e54726399faefdec4a01c084bChris Craikvoid BakedOpDispatcher::onEndLayerOp(BakedOpRenderer& renderer, const EndLayerOp& op, const BakedOpState& state) { 1558d2cf943d9c7292e54726399faefdec4a01c084bChris Craik LOG_ALWAYS_FATAL("unsupported operation"); 1568d2cf943d9c7292e54726399faefdec4a01c084bChris Craik} 1578d2cf943d9c7292e54726399faefdec4a01c084bChris Craik 1585854b34881b1a747ac80b5077869ef270a92b1f4Chris Craikvoid BakedOpDispatcher::onBitmapOp(BakedOpRenderer& renderer, const BitmapOp& op, const BakedOpState& state) { 1595854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik renderer.caches().textureState().activateTexture(0); // TODO: should this be automatic, and/or elsewhere? 1605854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik Texture* texture = renderer.getTexture(op.bitmap); 161b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik if (!texture) return; 162b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik const AutoTexture autoCleanup(texture); 163b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 164b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik const int textureFillFlags = (op.bitmap->colorType() == kAlpha_8_SkColorType) 165b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik ? TextureFillFlags::IsAlphaMaskTexture : TextureFillFlags::None; 166b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik Glop glop; 1675854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik GlopBuilder(renderer.renderState(), renderer.caches(), &glop) 168b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik .setRoundRectClipState(state.roundRectClipState) 169b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik .setMeshTexturedUnitQuad(texture->uvMapper) 170b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik .setFillTexturePaint(*texture, textureFillFlags, op.paint, state.alpha) 171b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik .setTransform(state.computedState.transform, TransformFlags::None) 172b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik .setModelViewMapUnitToRectSnap(Rect(0, 0, texture->width, texture->height)) 173b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik .build(); 1745854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik renderer.renderGlop(state, glop); 175b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik} 176b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 1775854b34881b1a747ac80b5077869ef270a92b1f4Chris Craikvoid BakedOpDispatcher::onRectOp(BakedOpRenderer& renderer, const RectOp& op, const BakedOpState& state) { 178b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik Glop glop; 1795854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik GlopBuilder(renderer.renderState(), renderer.caches(), &glop) 180b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik .setRoundRectClipState(state.roundRectClipState) 181b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik .setMeshUnitQuad() 182b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik .setFillPaint(*op.paint, state.alpha) 183b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik .setTransform(state.computedState.transform, TransformFlags::None) 184b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik .setModelViewMapUnitToRect(op.unmappedBounds) 185b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik .build(); 1865854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik renderer.renderGlop(state, glop); 187b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik} 188b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 189d3daa3198e2212c985c634821682d5819346b653Chris Craiknamespace VertexBufferRenderFlags { 190d3daa3198e2212c985c634821682d5819346b653Chris Craik enum { 191d3daa3198e2212c985c634821682d5819346b653Chris Craik Offset = 0x1, 192d3daa3198e2212c985c634821682d5819346b653Chris Craik ShadowInterp = 0x2, 193d3daa3198e2212c985c634821682d5819346b653Chris Craik }; 194d3daa3198e2212c985c634821682d5819346b653Chris Craik} 195d3daa3198e2212c985c634821682d5819346b653Chris Craik 196d3daa3198e2212c985c634821682d5819346b653Chris Craikstatic void renderVertexBuffer(BakedOpRenderer& renderer, const BakedOpState& state, 197d3daa3198e2212c985c634821682d5819346b653Chris Craik const VertexBuffer& vertexBuffer, float translateX, float translateY, 198d3daa3198e2212c985c634821682d5819346b653Chris Craik SkPaint& paint, int vertexBufferRenderFlags) { 199d3daa3198e2212c985c634821682d5819346b653Chris Craik if (CC_LIKELY(vertexBuffer.getVertexCount())) { 200d3daa3198e2212c985c634821682d5819346b653Chris Craik bool shadowInterp = vertexBufferRenderFlags & VertexBufferRenderFlags::ShadowInterp; 201d3daa3198e2212c985c634821682d5819346b653Chris Craik const int transformFlags = TransformFlags::OffsetByFudgeFactor; 202d3daa3198e2212c985c634821682d5819346b653Chris Craik Glop glop; 203d3daa3198e2212c985c634821682d5819346b653Chris Craik GlopBuilder(renderer.renderState(), renderer.caches(), &glop) 204d3daa3198e2212c985c634821682d5819346b653Chris Craik .setRoundRectClipState(state.roundRectClipState) 205d3daa3198e2212c985c634821682d5819346b653Chris Craik .setMeshVertexBuffer(vertexBuffer, shadowInterp) 206d3daa3198e2212c985c634821682d5819346b653Chris Craik .setFillPaint(paint, state.alpha) 207d3daa3198e2212c985c634821682d5819346b653Chris Craik .setTransform(state.computedState.transform, transformFlags) 208d3daa3198e2212c985c634821682d5819346b653Chris Craik .setModelViewOffsetRect(translateX, translateY, vertexBuffer.getBounds()) 209d3daa3198e2212c985c634821682d5819346b653Chris Craik .build(); 210d3daa3198e2212c985c634821682d5819346b653Chris Craik renderer.renderGlop(state, glop); 211d3daa3198e2212c985c634821682d5819346b653Chris Craik } 212d3daa3198e2212c985c634821682d5819346b653Chris Craik} 213d3daa3198e2212c985c634821682d5819346b653Chris Craik 214d3daa3198e2212c985c634821682d5819346b653Chris Craikstatic void renderShadow(BakedOpRenderer& renderer, const BakedOpState& state, float casterAlpha, 215d3daa3198e2212c985c634821682d5819346b653Chris Craik const VertexBuffer* ambientShadowVertexBuffer, const VertexBuffer* spotShadowVertexBuffer) { 216d3daa3198e2212c985c634821682d5819346b653Chris Craik SkPaint paint; 217d3daa3198e2212c985c634821682d5819346b653Chris Craik paint.setAntiAlias(true); // want to use AlphaVertex 218d3daa3198e2212c985c634821682d5819346b653Chris Craik 219d3daa3198e2212c985c634821682d5819346b653Chris Craik // The caller has made sure casterAlpha > 0. 220d3daa3198e2212c985c634821682d5819346b653Chris Craik uint8_t ambientShadowAlpha = 128u; //TODO: mAmbientShadowAlpha; 221d3daa3198e2212c985c634821682d5819346b653Chris Craik if (CC_UNLIKELY(Properties::overrideAmbientShadowStrength >= 0)) { 222d3daa3198e2212c985c634821682d5819346b653Chris Craik ambientShadowAlpha = Properties::overrideAmbientShadowStrength; 223d3daa3198e2212c985c634821682d5819346b653Chris Craik } 224d3daa3198e2212c985c634821682d5819346b653Chris Craik if (ambientShadowVertexBuffer && ambientShadowAlpha > 0) { 225d3daa3198e2212c985c634821682d5819346b653Chris Craik paint.setAlpha((uint8_t)(casterAlpha * ambientShadowAlpha)); 226d3daa3198e2212c985c634821682d5819346b653Chris Craik renderVertexBuffer(renderer, state, *ambientShadowVertexBuffer, 0, 0, 227d3daa3198e2212c985c634821682d5819346b653Chris Craik paint, VertexBufferRenderFlags::ShadowInterp); 228d3daa3198e2212c985c634821682d5819346b653Chris Craik } 229d3daa3198e2212c985c634821682d5819346b653Chris Craik 230d3daa3198e2212c985c634821682d5819346b653Chris Craik uint8_t spotShadowAlpha = 128u; //TODO: mSpotShadowAlpha; 231d3daa3198e2212c985c634821682d5819346b653Chris Craik if (CC_UNLIKELY(Properties::overrideSpotShadowStrength >= 0)) { 232d3daa3198e2212c985c634821682d5819346b653Chris Craik spotShadowAlpha = Properties::overrideSpotShadowStrength; 233d3daa3198e2212c985c634821682d5819346b653Chris Craik } 234d3daa3198e2212c985c634821682d5819346b653Chris Craik if (spotShadowVertexBuffer && spotShadowAlpha > 0) { 235d3daa3198e2212c985c634821682d5819346b653Chris Craik paint.setAlpha((uint8_t)(casterAlpha * spotShadowAlpha)); 236d3daa3198e2212c985c634821682d5819346b653Chris Craik renderVertexBuffer(renderer, state, *spotShadowVertexBuffer, 0, 0, 237d3daa3198e2212c985c634821682d5819346b653Chris Craik paint, VertexBufferRenderFlags::ShadowInterp); 238d3daa3198e2212c985c634821682d5819346b653Chris Craik } 239d3daa3198e2212c985c634821682d5819346b653Chris Craik} 240d3daa3198e2212c985c634821682d5819346b653Chris Craik 241d3daa3198e2212c985c634821682d5819346b653Chris Craikvoid BakedOpDispatcher::onShadowOp(BakedOpRenderer& renderer, const ShadowOp& op, const BakedOpState& state) { 242d3daa3198e2212c985c634821682d5819346b653Chris Craik TessellationCache::vertexBuffer_pair_t buffers; 243d3daa3198e2212c985c634821682d5819346b653Chris Craik Vector3 lightCenter = { 300, 300, 300 }; // TODO! 244d3daa3198e2212c985c634821682d5819346b653Chris Craik float lightRadius = 150; // TODO! 245d3daa3198e2212c985c634821682d5819346b653Chris Craik 246d3daa3198e2212c985c634821682d5819346b653Chris Craik renderer.caches().tessellationCache.getShadowBuffers(&state.computedState.transform, 247d3daa3198e2212c985c634821682d5819346b653Chris Craik op.localClipRect, op.casterAlpha >= 1.0f, op.casterPath, 248d3daa3198e2212c985c634821682d5819346b653Chris Craik &op.shadowMatrixXY, &op.shadowMatrixZ, lightCenter, lightRadius, 249d3daa3198e2212c985c634821682d5819346b653Chris Craik buffers); 250d3daa3198e2212c985c634821682d5819346b653Chris Craik 251d3daa3198e2212c985c634821682d5819346b653Chris Craik renderShadow(renderer, state, op.casterAlpha, buffers.first, buffers.second); 252d3daa3198e2212c985c634821682d5819346b653Chris Craik} 253d3daa3198e2212c985c634821682d5819346b653Chris Craik 2545854b34881b1a747ac80b5077869ef270a92b1f4Chris Craikvoid BakedOpDispatcher::onSimpleRectsOp(BakedOpRenderer& renderer, const SimpleRectsOp& op, const BakedOpState& state) { 255b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik Glop glop; 2565854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik GlopBuilder(renderer.renderState(), renderer.caches(), &glop) 257b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik .setRoundRectClipState(state.roundRectClipState) 258b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik .setMeshIndexedQuads(&op.vertices[0], op.vertexCount / 4) 259b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik .setFillPaint(*op.paint, state.alpha) 260b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik .setTransform(state.computedState.transform, TransformFlags::None) 261b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik .setModelViewOffsetRect(0, 0, op.unmappedBounds) 262b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik .build(); 2635854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik renderer.renderGlop(state, glop); 264b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik} 265b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 2665854b34881b1a747ac80b5077869ef270a92b1f4Chris Craikvoid BakedOpDispatcher::onLayerOp(BakedOpRenderer& renderer, const LayerOp& op, const BakedOpState& state) { 2675854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik OffscreenBuffer* buffer = *op.layerHandle; 268818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik 2695854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik // TODO: extend this to handle HW layers & paint properties which 2705854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik // reside in node.properties().layerProperties() 2710b7e8245db728d127ada698be63d78b33fc6e4daChris Craik float layerAlpha = op.alpha * state.alpha; 272818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik Glop glop; 2735854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik GlopBuilder(renderer.renderState(), renderer.caches(), &glop) 274818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik .setRoundRectClipState(state.roundRectClipState) 2758d2cf943d9c7292e54726399faefdec4a01c084bChris Craik .setMeshTexturedIndexedVbo(buffer->vbo, buffer->elementCount) 2760b7e8245db728d127ada698be63d78b33fc6e4daChris Craik .setFillLayer(buffer->texture, op.colorFilter, layerAlpha, op.mode, Blend::ModeOrderSwap::NoSwap) 277818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik .setTransform(state.computedState.transform, TransformFlags::None) 2788d2cf943d9c7292e54726399faefdec4a01c084bChris Craik .setModelViewOffsetRectSnap(op.unmappedBounds.left, op.unmappedBounds.top, 2798d2cf943d9c7292e54726399faefdec4a01c084bChris Craik Rect(op.unmappedBounds.getWidth(), op.unmappedBounds.getHeight())) 280818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik .build(); 2815854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik renderer.renderGlop(state, glop); 2825854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik 2830b7e8245db728d127ada698be63d78b33fc6e4daChris Craik if (op.destroy) { 2849fded232a9548a304e0145011df8849fba0dcda7Chris Craik renderer.renderState().layerPool().putOrDelete(buffer); 2850b7e8245db728d127ada698be63d78b33fc6e4daChris Craik } 2866fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik} 287b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 288b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik} // namespace uirenderer 289b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik} // namespace android 290