1 /*
2  * Copyright (C) 2015 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef ANDROID_EVENT_WORKER_H_
18 #define ANDROID_EVENT_WORKER_H_
19 
20 #include <hardware/hardware.h>
21 #include <hardware/hwcomposer.h>
22 #include <stdint.h>
23 #include <utils/String8.h>
24 
25 #include <map>
26 
27 #include "drmdevice.h"
28 #include "worker.h"
29 
30 namespace android {
31 
32 class VsyncCallback {
33     public:
~VsyncCallback()34         virtual ~VsyncCallback() {}
35         virtual void Callback(int display, int64_t timestamp) = 0;
36 };
37 
38 class VSyncWorker : public Worker {
39     public:
40         VSyncWorker();
41         ~VSyncWorker() override;
42 
43         int Init(DrmDevice* drm, int display, const String8& displayTraceName);
44         void RegisterCallback(std::shared_ptr<VsyncCallback> callback);
45 
46         void VSyncControl(bool enabled);
47 
48     protected:
49         void Routine() override;
50 
51     private:
52         int GetPhasedVSync(uint32_t vsyncPeriodNs, int64_t& expectTimeNs);
53         int SyntheticWaitVBlank(int64_t& timestamp);
54 
55         DrmDevice* mDrmDevice;
56 
57         // shared_ptr since we need to use this outside of the thread lock (to
58         // actually call the hook) and we don't want the memory freed until we're
59         // done
60         std::shared_ptr<VsyncCallback> mCallback = NULL;
61 
62         int mDisplay;
63         std::atomic_bool mEnabled;
64         int64_t mLastTimestampNs;
65         String8 mHwVsyncPeriodTag;
66         String8 mHwVsyncEnabledTag;
67         String8 mDisplayTraceName;
68 };
69 }  // namespace android
70 
71 #endif
72