DeferredDisplayList.h revision d90144db52c7297879b950cbbc85137ed123ab5b
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: 75d90144db52c7297879b950cbbc85137ed123ab5bChris 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 91d90144db52c7297879b950cbbc85137ed123ab5bChris Craik /** 92d90144db52c7297879b950cbbc85137ed123ab5bChris Craik * At defer time, stores the *defer time* savecount of save/saveLayer ops that were deferred, so 93d90144db52c7297879b950cbbc85137ed123ab5bChris Craik * that when an associated restoreToCount is deferred, it can be recorded as a 94d90144db52c7297879b950cbbc85137ed123ab5bChris Craik * RestoreToCountBatch 95ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik */ 96ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik Vector<int> mSaveStack; 97ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik int mComplexClipStackStart; 98c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik 99c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik Vector<DrawOpBatch*> mBatches; 100c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik int mBatchIndices[kOpBatch_Count]; 101c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik}; 102c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik 103c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik}; // namespace uirenderer 104c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik}; // namespace android 105c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik 106c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik#endif // ANDROID_HWUI_DEFERRED_DISPLAY_LIST_H 107