12251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#ifndef ANDROID_DVR_SERVICES_VRFLINGER_DISPLAY_MANAGER_SERVICE_H_
22251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#define ANDROID_DVR_SERVICES_VRFLINGER_DISPLAY_MANAGER_SERVICE_H_
3a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
4a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko#include <pdx/service.h>
52251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#include <pdx/status.h>
63f82d31341f66d0c58e1ec3360ea5f528ffe0ea4Corey Tabaka#include <private/dvr/display_protocol.h>
7a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
8a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko#include "display_service.h"
9a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
10a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenkonamespace android {
11a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenkonamespace dvr {
12a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
13a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenkoclass DisplayManagerService;
14a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
15a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko// The display manager is a client of the display manager service. This class
16a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko// represents the connected client that the display manager service sends
17a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko// notifications to.
18a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenkoclass DisplayManager : public pdx::Channel {
19a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko public:
20a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  DisplayManager(DisplayManagerService* service, int channel_id)
21a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko      : service_(service), channel_id_(channel_id) {}
22a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
23a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  int channel_id() const { return channel_id_; }
24a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
25a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  // Sets or clears the channel event mask to indicate pending events that the
26a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  // display manager on the other end of the channel should read and handle.
27a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  // When |pending| is true the POLLIN bit is set in the event mask; when
28a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  // |pending| is false the POLLIN bit is cleared in the event mask.
29a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  void SetNotificationsPending(bool pending);
30a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
31a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko private:
32a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  DisplayManager(const DisplayManager&) = delete;
33a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  void operator=(const DisplayManager&) = delete;
34a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
35a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  DisplayManagerService* service_;
36a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  int channel_id_;
37a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko};
38a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
39a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko// The display manager service marshalls state and events from the display
40a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko// service to the display manager.
41a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenkoclass DisplayManagerService : public pdx::ServiceBase<DisplayManagerService> {
42a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko public:
43a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  std::shared_ptr<pdx::Channel> OnChannelOpen(pdx::Message& message) override;
44a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  void OnChannelClose(pdx::Message& message,
45a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko                      const std::shared_ptr<pdx::Channel>& channel) override;
46f0a7bd033941e26e380232a0515e903cf8e678e5Alex Vakulenko  pdx::Status<void> HandleMessage(pdx::Message& message) override;
47a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
48a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko private:
49a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  friend BASE;
50a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
51a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  explicit DisplayManagerService(
52a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko      const std::shared_ptr<DisplayService>& display_service);
53a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
542251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  pdx::Status<std::vector<display::SurfaceState>> OnGetSurfaceState(
552251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka      pdx::Message& message);
562251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  pdx::Status<pdx::LocalChannelHandle> OnGetSurfaceQueue(pdx::Message& message,
572251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka                                                         int surface_id,
582251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka                                                         int queue_id);
5910e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar
60a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  // Called by the display service to indicate changes to display surfaces that
61a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  // the display manager should evaluate.
62a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  void OnDisplaySurfaceChange();
63a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
64a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  DisplayManagerService(const DisplayManagerService&) = delete;
65a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  void operator=(const DisplayManagerService&) = delete;
66a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
67a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  std::shared_ptr<DisplayService> display_service_;
68a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  std::shared_ptr<DisplayManager> display_manager_;
69a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko};
70a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
71a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko}  // namespace dvr
72a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko}  // namespace android
73a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
742251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#endif  // ANDROID_DVR_SERVICES_VRFLINGER_DISPLAY_MANAGER_SERVICE_H_
75