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 */ 70f158b49c888f722194afe5a80539a2b020c130bcChris Craikclass LayerBuilder { 7184ad6149db0e1dc98ed3778ee4fc2ab685765d9aChris Craik// Prevent copy/assign because users may stash pointer to offscreenBuffer and viewportClip 72f158b49c888f722194afe5a80539a2b020c130bcChris CraikPREVENT_COPY_AND_ASSIGN(LayerBuilder); 735ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craikpublic: 74f158b49c888f722194afe5a80539a2b020c130bcChris Craik // Create LayerBuilder for Fbo0 75f158b49c888f722194afe5a80539a2b020c130bcChris Craik LayerBuilder(uint32_t width, uint32_t height, const Rect& repaintRect) 76f158b49c888f722194afe5a80539a2b020c130bcChris Craik : LayerBuilder(width, height, repaintRect, nullptr, nullptr) {}; 775ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik 78f158b49c888f722194afe5a80539a2b020c130bcChris Craik // Create LayerBuilder for an offscreen layer, where beginLayerOp is present for a 795ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik // saveLayer, renderNode is present for a HW layer. 80f158b49c888f722194afe5a80539a2b020c130bcChris Craik LayerBuilder(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 10380d2ade939153da87b3cd3b0a69a713bf68b64baChris Craik void clear(); 1045ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik 1055ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik void dump() const; 1065ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik 1075ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik const uint32_t width; 1085ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik const uint32_t height; 1095ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik const Rect repaintRect; 1104876de16e34622634266d09522c9153c78c7c2fbChris Craik const ClipRect repaintClip; 1115ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik OffscreenBuffer* offscreenBuffer; 1125ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik const BeginLayerOp* beginLayerOp; 1135ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik const RenderNode* renderNode; 1145ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik 1155ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik // list of deferred CopyFromLayer ops, to be deferred upon encountering EndUnclippedLayerOps 1165ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik std::vector<BakedOpState*> activeUnclippedSaveLayers; 1175ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craikprivate: 11880d2ade939153da87b3cd3b0a69a713bf68b64baChris Craik void onDeferOp(LinearAllocator& allocator, const BakedOpState* bakedState); 1195ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik void flushLayerClears(LinearAllocator& allocator); 1205ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik 1215ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik std::vector<BatchBase*> mBatches; 1225ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik 1235ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik /** 1245ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik * Maps the mergeid_t returned by an op's getMergeId() to the most recently seen 1255ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik * MergingDrawBatch of that id. These ids are unique per draw type and guaranteed to not 1265ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik * collide, which avoids the need to resolve mergeid collisions. 1275ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik */ 1285ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik std::unordered_map<mergeid_t, MergingOpBatch*> mMergingBatchLookup[OpBatchType::Count]; 1295ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik 1305ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik // Maps batch ids to the most recent *non-merging* batch of that id 1315ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik OpBatch* mBatchLookup[OpBatchType::Count] = { nullptr }; 1325ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik 1335ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik std::vector<Rect> mClearRects; 1345ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik}; 1355ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik 1365ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik}; // namespace uirenderer 1375ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik}; // namespace android 138