1 #ifndef ANDROID_DVR_SERVICES_DISPLAYD_VSYNC_SERVICE_H_ 2 #define ANDROID_DVR_SERVICES_DISPLAYD_VSYNC_SERVICE_H_ 3 4 #include <pdx/service.h> 5 6 #include <list> 7 #include <memory> 8 #include <mutex> 9 #include <thread> 10 11 #include "display_service.h" 12 13 namespace android { 14 namespace dvr { 15 16 // VSyncWaiter encapsulates a client blocked waiting for the next vsync. 17 // It is used to enqueue the Message to reply to when the next vsync event 18 // occurs. 19 class VSyncWaiter { 20 public: VSyncWaiter(pdx::Message & message)21 explicit VSyncWaiter(pdx::Message& message) : message_(std::move(message)) {} 22 23 void Notify(int64_t timestamp); 24 25 private: 26 pdx::Status<int64_t> OnWait(pdx::Message& message); 27 28 pdx::Message message_; 29 int64_t timestamp_ = 0; 30 31 VSyncWaiter(const VSyncWaiter&) = delete; 32 void operator=(const VSyncWaiter&) = delete; 33 }; 34 35 // VSyncChannel manages the service-side per-client context for each client 36 // using the service. 37 class VSyncChannel : public pdx::Channel { 38 public: VSyncChannel(pdx::Service & service,int pid,int cid)39 VSyncChannel(pdx::Service& service, int pid, int cid) 40 : service_(service), pid_(pid), cid_(cid) {} 41 42 void Ack(); 43 void Signal(); 44 45 private: 46 pdx::Service& service_; 47 pid_t pid_; 48 int cid_; 49 50 VSyncChannel(const VSyncChannel&) = delete; 51 void operator=(const VSyncChannel&) = delete; 52 }; 53 54 // VSyncService implements the displayd vsync service over ServiceFS. 55 class VSyncService : public pdx::ServiceBase<VSyncService> { 56 public: 57 ~VSyncService() override; 58 59 pdx::Status<void> HandleMessage(pdx::Message& message) override; 60 61 std::shared_ptr<pdx::Channel> OnChannelOpen(pdx::Message& message) override; 62 void OnChannelClose(pdx::Message& message, 63 const std::shared_ptr<pdx::Channel>& channel) override; 64 65 // Called by the hardware composer HAL, or similar, whenever a vsync event 66 // occurs. |compositor_time_ns| is the number of ns before the next vsync when 67 // the compositor will preempt the GPU to do EDS and lens warp. 68 void VSyncEvent(int display, int64_t timestamp_ns, int64_t compositor_time_ns, 69 uint32_t vsync_count); 70 71 private: 72 friend BASE; 73 74 VSyncService(); 75 76 pdx::Status<int64_t> OnGetLastTimestamp(pdx::Message& message); 77 pdx::Status<display::VSyncSchedInfo> OnGetSchedInfo(pdx::Message& message); 78 pdx::Status<void> OnAcknowledge(pdx::Message& message); 79 80 void NotifierThreadFunction(); 81 82 void AddWaiter(pdx::Message& message); 83 void NotifyWaiters(); 84 void UpdateClients(); 85 86 void AddClient(const std::shared_ptr<VSyncChannel>& client); 87 void RemoveClient(const std::shared_ptr<VSyncChannel>& client); 88 89 int64_t last_vsync_; 90 int64_t current_vsync_; 91 int64_t compositor_time_ns_; 92 uint32_t current_vsync_count_; 93 94 std::mutex mutex_; 95 96 std::list<std::unique_ptr<VSyncWaiter>> waiters_; 97 std::list<std::shared_ptr<VSyncChannel>> clients_; 98 99 VSyncService(const VSyncService&) = delete; 100 void operator=(VSyncService&) = delete; 101 }; 102 103 } // namespace dvr 104 } // namespace android 105 106 #endif // ANDROID_DVR_SERVICES_DISPLAYD_VSYNC_SERVICE_H_ 107