DrawFrameTask.h revision 51f2d606dcbfba3cc5b03dfea37c1304b91c232f
127c174483a8ae9688d5d4897c19074f62c7f1701James Dong/* 227c174483a8ae9688d5d4897c19074f62c7f1701James Dong * Copyright (C) 2014 The Android Open Source Project 327c174483a8ae9688d5d4897c19074f62c7f1701James Dong * 427c174483a8ae9688d5d4897c19074f62c7f1701James Dong * Licensed under the Apache License, Version 2.0 (the "License"); 527c174483a8ae9688d5d4897c19074f62c7f1701James Dong * you may not use this file except in compliance with the License. 627c174483a8ae9688d5d4897c19074f62c7f1701James Dong * You may obtain a copy of the License at 727c174483a8ae9688d5d4897c19074f62c7f1701James Dong * 827c174483a8ae9688d5d4897c19074f62c7f1701James Dong * http://www.apache.org/licenses/LICENSE-2.0 927c174483a8ae9688d5d4897c19074f62c7f1701James Dong * 1027c174483a8ae9688d5d4897c19074f62c7f1701James Dong * Unless required by applicable law or agreed to in writing, software 1127c174483a8ae9688d5d4897c19074f62c7f1701James Dong * distributed under the License is distributed on an "AS IS" BASIS, 1227c174483a8ae9688d5d4897c19074f62c7f1701James Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1327c174483a8ae9688d5d4897c19074f62c7f1701James Dong * See the License for the specific language governing permissions and 1427c174483a8ae9688d5d4897c19074f62c7f1701James Dong * limitations under the License. 1527c174483a8ae9688d5d4897c19074f62c7f1701James Dong */ 1627c174483a8ae9688d5d4897c19074f62c7f1701James Dong#ifndef DRAWFRAMETASK_H 17f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#define DRAWFRAMETASK_H 18f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 19f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <vector> 20f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 21f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <utils/Condition.h> 22f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <utils/Mutex.h> 23f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <utils/StrongPointer.h> 24f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 25f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "RenderTask.h" 26f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 27f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "../Rect.h" 28f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "../FrameInfo.h" 297cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden#include "../TreeInfo.h" 30afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber 31f933441648ef6a71dee783d733aac17b9508b452Andreas Hubernamespace android { 321173118eace0e9e347cb007f0da817cee87579edGlenn Kastennamespace uirenderer { 33f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 341065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huberclass DeferredLayerUpdater; 35f933441648ef6a71dee783d733aac17b9508b452Andreas Huberclass DisplayList; 363a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huberclass RenderNode; 373a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber 3897358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryunamespace renderthread { 39f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4097358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryuclass CanvasContext; 41f933441648ef6a71dee783d733aac17b9508b452Andreas Huberclass RenderThread; 42496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 43496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huberenum SyncResult { 44f933441648ef6a71dee783d733aac17b9508b452Andreas Huber kSync_OK = 0, 45f933441648ef6a71dee783d733aac17b9508b452Andreas Huber kSync_UIRedrawRequired = 1 << 0, 46f933441648ef6a71dee783d733aac17b9508b452Andreas Huber kSync_LostSurfaceRewardIfFound = 1 << 1, 47f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 48f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 49f933441648ef6a71dee783d733aac17b9508b452Andreas Huber/* 50f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * This is a special Super Task. It is re-used multiple times by RenderProxy, 51f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * and contains state (such as layer updaters & new DisplayLists) that is 52f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * tracked across many frames not just a single frame. 53f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * It is the sync-state task, and will kick off the post-sync draw 54f933441648ef6a71dee783d733aac17b9508b452Andreas Huber */ 55f933441648ef6a71dee783d733aac17b9508b452Andreas Huberclass DrawFrameTask : public RenderTask { 56f933441648ef6a71dee783d733aac17b9508b452Andreas Huberpublic: 57f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DrawFrameTask(); 58f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual ~DrawFrameTask(); 59f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 60f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void setContext(RenderThread* thread, CanvasContext* context, RenderNode* targetNode); 61f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 62f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void pushLayerUpdate(DeferredLayerUpdater* layer); 63f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void removeLayerUpdate(DeferredLayerUpdater* layer); 64f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 65f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int drawFrame(TreeObserver* observer); 66f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 67f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t* frameInfo() { return mFrameInfo; } 68f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 69f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void run() override; 70f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 71f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 72f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void postAndWait(); 73f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool syncFrameState(TreeInfo& info); 74f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void unblockUiThread(); 75f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 76f933441648ef6a71dee783d733aac17b9508b452Andreas Huber Mutex mLock; 77f933441648ef6a71dee783d733aac17b9508b452Andreas Huber Condition mSignal; 78f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 79f933441648ef6a71dee783d733aac17b9508b452Andreas Huber RenderThread* mRenderThread; 80f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CanvasContext* mContext; 81f933441648ef6a71dee783d733aac17b9508b452Andreas Huber RenderNode* mTargetNode = nullptr; 82f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 83f933441648ef6a71dee783d733aac17b9508b452Andreas Huber /********************************************* 84f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * Single frame data 85f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *********************************************/ 86f933441648ef6a71dee783d733aac17b9508b452Andreas Huber std::vector< sp<DeferredLayerUpdater> > mLayers; 87f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 88f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int mSyncResult; 89f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t mSyncQueued; 90f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TreeObserver* mObserver; 91f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 92f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t mFrameInfo[UI_THREAD_FRAME_INFO_SIZE]; 93f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 94f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 95f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} /* namespace renderthread */ 96f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} /* namespace uirenderer */ 97f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} /* namespace android */ 98f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 99f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif /* DRAWFRAMETASK_H */ 100f933441648ef6a71dee783d733aac17b9508b452Andreas Huber