DrawFrameTask.h revision d72e0a339b54af0c4e731513bbad120dff694723
1668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck/* 2668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck * Copyright (C) 2014 The Android Open Source Project 3668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck * 4668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck * Licensed under the Apache License, Version 2.0 (the "License"); 5668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck * you may not use this file except in compliance with the License. 6668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck * You may obtain a copy of the License at 7668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck * 8668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck * http://www.apache.org/licenses/LICENSE-2.0 9668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck * 10668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck * Unless required by applicable law or agreed to in writing, software 11668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck * distributed under the License is distributed on an "AS IS" BASIS, 12668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck * See the License for the specific language governing permissions and 14668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck * limitations under the License. 15668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck */ 16668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck#ifndef DRAWFRAMETASK_H 17668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck#define DRAWFRAMETASK_H 18668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck 19d72e0a339b54af0c4e731513bbad120dff694723John Reck#include <vector> 20d72e0a339b54af0c4e731513bbad120dff694723John Reck 21668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck#include <utils/Condition.h> 22668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck#include <utils/Mutex.h> 23087bc0c14bdccf7c258dce0cdef46a69a839b427John Reck#include <utils/StrongPointer.h> 24668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck 25668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck#include "RenderTask.h" 26668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck 27668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck#include "../Rect.h" 28a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck#include "../TreeInfo.h" 29668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck 30668f0e38ef0277d55d3118af37e17b8c435df85cJohn Recknamespace android { 31668f0e38ef0277d55d3118af37e17b8c435df85cJohn Recknamespace uirenderer { 32668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck 33668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reckclass DeferredLayerUpdater; 34668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reckclass DisplayListData; 35668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reckclass RenderNode; 36668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck 37668f0e38ef0277d55d3118af37e17b8c435df85cJohn Recknamespace renderthread { 38668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck 39668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reckclass CanvasContext; 40668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reckclass RenderThread; 41668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck 42f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reckenum SyncResult { 43f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck kSync_OK = 0, 44f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck kSync_UIRedrawRequired = 1 << 1, 45f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck}; 46f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck 47668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck/* 48668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck * This is a special Super Task. It is re-used multiple times by RenderProxy, 49668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck * and contains state (such as layer updaters & new DisplayListDatas) that is 50668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck * tracked across many frames not just a single frame. 51668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck * It is the sync-state task, and will kick off the post-sync draw 52668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck */ 53668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reckclass DrawFrameTask : public RenderTask { 54668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reckpublic: 55668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck DrawFrameTask(); 56668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck virtual ~DrawFrameTask(); 57668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck 5818f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck void setContext(RenderThread* thread, CanvasContext* context); 59668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck 60d72e0a339b54af0c4e731513bbad120dff694723John Reck void pushLayerUpdate(DeferredLayerUpdater* layer); 61d72e0a339b54af0c4e731513bbad120dff694723John Reck void removeLayerUpdate(DeferredLayerUpdater* layer); 62668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck 63668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck void setDirty(int left, int top, int right, int bottom); 64fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck void setDensity(float density) { mDensity = density; } 65fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck int drawFrame(nsecs_t frameTimeNanos, nsecs_t recordDurationNanos); 66668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck 67668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck virtual void run(); 68668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck 69668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reckprivate: 7018f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck void postAndWait(); 71a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck bool syncFrameState(TreeInfo& info); 72668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck void unblockUiThread(); 73668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck 74668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck Mutex mLock; 75668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck Condition mSignal; 76668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck 7718f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck RenderThread* mRenderThread; 78668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck CanvasContext* mContext; 79668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck 80668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck /********************************************* 81668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck * Single frame data 82668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck *********************************************/ 83668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck Rect mDirty; 8418f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck nsecs_t mFrameTimeNanos; 85fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck nsecs_t mRecordDurationNanos; 86fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck float mDensity; 87d72e0a339b54af0c4e731513bbad120dff694723John Reck std::vector< sp<DeferredLayerUpdater> > mLayers; 88668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck 89f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck int mSyncResult; 90668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck}; 91668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck 92668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck} /* namespace renderthread */ 93668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck} /* namespace uirenderer */ 94668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck} /* namespace android */ 95668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck 96668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck#endif /* DRAWFRAMETASK_H */ 97