1b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik/* 25ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik * Copyright (C) 2016 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 175ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik#pragma once 18b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 19b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#include "BakedOpState.h" 20b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#include "CanvasState.h" 21b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#include "DisplayList.h" 22f158b49c888f722194afe5a80539a2b020c130bcChris Craik#include "LayerBuilder.h" 23b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#include "RecordedOp.h" 249372ac3621848085e77b867f220c0b5ffce4010dJohn Reck#include "utils/GLUtils.h" 25b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 26b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#include <vector> 27b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#include <unordered_map> 28b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 29ddf2215d9807b641dbcb304779ef6b530f876ac7Chris Craikstruct SkRect; 30ddf2215d9807b641dbcb304779ef6b530f876ac7Chris Craik 31b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craiknamespace android { 32b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craiknamespace uirenderer { 33b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 34b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikclass BakedOpState; 350b7e8245db728d127ada698be63d78b33fc6e4daChris Craikclass LayerUpdateQueue; 365854b34881b1a747ac80b5077869ef270a92b1f4Chris Craikclass OffscreenBuffer; 37b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikclass Rect; 38b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 395ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik/** 409cd1bbe5c9e14472e631d8cc10005613925f34afChris Craik * Processes, optimizes, and stores rendering commands from RenderNodes and 419cd1bbe5c9e14472e631d8cc10005613925f34afChris Craik * LayerUpdateQueue, building content needed to render a frame. 425ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik * 435ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik * Resolves final drawing state for each operation (including clip, alpha and matrix), and then 445ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik * reorder and merge each op as it is resolved for drawing efficiency. Each layer of content (either 455ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik * from the LayerUpdateQueue, or temporary layers created by saveLayer operations in the 46f158b49c888f722194afe5a80539a2b020c130bcChris Craik * draw stream) will create different reorder contexts, each in its own LayerBuilder. 475ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik * 485ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik * Then the prepared or 'baked' drawing commands can be issued by calling the templated 495ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik * replayBakedOps() function, which will dispatch them (including any created merged op collections) 505ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik * to a Dispatcher and Renderer. See BakedOpDispatcher for how these baked drawing operations are 515ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik * resolved into Glops and rendered via BakedOpRenderer. 525ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik * 535ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik * This class is also the authoritative source for traversing RenderNodes, both for standard op 545ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik * traversal within a DisplayList, and for out of order RenderNode traversal for Z and projection. 555ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik */ 56f158b49c888f722194afe5a80539a2b020c130bcChris Craikclass FrameBuilder : public CanvasStateClient { 57b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikpublic: 586e068c0182f6f85bccb855a647510724d1c65a13Chris Craik struct LightGeometry { 596e068c0182f6f85bccb855a647510724d1c65a13Chris Craik Vector3 center; 606e068c0182f6f85bccb855a647510724d1c65a13Chris Craik float radius; 616e068c0182f6f85bccb855a647510724d1c65a13Chris Craik }; 626e068c0182f6f85bccb855a647510724d1c65a13Chris Craik 639cd1bbe5c9e14472e631d8cc10005613925f34afChris Craik FrameBuilder(const SkRect& clip, 640b7e8245db728d127ada698be63d78b33fc6e4daChris Craik uint32_t viewportWidth, uint32_t viewportHeight, 659cd1bbe5c9e14472e631d8cc10005613925f34afChris Craik const LightGeometry& lightGeometry, Caches& caches); 66b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 679cd1bbe5c9e14472e631d8cc10005613925f34afChris Craik FrameBuilder(const LayerUpdateQueue& layerUpdateQueue, 689cd1bbe5c9e14472e631d8cc10005613925f34afChris Craik const LightGeometry& lightGeometry, Caches& caches); 699cd1bbe5c9e14472e631d8cc10005613925f34afChris Craik 709cd1bbe5c9e14472e631d8cc10005613925f34afChris Craik void deferLayers(const LayerUpdateQueue& layers); 719cd1bbe5c9e14472e631d8cc10005613925f34afChris Craik 729cd1bbe5c9e14472e631d8cc10005613925f34afChris Craik void deferRenderNode(RenderNode& renderNode); 739cd1bbe5c9e14472e631d8cc10005613925f34afChris Craik 749cd1bbe5c9e14472e631d8cc10005613925f34afChris Craik void deferRenderNode(float tx, float ty, Rect clipRect, RenderNode& renderNode); 759cd1bbe5c9e14472e631d8cc10005613925f34afChris Craik 769cd1bbe5c9e14472e631d8cc10005613925f34afChris Craik void deferRenderNodeScene(const std::vector< sp<RenderNode> >& nodes, 779cd1bbe5c9e14472e631d8cc10005613925f34afChris Craik const Rect& contentDrawBounds); 78c3bd56811268a074ffb9513bde0d940199e7ad16Chong Zhang 79f158b49c888f722194afe5a80539a2b020c130bcChris Craik virtual ~FrameBuilder() {} 80b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 81b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik /** 826fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * replayBakedOps() is templated based on what class will receive ops being replayed. 83b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * 84b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * It constructs a lookup array of lambdas, which allows a recorded BakeOpState to use 85b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * state->op->opId to lookup a receiver that will be called when the op is replayed. 86b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik */ 875854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik template <typename StaticDispatcher, typename Renderer> 885854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik void replayBakedOps(Renderer& renderer) { 8974af6e282f8a8f75928a071e8200039517cf5c12Chris Craik std::vector<OffscreenBuffer*> temporaryLayers; 903a5811b50157e7ba50854caf957e806aee794d39Chris Craik finishDefer(); 9115c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik /** 927cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik * Defines a LUT of lambdas which allow a recorded BakedOpState to use state->op->opId to 9315c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik * dispatch the op via a method on a static dispatcher when the op is replayed. 9415c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik * 9515c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik * For example a BitmapOp would resolve, via the lambda lookup, to calling: 9615c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik * 9715c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik * StaticDispatcher::onBitmapOp(Renderer& renderer, const BitmapOp& op, const BakedOpState& state); 9815c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik */ 9915c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik #define X(Type) \ 10015c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik [](void* renderer, const BakedOpState& state) { \ 101b87eadda1818034ce03d85f30388384d1ac65916Chris Craik StaticDispatcher::on##Type(*(static_cast<Renderer*>(renderer)), \ 102b87eadda1818034ce03d85f30388384d1ac65916Chris Craik static_cast<const Type&>(*(state.op)), state); \ 10315c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik }, 1047cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik static BakedOpReceiver unmergedReceivers[] = BUILD_RENDERABLE_OP_LUT(X); 10515c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik #undef X 10615c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik 10715c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik /** 1087cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik * Defines a LUT of lambdas which allow merged arrays of BakedOpState* to be passed to a 1097cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik * static dispatcher when the group of merged ops is replayed. 11015c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik */ 11115c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik #define X(Type) \ 11215c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik [](void* renderer, const MergedBakedOpList& opList) { \ 11315c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik StaticDispatcher::onMerged##Type##s(*(static_cast<Renderer*>(renderer)), opList); \ 11415c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik }, 1157cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik static MergedOpReceiver mergedReceivers[] = BUILD_MERGEABLE_OP_LUT(X); 11615c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik #undef X 117818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik 118818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik // Relay through layers in reverse order, since layers 119818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik // later in the list will be drawn by earlier ones 120f158b49c888f722194afe5a80539a2b020c130bcChris Craik for (int i = mLayerBuilders.size() - 1; i >= 1; i--) { 121975591a7af883d866d86ab819e164c6004694744John Reck GL_CHECKPOINT(MODERATE); 122f158b49c888f722194afe5a80539a2b020c130bcChris Craik LayerBuilder& layer = *(mLayerBuilders[i]); 1230b7e8245db728d127ada698be63d78b33fc6e4daChris Craik if (layer.renderNode) { 1240b7e8245db728d127ada698be63d78b33fc6e4daChris Craik // cached HW layer - can't skip layer if empty 12598787e6c9b2c10b1ab7820bdac168686025b924aChris Craik renderer.startRepaintLayer(layer.offscreenBuffer, layer.repaintRect); 126975591a7af883d866d86ab819e164c6004694744John Reck GL_CHECKPOINT(MODERATE); 12715c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik layer.replayBakedOpsImpl((void*)&renderer, unmergedReceivers, mergedReceivers); 128975591a7af883d866d86ab819e164c6004694744John Reck GL_CHECKPOINT(MODERATE); 1290b7e8245db728d127ada698be63d78b33fc6e4daChris Craik renderer.endLayer(); 130c0f3f2f8c0c2fa97099e5f3c5e3860653ce0f261Chris Craik } else if (!layer.empty()) { 131c0f3f2f8c0c2fa97099e5f3c5e3860653ce0f261Chris Craik // save layer - skip entire layer if empty (in which case, LayerOp has null layer). 132d3daa3198e2212c985c634821682d5819346b653Chris Craik layer.offscreenBuffer = renderer.startTemporaryLayer(layer.width, layer.height); 13374af6e282f8a8f75928a071e8200039517cf5c12Chris Craik temporaryLayers.push_back(layer.offscreenBuffer); 134975591a7af883d866d86ab819e164c6004694744John Reck GL_CHECKPOINT(MODERATE); 13515c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik layer.replayBakedOpsImpl((void*)&renderer, unmergedReceivers, mergedReceivers); 136975591a7af883d866d86ab819e164c6004694744John Reck GL_CHECKPOINT(MODERATE); 1375854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik renderer.endLayer(); 138818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik } 139818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik } 140818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik 141975591a7af883d866d86ab819e164c6004694744John Reck GL_CHECKPOINT(MODERATE); 1426246d27813f25b85f6e4b5cb1121fe8484bcce2dChris Craik if (CC_LIKELY(mDrawFbo0)) { 1436246d27813f25b85f6e4b5cb1121fe8484bcce2dChris Craik const LayerBuilder& fbo0 = *(mLayerBuilders[0]); 1446246d27813f25b85f6e4b5cb1121fe8484bcce2dChris Craik renderer.startFrame(fbo0.width, fbo0.height, fbo0.repaintRect); 1456246d27813f25b85f6e4b5cb1121fe8484bcce2dChris Craik GL_CHECKPOINT(MODERATE); 1466246d27813f25b85f6e4b5cb1121fe8484bcce2dChris Craik fbo0.replayBakedOpsImpl((void*)&renderer, unmergedReceivers, mergedReceivers); 1476246d27813f25b85f6e4b5cb1121fe8484bcce2dChris Craik GL_CHECKPOINT(MODERATE); 1486246d27813f25b85f6e4b5cb1121fe8484bcce2dChris Craik renderer.endFrame(fbo0.repaintRect); 1496246d27813f25b85f6e4b5cb1121fe8484bcce2dChris Craik } 15074af6e282f8a8f75928a071e8200039517cf5c12Chris Craik 15174af6e282f8a8f75928a071e8200039517cf5c12Chris Craik for (auto& temporaryLayer : temporaryLayers) { 15274af6e282f8a8f75928a071e8200039517cf5c12Chris Craik renderer.recycleTemporaryLayer(temporaryLayer); 15374af6e282f8a8f75928a071e8200039517cf5c12Chris Craik } 1546fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik } 1556fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik 1566fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik void dump() const { 157f158b49c888f722194afe5a80539a2b020c130bcChris Craik for (auto&& layer : mLayerBuilders) { 15884ad6149db0e1dc98ed3778ee4fc2ab685765d9aChris Craik layer->dump(); 1596fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik } 160b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik } 1616fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik 1626fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik /////////////////////////////////////////////////////////////////// 1636fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik /// CanvasStateClient interface 1646fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik /////////////////////////////////////////////////////////////////// 1656fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik virtual void onViewportInitialized() override; 1666fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik virtual void onSnapshotRestored(const Snapshot& removed, const Snapshot& restored) override; 1676fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik virtual GLuint getTargetFbo() const override { return 0; } 1686fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik 169b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikprivate: 1703a5811b50157e7ba50854caf957e806aee794d39Chris Craik void finishDefer(); 171161f54b2d4160b8d3f3da9eba5746da5162e4821Chris Craik enum class ChildrenSelectMode { 172161f54b2d4160b8d3f3da9eba5746da5162e4821Chris Craik Negative, 173161f54b2d4160b8d3f3da9eba5746da5162e4821Chris Craik Positive 174161f54b2d4160b8d3f3da9eba5746da5162e4821Chris Craik }; 1750b7e8245db728d127ada698be63d78b33fc6e4daChris Craik void saveForLayer(uint32_t layerWidth, uint32_t layerHeight, 1768ecf41c61a5185207a21d64681e8ebc2502b7b2aChris Craik float contentTranslateX, float contentTranslateY, 1778ecf41c61a5185207a21d64681e8ebc2502b7b2aChris Craik const Rect& repaintRect, 1788ecf41c61a5185207a21d64681e8ebc2502b7b2aChris Craik const Vector3& lightCenter, 1798ecf41c61a5185207a21d64681e8ebc2502b7b2aChris Craik const BeginLayerOp* beginLayerOp, RenderNode* renderNode); 1800b7e8245db728d127ada698be63d78b33fc6e4daChris Craik void restoreForLayer(); 1810b7e8245db728d127ada698be63d78b33fc6e4daChris Craik 182f158b49c888f722194afe5a80539a2b020c130bcChris Craik LayerBuilder& currentLayer() { return *(mLayerBuilders[mLayerStack.back()]); } 1836fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik 1846fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik BakedOpState* tryBakeOpState(const RecordedOp& recordedOp) { 185e4db79de127cfe961195f52907af8451026eaa20Chris Craik return BakedOpState::tryConstruct(mAllocator, *mCanvasState.writableSnapshot(), recordedOp); 1866fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik } 1874c3980b6e43cc7c0541f54b8e7e2d9d6108be622Chris Craik BakedOpState* tryBakeUnboundedOpState(const RecordedOp& recordedOp) { 1884c3980b6e43cc7c0541f54b8e7e2d9d6108be622Chris Craik return BakedOpState::tryConstructUnbounded(mAllocator, *mCanvasState.writableSnapshot(), recordedOp); 1894c3980b6e43cc7c0541f54b8e7e2d9d6108be622Chris Craik } 1904c3980b6e43cc7c0541f54b8e7e2d9d6108be622Chris Craik 191b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 1928d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik // should always be surrounded by a save/restore pair, and not called if DisplayList is null 1930b7e8245db728d127ada698be63d78b33fc6e4daChris Craik void deferNodePropsAndOps(RenderNode& node); 1940b7e8245db728d127ada698be63d78b33fc6e4daChris Craik 1958d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik template <typename V> 196d645640180c25c2711e99aa82ec629155f8e91baChris Craik void defer3dChildren(const ClipBase* reorderClip, ChildrenSelectMode mode, 197d645640180c25c2711e99aa82ec629155f8e91baChris Craik const V& zTranslatedNodes); 1988d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik 199d645640180c25c2711e99aa82ec629155f8e91baChris Craik void deferShadow(const ClipBase* reorderClip, const RenderNodeOp& casterOp); 200161f54b2d4160b8d3f3da9eba5746da5162e4821Chris Craik 2018d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik void deferProjectedChildren(const RenderNode& renderNode); 202b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 2038d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik void deferNodeOps(const RenderNode& renderNode); 204161f54b2d4160b8d3f3da9eba5746da5162e4821Chris Craik 205268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik void deferRenderNodeOpImpl(const RenderNodeOp& op); 206161f54b2d4160b8d3f3da9eba5746da5162e4821Chris Craik 20715c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik void replayBakedOpsImpl(void* arg, BakedOpReceiver* receivers); 208b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 209d3daa3198e2212c985c634821682d5819346b653Chris Craik SkPath* createFrameAllocatedPath() { 210b87eadda1818034ce03d85f30388384d1ac65916Chris Craik return mAllocator.create<SkPath>(); 211d3daa3198e2212c985c634821682d5819346b653Chris Craik } 212386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik 21380d2ade939153da87b3cd3b0a69a713bf68b64baChris Craik BakedOpState* deferStrokeableOp(const RecordedOp& op, batchid_t batchId, 21449b403dc9c47ada51c8e5b883347682a868515f8Chris Craik BakedOpState::StrokeBehavior strokeBehavior = BakedOpState::StrokeBehavior::StyleDefined, 21549b403dc9c47ada51c8e5b883347682a868515f8Chris Craik bool expandForPathTexture = false); 216386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik 217b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik /** 218f158b49c888f722194afe5a80539a2b020c130bcChris Craik * Declares all FrameBuilder::deferXXXXOp() methods for every RecordedOp type. 219b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * 220b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * These private methods are called from within deferImpl to defer each individual op 221b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * type differently. 222b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik */ 2237cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik#define X(Type) void defer##Type(const Type& op); 2247cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik MAP_DEFERRABLE_OPS(X) 2257cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik#undef X 226b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 2279cd1bbe5c9e14472e631d8cc10005613925f34afChris Craik // contains single-frame objects, such as BakedOpStates, LayerBuilders, Batches 2289cd1bbe5c9e14472e631d8cc10005613925f34afChris Craik LinearAllocator mAllocator; 2299cd1bbe5c9e14472e631d8cc10005613925f34afChris Craik LinearStdAllocator<void*> mStdAllocator; 2309cd1bbe5c9e14472e631d8cc10005613925f34afChris Craik 2316fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik // List of every deferred layer's render state. Replayed in reverse order to render a frame. 2329cd1bbe5c9e14472e631d8cc10005613925f34afChris Craik LsaVector<LayerBuilder*> mLayerBuilders; 233b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 2346fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik /* 235f158b49c888f722194afe5a80539a2b020c130bcChris Craik * Stack of indices within mLayerBuilders representing currently active layers. If drawing 2366fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * layerA within a layerB, will contain, in order: 2376fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * - 0 (representing FBO 0, always present) 2386fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * - layerB's index 2396fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * - layerA's index 2406fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * 241f158b49c888f722194afe5a80539a2b020c130bcChris Craik * Note that this doesn't vector doesn't always map onto all values of mLayerBuilders. When a 242f158b49c888f722194afe5a80539a2b020c130bcChris Craik * layer is finished deferring, it will still be represented in mLayerBuilders, but it's index 2436fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * won't be in mLayerStack. This is because it can be replayed, but can't have any more drawing 2446fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * ops added to it. 2456fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik */ 2469cd1bbe5c9e14472e631d8cc10005613925f34afChris Craik LsaVector<size_t> mLayerStack; 247b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 248b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik CanvasState mCanvasState; 249b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 2503a5811b50157e7ba50854caf957e806aee794d39Chris Craik Caches& mCaches; 2516e068c0182f6f85bccb855a647510724d1c65a13Chris Craik 2526e068c0182f6f85bccb855a647510724d1c65a13Chris Craik float mLightRadius; 2536e068c0182f6f85bccb855a647510724d1c65a13Chris Craik 2546246d27813f25b85f6e4b5cb1121fe8484bcce2dChris Craik const bool mDrawFbo0; 255b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; 256b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 257b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; // namespace uirenderer 258b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; // namespace android 259