blob: 77e45a49c3daf0a35606da781dfbd69bb72473d1 [file] [log] [blame]
Alex Vakulenkoa8a92782017-01-27 14:41:57 -08001#ifndef ANDROID_DVR_SERVICES_DISPLAYD_DISPLAY_SERVICE_H_
2#define ANDROID_DVR_SERVICES_DISPLAYD_DISPLAY_SERVICE_H_
3
Okan Arikan36d23802017-05-15 15:20:39 -07004#include <dvr/dvr_api.h>
Alex Vakulenkoa8a92782017-01-27 14:41:57 -08005#include <pdx/service.h>
Corey Tabaka2251d822017-04-20 16:04:07 -07006#include <pdx/status.h>
Alex Vakulenkoa8a92782017-01-27 14:41:57 -08007#include <private/dvr/buffer_hub_client.h>
Hendrik Wagenaareaa55222017-04-06 10:56:23 -07008#include <private/dvr/bufferhub_rpc.h>
Corey Tabaka3f82d312017-04-20 14:42:08 -07009#include <private/dvr/display_protocol.h>
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080010
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"
Corey Tabaka2251d822017-04-20 16:04:07 -070019#include "epoll_event_dispatcher.h"
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080020#include "hardware_composer.h"
21
22namespace android {
23namespace dvr {
24
Corey Tabaka2251d822017-04-20 16:04:07 -070025// DisplayService implements the display service component of VrFlinger.
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080026class DisplayService : public pdx::ServiceBase<DisplayService> {
27 public:
Stephen Kiazyk016e5e32017-02-21 17:09:22 -080028 bool IsInitialized() const override;
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080029 std::string DumpState(size_t max_length) override;
30
31 void OnChannelClose(pdx::Message& message,
32 const std::shared_ptr<pdx::Channel>& channel) override;
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -070033 pdx::Status<void> HandleMessage(pdx::Message& message) override;
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080034
35 std::shared_ptr<DisplaySurface> GetDisplaySurface(int surface_id) const;
36 std::vector<std::shared_ptr<DisplaySurface>> GetDisplaySurfaces() const;
Corey Tabaka2251d822017-04-20 16:04:07 -070037 std::vector<std::shared_ptr<DirectDisplaySurface>> GetVisibleDisplaySurfaces()
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080038 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.
Steven Thomas050b2c82017-03-06 11:45:16 -080042 void UpdateActiveDisplaySurfaces();
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080043
Okan Arikan36d23802017-05-15 15:20:39 -070044 pdx::Status<BorrowedNativeBufferHandle> SetupGlobalBuffer(
45 DvrGlobalBufferKey key, size_t size, uint64_t usage);
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070046
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080047 template <class A>
Corey Tabaka2251d822017-04-20 16:04:07 -070048 void ForEachDisplaySurface(SurfaceType surface_type, A action) const {
49 ForEachChannel([surface_type,
50 action](const ChannelIterator::value_type& pair) mutable {
51 auto surface = std::static_pointer_cast<DisplaySurface>(pair.second);
52 if (surface->surface_type() == surface_type)
53 action(surface);
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080054 });
55 }
56
57 using DisplayConfigurationUpdateNotifier = std::function<void(void)>;
58 void SetDisplayConfigurationUpdateNotifier(
59 DisplayConfigurationUpdateNotifier notifier);
60
61 using VSyncCallback = HardwareComposer::VSyncCallback;
62 void SetVSyncCallback(VSyncCallback callback) {
63 hardware_composer_.SetVSyncCallback(callback);
64 }
65
66 HWCDisplayMetrics GetDisplayMetrics() {
67 return hardware_composer_.display_metrics();
68 }
69
Steven Thomas050b2c82017-03-06 11:45:16 -080070 void GrantDisplayOwnership() { hardware_composer_.Enable(); }
71 void SeizeDisplayOwnership() { hardware_composer_.Disable(); }
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080072
Steven Thomas3cfac282017-02-06 12:29:30 -080073 void OnHardwareComposerRefresh();
74
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080075 private:
76 friend BASE;
77 friend DisplaySurface;
78
79 friend class VrDisplayStateService;
80
Corey Tabaka2251d822017-04-20 16:04:07 -070081 using RequestDisplayCallback = std::function<void(bool)>;
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080082
Corey Tabaka2251d822017-04-20 16:04:07 -070083 DisplayService(android::Hwc2::Composer* hidl,
84 RequestDisplayCallback request_display_callback);
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080085
Okan Arikan36d23802017-05-15 15:20:39 -070086 pdx::Status<BorrowedNativeBufferHandle> OnGetGlobalBuffer(
87 pdx::Message& message, DvrGlobalBufferKey key);
Corey Tabaka2251d822017-04-20 16:04:07 -070088 pdx::Status<display::Metrics> OnGetMetrics(pdx::Message& message);
89 pdx::Status<display::SurfaceInfo> OnCreateSurface(
90 pdx::Message& message, const display::SurfaceAttributes& attributes);
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080091
Albert Chaulkb7c8a4b2017-03-20 13:03:39 -040092 // Temporary query for current VR status. Will be removed later.
Corey Tabaka2251d822017-04-20 16:04:07 -070093 pdx::Status<bool> IsVrAppRunning(pdx::Message& message);
94
95 pdx::Status<void> AddEventHandler(int fd, int events,
96 EpollEventDispatcher::Handler handler) {
97 return dispatcher_.AddEventHandler(fd, events, handler);
98 }
99 pdx::Status<void> RemoveEventHandler(int fd) {
100 return dispatcher_.RemoveEventHandler(fd);
101 }
102
103 void SurfaceUpdated(SurfaceType surface_type,
104 display::SurfaceUpdateFlags update_flags);
Albert Chaulkb7c8a4b2017-03-20 13:03:39 -0400105
Alex Vakulenkoa8a92782017-01-27 14:41:57 -0800106 // Called by DisplaySurface to signal that a surface property has changed and
107 // the display manager should be notified.
108 void NotifyDisplayConfigurationUpdate();
109
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700110 pdx::Status<void> HandleSurfaceMessage(pdx::Message& message);
Alex Vakulenkoa8a92782017-01-27 14:41:57 -0800111
Alex Vakulenkoa8a92782017-01-27 14:41:57 -0800112 HardwareComposer hardware_composer_;
Corey Tabaka2251d822017-04-20 16:04:07 -0700113 RequestDisplayCallback request_display_callback_;
114 EpollEventDispatcher dispatcher_;
Alex Vakulenkoa8a92782017-01-27 14:41:57 -0800115 DisplayConfigurationUpdateNotifier update_notifier_;
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700116
Okan Arikan36d23802017-05-15 15:20:39 -0700117 std::unordered_map<DvrGlobalBufferKey, std::unique_ptr<IonBuffer>>
118 global_buffers_;
Corey Tabaka2251d822017-04-20 16:04:07 -0700119
120 DisplayService(const DisplayService&) = delete;
121 void operator=(const DisplayService&) = delete;
Alex Vakulenkoa8a92782017-01-27 14:41:57 -0800122};
123
124} // namespace dvr
125} // namespace android
126
127#endif // ANDROID_DVR_SERVICES_DISPLAYD_DISPLAY_SERVICE_H_