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