LayerBuilder.h revision 84ad6149db0e1dc98ed3778ee4fc2ab685765d9a
15ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik/*
25ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik * Copyright (C) 2016 The Android Open Source Project
35ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik *
45ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik * Licensed under the Apache License, Version 2.0 (the "License");
55ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik * you may not use this file except in compliance with the License.
65ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik * You may obtain a copy of the License at
75ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik *
85ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik *      http://www.apache.org/licenses/LICENSE-2.0
95ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik *
105ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik * Unless required by applicable law or agreed to in writing, software
115ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik * distributed under the License is distributed on an "AS IS" BASIS,
125ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik * See the License for the specific language governing permissions and
145ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik * limitations under the License.
155ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik */
165ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik
175ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik#pragma once
185ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik
195ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik#include "ClipArea.h"
205ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik#include "Rect.h"
2184ad6149db0e1dc98ed3778ee4fc2ab685765d9aChris Craik#include "utils/Macros.h"
225ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik
235ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik#include <vector>
245ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik#include <unordered_map>
255ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik
265ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craikstruct SkRect;
275ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik
285ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craiknamespace android {
295ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craiknamespace uirenderer {
305ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik
315ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craikclass BakedOpState;
325ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craikstruct BeginLayerOp;
335ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craikclass BatchBase;
345ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craikclass LinearAllocator;
355ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craikstruct MergedBakedOpList;
365ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craikclass MergingOpBatch;
375ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craikclass OffscreenBuffer;
385ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craikclass OpBatch;
395ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craikclass RenderNode;
405ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik
415ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craiktypedef int batchid_t;
425ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craiktypedef const void* mergeid_t;
435ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik
445ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craiknamespace OpBatchType {
455ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik    enum {
465ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik        Bitmap,
475ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik        MergedPatch,
485ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik        AlphaVertices,
495ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik        Vertices,
505ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik        AlphaMaskTexture,
515ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik        Text,
525ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik        ColorText,
535ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik        Shadow,
545ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik        TextureLayer,
555ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik        Functor,
565ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik        CopyToLayer,
575ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik        CopyFromLayer,
585ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik
595ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik        Count // must be last
605ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik    };
615ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik}
625ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik
635ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craiktypedef void (*BakedOpReceiver)(void*, const BakedOpState&);
645ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craiktypedef void (*MergedOpReceiver)(void*, const MergedBakedOpList& opList);
655ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik
665ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik/**
675ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik * Stores the deferred render operations and state used to compute ordering
685ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik * for a single FBO/layer.
695ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik */
705ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craikclass LayerReorderer {
7184ad6149db0e1dc98ed3778ee4fc2ab685765d9aChris Craik// Prevent copy/assign because users may stash pointer to offscreenBuffer and viewportClip
7284ad6149db0e1dc98ed3778ee4fc2ab685765d9aChris CraikPREVENT_COPY_AND_ASSIGN(LayerReorderer);
735ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craikpublic:
745ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik    // Create LayerReorderer for Fbo0
755ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik    LayerReorderer(uint32_t width, uint32_t height, const Rect& repaintRect)
765ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik            : LayerReorderer(width, height, repaintRect, nullptr, nullptr) {};
775ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik
785ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik    // Create LayerReorderer for an offscreen layer, where beginLayerOp is present for a
795ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik    // saveLayer, renderNode is present for a HW layer.
805ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik    LayerReorderer(uint32_t width, uint32_t height,
815ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik            const Rect& repaintRect, const BeginLayerOp* beginLayerOp, RenderNode* renderNode);
825ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik
835ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik    // iterate back toward target to see if anything drawn since should overlap the new op
845ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik    // if no target, merging ops still iterate to find similar batch to insert after
855ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik    void locateInsertIndex(int batchId, const Rect& clippedBounds,
865ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik            BatchBase** targetBatch, size_t* insertBatchIndex) const;
875ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik
885ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik    void deferUnmergeableOp(LinearAllocator& allocator, BakedOpState* op, batchid_t batchId);
895ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik
905ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik    // insertion point of a new batch, will hopefully be immediately after similar batch
915ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik    // (generally, should be similar shader)
925ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik    void deferMergeableOp(LinearAllocator& allocator,
935ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik            BakedOpState* op, batchid_t batchId, mergeid_t mergeId);
945ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik
955ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik    void replayBakedOpsImpl(void* arg, BakedOpReceiver* receivers, MergedOpReceiver*) const;
965ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik
975ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik    void deferLayerClear(const Rect& dstRect);
985ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik
995ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik    bool empty() const {
1005ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik        return mBatches.empty();
1015ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik    }
1025ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik
1035ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik    void clear() {
1045ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik        mBatches.clear();
1055ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik    }
1065ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik
1075ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik    void dump() const;
1085ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik
1095ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik    const uint32_t width;
1105ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik    const uint32_t height;
1115ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik    const Rect repaintRect;
1125ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik    OffscreenBuffer* offscreenBuffer;
1135ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik    const BeginLayerOp* beginLayerOp;
1145ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik    const RenderNode* renderNode;
1155ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik    const ClipRect viewportClip;
1165ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik
1175ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik    // list of deferred CopyFromLayer ops, to be deferred upon encountering EndUnclippedLayerOps
1185ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik    std::vector<BakedOpState*> activeUnclippedSaveLayers;
1195ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craikprivate:
1205ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik    void flushLayerClears(LinearAllocator& allocator);
1215ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik
1225ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik    std::vector<BatchBase*> mBatches;
1235ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik
1245ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik    /**
1255ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik     * Maps the mergeid_t returned by an op's getMergeId() to the most recently seen
1265ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik     * MergingDrawBatch of that id. These ids are unique per draw type and guaranteed to not
1275ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik     * collide, which avoids the need to resolve mergeid collisions.
1285ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik     */
1295ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik    std::unordered_map<mergeid_t, MergingOpBatch*> mMergingBatchLookup[OpBatchType::Count];
1305ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik
1315ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik    // Maps batch ids to the most recent *non-merging* batch of that id
1325ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik    OpBatch* mBatchLookup[OpBatchType::Count] = { nullptr };
1335ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik
1345ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik    std::vector<Rect> mClearRects;
1355ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik};
1365ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik
1375ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik}; // namespace uirenderer
1385ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik}; // namespace android
139