DrawFrameTask.h revision 668f0e38ef0277d55d3118af37e17b8c435df85c
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 19668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck#include <utils/Condition.h> 20668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck#include <utils/Mutex.h> 21668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck#include <utils/Vector.h> 22668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck 23668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck#include "RenderTask.h" 24668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck 25668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck#include "../Rect.h" 26668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck 27668f0e38ef0277d55d3118af37e17b8c435df85cJohn Recknamespace android { 28668f0e38ef0277d55d3118af37e17b8c435df85cJohn Recknamespace uirenderer { 29668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck 30668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reckclass DeferredLayerUpdater; 31668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reckclass DisplayListData; 32668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reckclass RenderNode; 33668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck 34668f0e38ef0277d55d3118af37e17b8c435df85cJohn Recknamespace renderthread { 35668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck 36668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reckclass CanvasContext; 37668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reckclass RenderThread; 38668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck 39668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reckstruct SetDisplayListData { 40668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck RenderNode* targetNode; 41668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck DisplayListData* newData; 42668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck}; 43668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck 44668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck/* 45668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck * This is a special Super Task. It is re-used multiple times by RenderProxy, 46668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck * and contains state (such as layer updaters & new DisplayListDatas) that is 47668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck * tracked across many frames not just a single frame. 48668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck * It is the sync-state task, and will kick off the post-sync draw 49668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck */ 50668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reckclass DrawFrameTask : public RenderTask { 51668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reckpublic: 52668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck DrawFrameTask(); 53668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck virtual ~DrawFrameTask(); 54668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck 55668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck void setContext(CanvasContext* context); 56668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck 57668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck void setDisplayListData(RenderNode* renderNode, DisplayListData* newData); 58668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck void addLayer(DeferredLayerUpdater* layer); 59668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck void removeLayer(DeferredLayerUpdater* layer); 60668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck 61668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck void setRenderNode(RenderNode* renderNode); 62668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck void setDirty(int left, int top, int right, int bottom); 63668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck void drawFrame(RenderThread* renderThread); 64668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck 65668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck virtual void run(); 66668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck 67668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reckprivate: 68668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck void syncFrameState(); 69668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck void unblockUiThread(); 70668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck static void drawRenderNode(CanvasContext* context, RenderNode* renderNode, Rect* dirty); 71668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck 72668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck // This checks to see if there are any drawGlFunctors which would require 73668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck // a synchronous drawRenderNode() 74668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck static bool requiresSynchronousDraw(RenderNode* renderNode); 75668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck 76668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck Mutex mLock; 77668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck Condition mSignal; 78668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck 79668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck CanvasContext* mContext; 80668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck 81668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck /********************************************* 82668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck * Single frame data 83668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck *********************************************/ 84668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck RenderNode* mRenderNode; 85668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck Rect mDirty; 86668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck Vector<SetDisplayListData> mDisplayListDataUpdates; 87668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck 88668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck /********************************************* 89668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck * Multi frame data 90668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck *********************************************/ 91668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck Vector<DeferredLayerUpdater*> mLayers; 92668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck}; 93668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck 94668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck} /* namespace renderthread */ 95668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck} /* namespace uirenderer */ 96668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck} /* namespace android */ 97668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck 98668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck#endif /* DRAWFRAMETASK_H */ 99