• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef ANDROID_DVR_SERVICES_DISPLAYD_DISPLAY_SERVICE_H_
2 #define ANDROID_DVR_SERVICES_DISPLAYD_DISPLAY_SERVICE_H_
3 
4 #include <dvr/dvr_api.h>
5 #include <pdx/service.h>
6 #include <pdx/status.h>
7 #include <private/dvr/buffer_hub_client.h>
8 #include <private/dvr/bufferhub_rpc.h>
9 #include <private/dvr/display_protocol.h>
10 
11 #include <functional>
12 #include <iterator>
13 #include <memory>
14 #include <string>
15 #include <vector>
16 
17 #include "acquired_buffer.h"
18 #include "display_surface.h"
19 #include "epoll_event_dispatcher.h"
20 #include "hardware_composer.h"
21 
22 namespace android {
23 namespace dvr {
24 
25 // DisplayService implements the display service component of VrFlinger.
26 class DisplayService : public pdx::ServiceBase<DisplayService> {
27  public:
28   bool IsInitialized() const override;
29   std::string DumpState(size_t max_length) override;
30 
31   void OnChannelClose(pdx::Message& message,
32                       const std::shared_ptr<pdx::Channel>& channel) override;
33   pdx::Status<void> HandleMessage(pdx::Message& message) override;
34 
35   std::shared_ptr<DisplaySurface> GetDisplaySurface(int surface_id) const;
36   std::vector<std::shared_ptr<DisplaySurface>> GetDisplaySurfaces() const;
37   std::vector<std::shared_ptr<DirectDisplaySurface>> GetVisibleDisplaySurfaces()
38       const;
39 
40   // Updates the list of actively displayed surfaces. This must be called after
41   // any change to client/manager attributes that affect visibility or z order.
42   void UpdateActiveDisplaySurfaces();
43 
44   pdx::Status<BorrowedNativeBufferHandle> SetupGlobalBuffer(
45       DvrGlobalBufferKey key, size_t size, uint64_t usage);
46 
47   pdx::Status<void> DeleteGlobalBuffer(DvrGlobalBufferKey key);
48 
49   template <class A>
ForEachDisplaySurface(SurfaceType surface_type,A action)50   void ForEachDisplaySurface(SurfaceType surface_type, A action) const {
51     ForEachChannel([surface_type,
52                     action](const ChannelIterator::value_type& pair) mutable {
53       auto surface = std::static_pointer_cast<DisplaySurface>(pair.second);
54       if (surface->surface_type() == surface_type)
55         action(surface);
56     });
57   }
58 
59   using DisplayConfigurationUpdateNotifier = std::function<void(void)>;
60   void SetDisplayConfigurationUpdateNotifier(
61       DisplayConfigurationUpdateNotifier notifier);
62 
63   using VSyncCallback = HardwareComposer::VSyncCallback;
SetVSyncCallback(VSyncCallback callback)64   void SetVSyncCallback(VSyncCallback callback) {
65     hardware_composer_.SetVSyncCallback(callback);
66   }
67 
GetDisplayMetrics()68   HWCDisplayMetrics GetDisplayMetrics() {
69     return hardware_composer_.display_metrics();
70   }
71 
GrantDisplayOwnership()72   void GrantDisplayOwnership() { hardware_composer_.Enable(); }
SeizeDisplayOwnership()73   void SeizeDisplayOwnership() { hardware_composer_.Disable(); }
74 
75  private:
76   friend BASE;
77   friend DisplaySurface;
78 
79   friend class VrDisplayStateService;
80 
81   using RequestDisplayCallback = std::function<void(bool)>;
82 
83   DisplayService(android::Hwc2::Composer* hidl,
84                  RequestDisplayCallback request_display_callback);
85 
86   pdx::Status<BorrowedNativeBufferHandle> OnGetGlobalBuffer(
87       pdx::Message& message, DvrGlobalBufferKey key);
88   pdx::Status<display::Metrics> OnGetMetrics(pdx::Message& message);
89   pdx::Status<std::string> OnGetConfigurationData(
90       pdx::Message& message, display::ConfigFileType config_type);
91   pdx::Status<display::SurfaceInfo> OnCreateSurface(
92       pdx::Message& message, const display::SurfaceAttributes& attributes);
93   pdx::Status<BorrowedNativeBufferHandle> OnSetupGlobalBuffer(
94       pdx::Message& message, DvrGlobalBufferKey key, size_t size,
95       uint64_t usage);
96   pdx::Status<void> OnDeleteGlobalBuffer(pdx::Message& message,
97                                          DvrGlobalBufferKey key);
98 
99   // Temporary query for current VR status. Will be removed later.
100   pdx::Status<bool> IsVrAppRunning(pdx::Message& message);
101 
AddEventHandler(int fd,int events,EpollEventDispatcher::Handler handler)102   pdx::Status<void> AddEventHandler(int fd, int events,
103                                     EpollEventDispatcher::Handler handler) {
104     return dispatcher_.AddEventHandler(fd, events, handler);
105   }
RemoveEventHandler(int fd)106   pdx::Status<void> RemoveEventHandler(int fd) {
107     return dispatcher_.RemoveEventHandler(fd);
108   }
109 
110   void SurfaceUpdated(SurfaceType surface_type,
111                       display::SurfaceUpdateFlags update_flags);
112 
113   // Called by DisplaySurface to signal that a surface property has changed and
114   // the display manager should be notified.
115   void NotifyDisplayConfigurationUpdate();
116 
117   pdx::Status<void> HandleSurfaceMessage(pdx::Message& message);
118 
119   HardwareComposer hardware_composer_;
120   EpollEventDispatcher dispatcher_;
121   DisplayConfigurationUpdateNotifier update_notifier_;
122 
123   std::unordered_map<DvrGlobalBufferKey, std::unique_ptr<IonBuffer>>
124       global_buffers_;
125 
126   DisplayService(const DisplayService&) = delete;
127   void operator=(const DisplayService&) = delete;
128 };
129 
130 }  // namespace dvr
131 }  // namespace android
132 
133 #endif  // ANDROID_DVR_SERVICES_DISPLAYD_DISPLAY_SERVICE_H_
134