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 27ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck#include "../FrameInfo.h" 281bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck#include "../Rect.h" 29a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck#include "../TreeInfo.h" 30668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck 31668f0e38ef0277d55d3118af37e17b8c435df85cJohn Recknamespace android { 32668f0e38ef0277d55d3118af37e17b8c435df85cJohn Recknamespace uirenderer { 33668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck 34668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reckclass DeferredLayerUpdater; 35003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craikclass DisplayList; 36668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reckclass RenderNode; 37668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck 38668f0e38ef0277d55d3118af37e17b8c435df85cJohn Recknamespace renderthread { 39668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck 40668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reckclass CanvasContext; 41668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reckclass RenderThread; 42668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck 439a17da8125c36c82ba73e7f4b3ed80b9c633767fJohn Recknamespace SyncResult { 449a17da8125c36c82ba73e7f4b3ed80b9c633767fJohn Reckenum { 459a17da8125c36c82ba73e7f4b3ed80b9c633767fJohn Reck OK = 0, 469a17da8125c36c82ba73e7f4b3ed80b9c633767fJohn Reck UIRedrawRequired = 1 << 0, 479a17da8125c36c82ba73e7f4b3ed80b9c633767fJohn Reck LostSurfaceRewardIfFound = 1 << 1, 489a17da8125c36c82ba73e7f4b3ed80b9c633767fJohn Reck ContextIsStopped = 1 << 2, 495b02c629bd8da951331e5e464fe78e03b3393a72John Reck FrameDropped = 1 << 3, 50f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck}; 519a17da8125c36c82ba73e7f4b3ed80b9c633767fJohn Reck} 52f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck 53668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck/* 54668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck * This is a special Super Task. It is re-used multiple times by RenderProxy, 55003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik * and contains state (such as layer updaters & new DisplayLists) that is 56668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck * tracked across many frames not just a single frame. 57668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck * It is the sync-state task, and will kick off the post-sync draw 58668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck */ 59f8441e65526cd1721f1ad77dad21b1a1e2743d76John Reckclass DrawFrameTask { 60668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reckpublic: 61668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck DrawFrameTask(); 62668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck virtual ~DrawFrameTask(); 63668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck 64ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne void setContext(RenderThread* thread, CanvasContext* context, RenderNode* targetNode); 65f138b174fdbbfe73572148f09da7f00ab5261dc4John Reck void setContentDrawBounds(int left, int top, int right, int bottom) { 66f138b174fdbbfe73572148f09da7f00ab5261dc4John Reck mContentDrawBounds.set(left, top, right, bottom); 67f138b174fdbbfe73572148f09da7f00ab5261dc4John Reck } 68668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck 69d72e0a339b54af0c4e731513bbad120dff694723John Reck void pushLayerUpdate(DeferredLayerUpdater* layer); 70d72e0a339b54af0c4e731513bbad120dff694723John Reck void removeLayerUpdate(DeferredLayerUpdater* layer); 71668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck 722de950d5a8b47c7b4648ada1b1260ce4b7342798John Reck int drawFrame(); 73ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck 74ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck int64_t* frameInfo() { return mFrameInfo; } 75668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck 76f8441e65526cd1721f1ad77dad21b1a1e2743d76John Reck void run(); 77668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck 789568800d90e917e28ae2bc4ae1ca5dcaaf60675bMihai Popa void setFrameCallback(std::function<void(int64_t)>&& callback) { 799568800d90e917e28ae2bc4ae1ca5dcaaf60675bMihai Popa mFrameCallback = std::move(callback); 809568800d90e917e28ae2bc4ae1ca5dcaaf60675bMihai Popa } 819568800d90e917e28ae2bc4ae1ca5dcaaf60675bMihai Popa 825b02c629bd8da951331e5e464fe78e03b3393a72John Reck void setFrameCompleteCallback(std::function<void(int64_t)>&& callback) { 835b02c629bd8da951331e5e464fe78e03b3393a72John Reck mFrameCompleteCallback = std::move(callback); 845b02c629bd8da951331e5e464fe78e03b3393a72John Reck } 855b02c629bd8da951331e5e464fe78e03b3393a72John Reck 86668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reckprivate: 8718f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck void postAndWait(); 88a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck bool syncFrameState(TreeInfo& info); 89668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck void unblockUiThread(); 90668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck 91668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck Mutex mLock; 92668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck Condition mSignal; 93668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck 9418f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck RenderThread* mRenderThread; 95668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck CanvasContext* mContext; 96ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne RenderNode* mTargetNode = nullptr; 97f138b174fdbbfe73572148f09da7f00ab5261dc4John Reck Rect mContentDrawBounds; 98668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck 99668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck /********************************************* 100668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck * Single frame data 101668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck *********************************************/ 1021bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck std::vector<sp<DeferredLayerUpdater> > mLayers; 103668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck 104f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck int mSyncResult; 105be3fba05e823f740f65b2679929347dc3dd282adJohn Reck int64_t mSyncQueued; 106ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck 107ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck int64_t mFrameInfo[UI_THREAD_FRAME_INFO_SIZE]; 1089568800d90e917e28ae2bc4ae1ca5dcaaf60675bMihai Popa 1099568800d90e917e28ae2bc4ae1ca5dcaaf60675bMihai Popa std::function<void(int64_t)> mFrameCallback; 1105b02c629bd8da951331e5e464fe78e03b3393a72John Reck std::function<void(int64_t)> mFrameCompleteCallback; 111668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck}; 112668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck 113668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck} /* namespace renderthread */ 114668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck} /* namespace uirenderer */ 115668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck} /* namespace android */ 116668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck 117668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck#endif /* DRAWFRAMETASK_H */ 118