DeferredDisplayList.h revision ff78583d8a73ca35ce65b5d2592570ff6fb9901b
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"
25c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik
26c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craiknamespace android {
27c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craiknamespace uirenderer {
28c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik
29ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craikclass ClipOp;
30c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craikclass DrawOp;
31ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craikclass SaveOp;
32ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craikclass SaveLayerOp;
33ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craikclass StateOp;
34c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craikclass DrawOpBatch;
35c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craikclass OpenGLRenderer;
36c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik
37c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craikclass DeferredDisplayList {
38c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craikpublic:
39c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik    DeferredDisplayList() { clear(); }
40c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik    ~DeferredDisplayList() { clear(); }
41c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik
42c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik    enum OpBatchId {
43c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik        kOpBatch_None = -1, // Don't batch
44c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik        kOpBatch_Bitmap,
45c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik        kOpBatch_Patch,
46c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik        kOpBatch_AlphaVertices,
47c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik        kOpBatch_Vertices,
48c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik        kOpBatch_AlphaMaskTexture,
49c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik        kOpBatch_Text,
50c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik        kOpBatch_ColorText,
51c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik
52c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik        kOpBatch_Count, // Add other batch ids before this
53c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik    };
54c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik
55c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik    bool isEmpty() { return mBatches.isEmpty(); }
56c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik
57c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik    /**
58c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik     * Plays back all of the draw ops recorded into batches to the renderer.
59c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik     * Adjusts the state of the renderer as necessary, and restores it when complete
60c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik     */
61ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    status_t flush(OpenGLRenderer& renderer, Rect& dirty);
62ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik
63ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    void addClip(OpenGLRenderer& renderer, ClipOp* op);
64ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    void addSaveLayer(OpenGLRenderer& renderer, SaveLayerOp* op, int newSaveCount);
65ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    void addSave(OpenGLRenderer& renderer, SaveOp* op, int newSaveCount);
66ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    void addRestoreToCount(OpenGLRenderer& renderer, int newSaveCount);
67c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik
68c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik    /**
69c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik     * Add a draw op into the DeferredDisplayList, reordering as needed (for performance) if
70c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik     * disallowReorder is false, respecting draw order when overlaps occur
71c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik     */
72ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    void addDrawOp(OpenGLRenderer& renderer, DrawOp* op);
73c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik
74c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craikprivate:
75ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    /*
76ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik     * Resets the batching back-pointers, creating a barrier in the operation stream so that no ops
77ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik     * added in the future will be inserted into a batch that already exist.
78ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik     */
79ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    void resetBatchingState();
80ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik
81c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik    void clear();
82c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik
83ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    void storeStateOpBarrier(OpenGLRenderer& renderer, StateOp* op);
84ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    void storeRestoreToCountBarrier(int newSaveCount);
85ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik
86ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    bool recordingComplexClip() const { return mComplexClipStackStart >= 0; }
87ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik
88ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    int getStateOpDeferFlags() const;
89ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    int getDrawOpDeferFlags() const;
90ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik
91ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    /*
92ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik     *
93ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik     * at defer time, stores the savecount of save/saveLayer ops that were
94ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik     */
95ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    Vector<int> mSaveStack;
96ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    int mComplexClipStackStart;
97c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik
98c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik    Vector<DrawOpBatch*> mBatches;
99c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik    int mBatchIndices[kOpBatch_Count];
100c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik};
101c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik
102c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik}; // namespace uirenderer
103c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik}; // namespace android
104c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik
105c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik#endif // ANDROID_HWUI_DEFERRED_DISPLAY_LIST_H
106