DeferredDisplayList.h revision 527a3aace1dd72432c2e0472a570e030ad04bf16
1c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik/* 2c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik * Copyright (C) 2013 The Android Open Source Project 3c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik * 4c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik * Licensed under the Apache License, Version 2.0 (the "License"); 5c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik * you may not use this file except in compliance with the License. 6c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik * You may obtain a copy of the License at 7c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik * 8c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik * http://www.apache.org/licenses/LICENSE-2.0 9c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik * 10c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik * Unless required by applicable law or agreed to in writing, software 11c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik * distributed under the License is distributed on an "AS IS" BASIS, 12c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik * See the License for the specific language governing permissions and 14c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik * limitations under the License. 15c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik */ 16c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik 17c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik#ifndef ANDROID_HWUI_DEFERRED_DISPLAY_LIST_H 18c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik#define ANDROID_HWUI_DEFERRED_DISPLAY_LIST_H 19c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik 20c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik#include <utils/Errors.h> 21c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik#include <utils/Vector.h> 22c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik 23c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik#include "Matrix.h" 24c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik#include "Rect.h" 25527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik#include "utils/TinyHashMap.h" 26527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik 27527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craikclass SkBitmap; 28c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik 29c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craiknamespace android { 30c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craiknamespace uirenderer { 31c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik 32ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craikclass ClipOp; 33c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craikclass DrawOp; 34ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craikclass SaveOp; 35ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craikclass SaveLayerOp; 36ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craikclass StateOp; 37c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craikclass OpenGLRenderer; 38c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik 39527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craikclass Batch; 40527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craikclass DrawBatch; 41527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craikclass MergingDrawBatch; 42527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik 43527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craiktypedef void* mergeid_t; 44527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik 45c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craikclass DeferredDisplayList { 46c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craikpublic: 47c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik DeferredDisplayList() { clear(); } 48c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik ~DeferredDisplayList() { clear(); } 49c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik 50c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik enum OpBatchId { 51527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik kOpBatch_None = 0, // Don't batch 52c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik kOpBatch_Bitmap, 53c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik kOpBatch_Patch, 54c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik kOpBatch_AlphaVertices, 55c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik kOpBatch_Vertices, 56c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik kOpBatch_AlphaMaskTexture, 57c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik kOpBatch_Text, 58c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik kOpBatch_ColorText, 59c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik 60c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik kOpBatch_Count, // Add other batch ids before this 61c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik }; 62c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik 63c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik bool isEmpty() { return mBatches.isEmpty(); } 64c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik 65c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik /** 66c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik * Plays back all of the draw ops recorded into batches to the renderer. 67c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik * Adjusts the state of the renderer as necessary, and restores it when complete 68c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik */ 69ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik status_t flush(OpenGLRenderer& renderer, Rect& dirty); 70ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik 71ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik void addClip(OpenGLRenderer& renderer, ClipOp* op); 72ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik void addSaveLayer(OpenGLRenderer& renderer, SaveLayerOp* op, int newSaveCount); 73ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik void addSave(OpenGLRenderer& renderer, SaveOp* op, int newSaveCount); 747273daace9303f4662444111c40bb83d3ead4a92Chris Craik void addRestoreToCount(OpenGLRenderer& renderer, StateOp* op, int newSaveCount); 75c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik 76c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik /** 77c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik * Add a draw op into the DeferredDisplayList, reordering as needed (for performance) if 78c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik * disallowReorder is false, respecting draw order when overlaps occur 79c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik */ 80ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik void addDrawOp(OpenGLRenderer& renderer, DrawOp* op); 81c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik 82c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craikprivate: 83d90144db52c7297879b950cbbc85137ed123ab5bChris Craik /** 84ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik * Resets the batching back-pointers, creating a barrier in the operation stream so that no ops 85ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik * added in the future will be inserted into a batch that already exist. 86ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik */ 87ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik void resetBatchingState(); 88ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik 891206b9bba91f7ed899c5c87427cce725fe5aadfcChris Craik void clear(); 901206b9bba91f7ed899c5c87427cce725fe5aadfcChris Craik 91ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik void storeStateOpBarrier(OpenGLRenderer& renderer, StateOp* op); 927273daace9303f4662444111c40bb83d3ead4a92Chris Craik void storeRestoreToCountBarrier(OpenGLRenderer& renderer, StateOp* op, int newSaveCount); 93ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik 94ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik bool recordingComplexClip() const { return mComplexClipStackStart >= 0; } 95ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik 96ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik int getStateOpDeferFlags() const; 97ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik int getDrawOpDeferFlags() const; 98ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik 99d90144db52c7297879b950cbbc85137ed123ab5bChris Craik /** 100d90144db52c7297879b950cbbc85137ed123ab5bChris Craik * At defer time, stores the *defer time* savecount of save/saveLayer ops that were deferred, so 101d90144db52c7297879b950cbbc85137ed123ab5bChris Craik * that when an associated restoreToCount is deferred, it can be recorded as a 102d90144db52c7297879b950cbbc85137ed123ab5bChris Craik * RestoreToCountBatch 103ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik */ 104ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik Vector<int> mSaveStack; 105ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik int mComplexClipStackStart; 106c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik 107527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik Vector<Batch*> mBatches; 108527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik 109527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik // Maps batch ids to the most recent *non-merging* batch of that id 110527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik Batch* mBatchLookup[kOpBatch_Count]; 111527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik 112527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik // Points to the index after the most recent barrier 113527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik int mEarliestBatchIndex; 114527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik 115527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik /** 116527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik * Maps the mergeid_t returned by an op's getMergeId() to the most recently seen 117527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik * MergingDrawBatch of that id. These ids are unique per draw type and guaranteed to not 118527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik * collide, which avoids the need to resolve mergeid collisions. 119527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik */ 120527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik TinyHashMap<mergeid_t, DrawBatch*> mMergingBatches[kOpBatch_Count]; 121c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik}; 122c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik 123c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik}; // namespace uirenderer 124c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik}; // namespace android 125c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik 126c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik#endif // ANDROID_HWUI_DEFERRED_DISPLAY_LIST_H 127