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 <unordered_map>
271bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck#include <vector>
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
631bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    FrameBuilder(const SkRect& clip, uint32_t viewportWidth, uint32_t viewportHeight,
641bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck                 const LightGeometry& lightGeometry, Caches& caches);
65b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
661bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    FrameBuilder(const LayerUpdateQueue& layerUpdateQueue, const LightGeometry& lightGeometry,
671bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck                 Caches& caches);
689cd1bbe5c9e14472e631d8cc10005613925f34afChris Craik
699cd1bbe5c9e14472e631d8cc10005613925f34afChris Craik    void deferLayers(const LayerUpdateQueue& layers);
709cd1bbe5c9e14472e631d8cc10005613925f34afChris Craik
719cd1bbe5c9e14472e631d8cc10005613925f34afChris Craik    void deferRenderNode(RenderNode& renderNode);
729cd1bbe5c9e14472e631d8cc10005613925f34afChris Craik
739cd1bbe5c9e14472e631d8cc10005613925f34afChris Craik    void deferRenderNode(float tx, float ty, Rect clipRect, RenderNode& renderNode);
749cd1bbe5c9e14472e631d8cc10005613925f34afChris Craik
751bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    void deferRenderNodeScene(const std::vector<sp<RenderNode> >& nodes,
761bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck                              const Rect& contentDrawBounds);
77c3bd56811268a074ffb9513bde0d940199e7ad16Chong Zhang
78f158b49c888f722194afe5a80539a2b020c130bcChris Craik    virtual ~FrameBuilder() {}
79b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
80b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    /**
816fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik     * replayBakedOps() is templated based on what class will receive ops being replayed.
82b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik     *
83b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik     * It constructs a lookup array of lambdas, which allows a recorded BakeOpState to use
84b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik     * state->op->opId to lookup a receiver that will be called when the op is replayed.
85b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik     */
865854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik    template <typename StaticDispatcher, typename Renderer>
875854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik    void replayBakedOps(Renderer& renderer) {
8874af6e282f8a8f75928a071e8200039517cf5c12Chris Craik        std::vector<OffscreenBuffer*> temporaryLayers;
893a5811b50157e7ba50854caf957e806aee794d39Chris Craik        finishDefer();
901bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck/**
911bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck * Defines a LUT of lambdas which allow a recorded BakedOpState to use state->op->opId to
921bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck * dispatch the op via a method on a static dispatcher when the op is replayed.
931bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck *
941bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck * For example a BitmapOp would resolve, via the lambda lookup, to calling:
951bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck *
961bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck * StaticDispatcher::onBitmapOp(Renderer& renderer, const BitmapOp& op, const BakedOpState& state);
971bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck */
981bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck#define X(Type)                                                                   \
991bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    [](void* renderer, const BakedOpState& state) {                               \
1001bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck        StaticDispatcher::on##Type(*(static_cast<Renderer*>(renderer)),           \
1011bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck                                   static_cast<const Type&>(*(state.op)), state); \
1021bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    },
1037cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik        static BakedOpReceiver unmergedReceivers[] = BUILD_RENDERABLE_OP_LUT(X);
1041bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck#undef X
1051bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck
1061bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck/**
1071bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck * Defines a LUT of lambdas which allow merged arrays of BakedOpState* to be passed to a
1081bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck * static dispatcher when the group of merged ops is replayed.
1091bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck */
1101bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck#define X(Type)                                                                           \
1111bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    [](void* renderer, const MergedBakedOpList& opList) {                                 \
1121bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck        StaticDispatcher::onMerged##Type##s(*(static_cast<Renderer*>(renderer)), opList); \
1131bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    },
1147cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik        static MergedOpReceiver mergedReceivers[] = BUILD_MERGEABLE_OP_LUT(X);
1151bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck#undef X
116818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik
117818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik        // Relay through layers in reverse order, since layers
118818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik        // later in the list will be drawn by earlier ones
119f158b49c888f722194afe5a80539a2b020c130bcChris Craik        for (int i = mLayerBuilders.size() - 1; i >= 1; i--) {
120975591a7af883d866d86ab819e164c6004694744John Reck            GL_CHECKPOINT(MODERATE);
121f158b49c888f722194afe5a80539a2b020c130bcChris Craik            LayerBuilder& layer = *(mLayerBuilders[i]);
1220b7e8245db728d127ada698be63d78b33fc6e4daChris Craik            if (layer.renderNode) {
1230b7e8245db728d127ada698be63d78b33fc6e4daChris Craik                // cached HW layer - can't skip layer if empty
12498787e6c9b2c10b1ab7820bdac168686025b924aChris Craik                renderer.startRepaintLayer(layer.offscreenBuffer, layer.repaintRect);
125975591a7af883d866d86ab819e164c6004694744John Reck                GL_CHECKPOINT(MODERATE);
12615c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik                layer.replayBakedOpsImpl((void*)&renderer, unmergedReceivers, mergedReceivers);
127975591a7af883d866d86ab819e164c6004694744John Reck                GL_CHECKPOINT(MODERATE);
1280b7e8245db728d127ada698be63d78b33fc6e4daChris Craik                renderer.endLayer();
129c0f3f2f8c0c2fa97099e5f3c5e3860653ce0f261Chris Craik            } else if (!layer.empty()) {
130c0f3f2f8c0c2fa97099e5f3c5e3860653ce0f261Chris Craik                // save layer - skip entire layer if empty (in which case, LayerOp has null layer).
131d3daa3198e2212c985c634821682d5819346b653Chris Craik                layer.offscreenBuffer = renderer.startTemporaryLayer(layer.width, layer.height);
13274af6e282f8a8f75928a071e8200039517cf5c12Chris Craik                temporaryLayers.push_back(layer.offscreenBuffer);
133975591a7af883d866d86ab819e164c6004694744John Reck                GL_CHECKPOINT(MODERATE);
13415c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik                layer.replayBakedOpsImpl((void*)&renderer, unmergedReceivers, mergedReceivers);
135975591a7af883d866d86ab819e164c6004694744John Reck                GL_CHECKPOINT(MODERATE);
1365854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik                renderer.endLayer();
137818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik            }
138818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik        }
139818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik
140975591a7af883d866d86ab819e164c6004694744John Reck        GL_CHECKPOINT(MODERATE);
1416246d27813f25b85f6e4b5cb1121fe8484bcce2dChris Craik        if (CC_LIKELY(mDrawFbo0)) {
1426246d27813f25b85f6e4b5cb1121fe8484bcce2dChris Craik            const LayerBuilder& fbo0 = *(mLayerBuilders[0]);
1436246d27813f25b85f6e4b5cb1121fe8484bcce2dChris Craik            renderer.startFrame(fbo0.width, fbo0.height, fbo0.repaintRect);
1446246d27813f25b85f6e4b5cb1121fe8484bcce2dChris Craik            GL_CHECKPOINT(MODERATE);
1456246d27813f25b85f6e4b5cb1121fe8484bcce2dChris Craik            fbo0.replayBakedOpsImpl((void*)&renderer, unmergedReceivers, mergedReceivers);
1466246d27813f25b85f6e4b5cb1121fe8484bcce2dChris Craik            GL_CHECKPOINT(MODERATE);
1476246d27813f25b85f6e4b5cb1121fe8484bcce2dChris Craik            renderer.endFrame(fbo0.repaintRect);
1486246d27813f25b85f6e4b5cb1121fe8484bcce2dChris Craik        }
14974af6e282f8a8f75928a071e8200039517cf5c12Chris Craik
15074af6e282f8a8f75928a071e8200039517cf5c12Chris Craik        for (auto& temporaryLayer : temporaryLayers) {
15174af6e282f8a8f75928a071e8200039517cf5c12Chris Craik            renderer.recycleTemporaryLayer(temporaryLayer);
15274af6e282f8a8f75928a071e8200039517cf5c12Chris Craik        }
1536fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik    }
1546fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik
1556fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik    void dump() const {
156f158b49c888f722194afe5a80539a2b020c130bcChris Craik        for (auto&& layer : mLayerBuilders) {
15784ad6149db0e1dc98ed3778ee4fc2ab685765d9aChris Craik            layer->dump();
1586fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik        }
159b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    }
1606fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik
1616fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik    ///////////////////////////////////////////////////////////////////
1626fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik    /// CanvasStateClient interface
1636fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik    ///////////////////////////////////////////////////////////////////
1646fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik    virtual void onViewportInitialized() override;
1656fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik    virtual void onSnapshotRestored(const Snapshot& removed, const Snapshot& restored) override;
1666fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik    virtual GLuint getTargetFbo() const override { return 0; }
1676fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik
168b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikprivate:
1693a5811b50157e7ba50854caf957e806aee794d39Chris Craik    void finishDefer();
1701bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    enum class ChildrenSelectMode { Negative, Positive };
1711bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    void saveForLayer(uint32_t layerWidth, uint32_t layerHeight, float contentTranslateX,
1721bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck                      float contentTranslateY, const Rect& repaintRect, const Vector3& lightCenter,
1731bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck                      const BeginLayerOp* beginLayerOp, RenderNode* renderNode);
1740b7e8245db728d127ada698be63d78b33fc6e4daChris Craik    void restoreForLayer();
1750b7e8245db728d127ada698be63d78b33fc6e4daChris Craik
176f158b49c888f722194afe5a80539a2b020c130bcChris Craik    LayerBuilder& currentLayer() { return *(mLayerBuilders[mLayerStack.back()]); }
1776fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik
1786fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik    BakedOpState* tryBakeOpState(const RecordedOp& recordedOp) {
179e4db79de127cfe961195f52907af8451026eaa20Chris Craik        return BakedOpState::tryConstruct(mAllocator, *mCanvasState.writableSnapshot(), recordedOp);
1806fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik    }
1814c3980b6e43cc7c0541f54b8e7e2d9d6108be622Chris Craik    BakedOpState* tryBakeUnboundedOpState(const RecordedOp& recordedOp) {
1821bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck        return BakedOpState::tryConstructUnbounded(mAllocator, *mCanvasState.writableSnapshot(),
1831bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck                                                   recordedOp);
1844c3980b6e43cc7c0541f54b8e7e2d9d6108be622Chris Craik    }
1854c3980b6e43cc7c0541f54b8e7e2d9d6108be622Chris Craik
1868d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik    // should always be surrounded by a save/restore pair, and not called if DisplayList is null
1870b7e8245db728d127ada698be63d78b33fc6e4daChris Craik    void deferNodePropsAndOps(RenderNode& node);
1880b7e8245db728d127ada698be63d78b33fc6e4daChris Craik
1898d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik    template <typename V>
190d645640180c25c2711e99aa82ec629155f8e91baChris Craik    void defer3dChildren(const ClipBase* reorderClip, ChildrenSelectMode mode,
1911bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck                         const V& zTranslatedNodes);
1928d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik
193d645640180c25c2711e99aa82ec629155f8e91baChris Craik    void deferShadow(const ClipBase* reorderClip, const RenderNodeOp& casterOp);
194161f54b2d4160b8d3f3da9eba5746da5162e4821Chris Craik
1958d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik    void deferProjectedChildren(const RenderNode& renderNode);
196b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
1978d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik    void deferNodeOps(const RenderNode& renderNode);
198161f54b2d4160b8d3f3da9eba5746da5162e4821Chris Craik
199268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik    void deferRenderNodeOpImpl(const RenderNodeOp& op);
200161f54b2d4160b8d3f3da9eba5746da5162e4821Chris Craik
20115c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik    void replayBakedOpsImpl(void* arg, BakedOpReceiver* receivers);
202b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
2031bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    SkPath* createFrameAllocatedPath() { return mAllocator.create<SkPath>(); }
204386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik
20580d2ade939153da87b3cd3b0a69a713bf68b64baChris Craik    BakedOpState* deferStrokeableOp(const RecordedOp& op, batchid_t batchId,
2061bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck                                    BakedOpState::StrokeBehavior strokeBehavior =
2071bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck                                            BakedOpState::StrokeBehavior::StyleDefined,
2081bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck                                    bool expandForPathTexture = false);
209386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik
2101bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck/**
2111bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck * Declares all FrameBuilder::deferXXXXOp() methods for every RecordedOp type.
2121bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck *
2131bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck * These private methods are called from within deferImpl to defer each individual op
2141bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck * type differently.
2151bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck */
2167cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik#define X(Type) void defer##Type(const Type& op);
2177cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik    MAP_DEFERRABLE_OPS(X)
2187cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik#undef X
219b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
2209cd1bbe5c9e14472e631d8cc10005613925f34afChris Craik    // contains single-frame objects, such as BakedOpStates, LayerBuilders, Batches
2219cd1bbe5c9e14472e631d8cc10005613925f34afChris Craik    LinearAllocator mAllocator;
2229cd1bbe5c9e14472e631d8cc10005613925f34afChris Craik    LinearStdAllocator<void*> mStdAllocator;
2239cd1bbe5c9e14472e631d8cc10005613925f34afChris Craik
2246fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik    // List of every deferred layer's render state. Replayed in reverse order to render a frame.
2259cd1bbe5c9e14472e631d8cc10005613925f34afChris Craik    LsaVector<LayerBuilder*> mLayerBuilders;
226b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
2276fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik    /*
228f158b49c888f722194afe5a80539a2b020c130bcChris Craik     * Stack of indices within mLayerBuilders representing currently active layers. If drawing
2296fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik     * layerA within a layerB, will contain, in order:
2306fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik     *  - 0 (representing FBO 0, always present)
2316fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik     *  - layerB's index
2326fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik     *  - layerA's index
2336fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik     *
234f158b49c888f722194afe5a80539a2b020c130bcChris Craik     * Note that this doesn't vector doesn't always map onto all values of mLayerBuilders. When a
235f158b49c888f722194afe5a80539a2b020c130bcChris Craik     * layer is finished deferring, it will still be represented in mLayerBuilders, but it's index
2366fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik     * won't be in mLayerStack. This is because it can be replayed, but can't have any more drawing
2376fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik     * ops added to it.
2386fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik    */
2399cd1bbe5c9e14472e631d8cc10005613925f34afChris Craik    LsaVector<size_t> mLayerStack;
240b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
241b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    CanvasState mCanvasState;
242b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
2433a5811b50157e7ba50854caf957e806aee794d39Chris Craik    Caches& mCaches;
2446e068c0182f6f85bccb855a647510724d1c65a13Chris Craik
2456e068c0182f6f85bccb855a647510724d1c65a13Chris Craik    float mLightRadius;
2466e068c0182f6f85bccb855a647510724d1c65a13Chris Craik
2476246d27813f25b85f6e4b5cb1121fe8484bcce2dChris Craik    const bool mDrawFbo0;
248b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik};
249b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
2501bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck};  // namespace uirenderer
2511bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck};  // namespace android
252