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