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