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 #pragma once 18 19 #include <condition_variable> 20 #include <functional> 21 #include <map> 22 #include <mutex> 23 #include <thread> 24 25 #include "DrmDevice.h" 26 27 namespace android { 28 29 struct VSyncWorkerCallbacks { 30 std::function<void(uint64_t /*timestamp*/)> out_event; 31 std::function<uint32_t()> get_vperiod_ns; 32 }; 33 34 class VSyncWorker { 35 public: 36 ~VSyncWorker() = default; 37 38 auto static CreateInstance(std::shared_ptr<DrmDisplayPipeline> &pipe, 39 VSyncWorkerCallbacks &callbacks) 40 -> std::shared_ptr<VSyncWorker>; 41 42 void VSyncControl(bool enabled); 43 void StopThread(); 44 45 private: 46 VSyncWorker() = default; 47 48 void ThreadFn(const std::shared_ptr<VSyncWorker> &vsw); 49 50 int64_t GetPhasedVSync(int64_t frame_ns, int64_t current) const; 51 int SyntheticWaitVBlank(int64_t *timestamp); 52 53 VSyncWorkerCallbacks callbacks_; 54 55 SharedFd drm_fd_; 56 uint32_t high_crtc_ = 0; 57 58 bool enabled_ = false; 59 bool thread_exit_ = false; 60 int64_t last_timestamp_ = -1; 61 62 std::condition_variable cv_; 63 std::thread vswt_; 64 std::mutex mutex_; 65 }; 66 } // namespace android 67