1a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko#ifndef ANDROID_DVR_VR_FLINGER_H_
2a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko#define ANDROID_DVR_VR_FLINGER_H_
3a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
4a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko#include <thread>
5a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko#include <memory>
6a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
76e8f706c21a01d6a1225e86972ff432bba5f0106Steven Thomas#define HWC2_INCLUDE_STRINGIFICATION
86e8f706c21a01d6a1225e86972ff432bba5f0106Steven Thomas#define HWC2_USE_CPP11
96e8f706c21a01d6a1225e86972ff432bba5f0106Steven Thomas#include <hardware/hwcomposer2.h>
106e8f706c21a01d6a1225e86972ff432bba5f0106Steven Thomas#undef HWC2_INCLUDE_STRINGIFICATION
116e8f706c21a01d6a1225e86972ff432bba5f0106Steven Thomas#undef HWC2_USE_CPP11
126e8f706c21a01d6a1225e86972ff432bba5f0106Steven Thomas
135a244ed36c8e45fd95b89ff916caf083fb182ec1Alex Vakulenko#include <pdx/service_dispatcher.h>
14050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas#include <vr/vr_manager/vr_manager.h>
15050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas
16a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenkonamespace android {
17a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
18a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenkonamespace Hwc2 {
19a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenkoclass Composer;
20a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko}  // namespace Hwc2
21a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
22a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenkonamespace dvr {
23a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
24a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenkoclass DisplayService;
25a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
26a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenkoclass VrFlinger {
27a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko public:
28050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas  using RequestDisplayCallback = std::function<void(bool)>;
29050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas  static std::unique_ptr<VrFlinger> Create(
306e8f706c21a01d6a1225e86972ff432bba5f0106Steven Thomas      Hwc2::Composer* hidl,
316e8f706c21a01d6a1225e86972ff432bba5f0106Steven Thomas      hwc2_display_t primary_display_id,
326e8f706c21a01d6a1225e86972ff432bba5f0106Steven Thomas      RequestDisplayCallback request_display_callback);
33050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas  ~VrFlinger();
34f43d13e4e35ae7d3cdafc4b97c819669d42cef78Steven Thomas
35050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas  // These functions are all called on surface flinger's main thread.
36050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas  void OnBootFinished();
37050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas  void GrantDisplayOwnership();
38050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas  void SeizeDisplayOwnership();
39050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas
40171155a55d7a3b7571ea1292f1aad926b6f82509Karthik Ravi Shankar  // dump all vr flinger state.
41171155a55d7a3b7571ea1292f1aad926b6f82509Karthik Ravi Shankar  std::string Dump();
42171155a55d7a3b7571ea1292f1aad926b6f82509Karthik Ravi Shankar
43a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko private:
44050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas  VrFlinger();
45050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas  bool Init(Hwc2::Composer* hidl,
466e8f706c21a01d6a1225e86972ff432bba5f0106Steven Thomas            hwc2_display_t primary_display_id,
47050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas            RequestDisplayCallback request_display_callback);
48050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas
49050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas  // Needs to be a separate class for binder's ref counting
50050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas  class PersistentVrStateCallback : public BnPersistentVrStateCallbacks {
51050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas   public:
52050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas    PersistentVrStateCallback(RequestDisplayCallback request_display_callback)
53050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas        : request_display_callback_(request_display_callback) {}
54050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas    void onPersistentVrStateChanged(bool enabled) override;
55050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas   private:
56050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas    RequestDisplayCallback request_display_callback_;
57050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas  };
58050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas
59050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas  std::thread dispatcher_thread_;
60050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas  std::unique_ptr<android::pdx::ServiceDispatcher> dispatcher_;
61a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  std::shared_ptr<android::dvr::DisplayService> display_service_;
62050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas  sp<PersistentVrStateCallback> persistent_vr_state_callback_;
63050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas  RequestDisplayCallback request_display_callback_;
64a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko};
65a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
66a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko} // namespace dvr
67a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko} // namespace android
68a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
69a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko#endif // ANDROID_DVR_VR_FLINGER_H_
70