blob: bb4eeef1c640097c09b8b5eafcc783ad17b38153 [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
4#include <pdx/service.h>
Corey Tabaka2251d822017-04-20 16:04:07 -07005#include <pdx/status.h>
Alex Vakulenkoa8a92782017-01-27 14:41:57 -08006#include <private/dvr/buffer_hub_client.h>
Hendrik Wagenaareaa55222017-04-06 10:56:23 -07007#include <private/dvr/bufferhub_rpc.h>
Corey Tabaka3f82d312017-04-20 14:42:08 -07008#include <private/dvr/display_protocol.h>
Alex Vakulenkoa8a92782017-01-27 14:41:57 -08009
10#include <functional>
11#include <iterator>
12#include <memory>
13#include <string>
14#include <vector>
15
16#include "acquired_buffer.h"
17#include "display_surface.h"
Corey Tabaka2251d822017-04-20 16:04:07 -070018#include "epoll_event_dispatcher.h"
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080019#include "hardware_composer.h"
20
21namespace android {
22namespace dvr {
23
Corey Tabaka2251d822017-04-20 16:04:07 -070024// DisplayService implements the display service component of VrFlinger.
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080025class DisplayService : public pdx::ServiceBase<DisplayService> {
26 public:
Stephen Kiazyk016e5e32017-02-21 17:09:22 -080027 bool IsInitialized() const override;
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080028 std::string DumpState(size_t max_length) override;
29
30 void OnChannelClose(pdx::Message& message,
31 const std::shared_ptr<pdx::Channel>& channel) override;
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -070032 pdx::Status<void> HandleMessage(pdx::Message& message) override;
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080033
34 std::shared_ptr<DisplaySurface> GetDisplaySurface(int surface_id) const;
35 std::vector<std::shared_ptr<DisplaySurface>> GetDisplaySurfaces() const;
Corey Tabaka2251d822017-04-20 16:04:07 -070036 std::vector<std::shared_ptr<DirectDisplaySurface>> GetVisibleDisplaySurfaces()
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080037 const;
38
39 // Updates the list of actively displayed surfaces. This must be called after
40 // any change to client/manager attributes that affect visibility or z order.
Steven Thomas050b2c82017-03-06 11:45:16 -080041 void UpdateActiveDisplaySurfaces();
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080042
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070043 pdx::Status<BorrowedNativeBufferHandle> SetupNamedBuffer(
Corey Tabaka2251d822017-04-20 16:04:07 -070044 const std::string& name, size_t size, uint64_t usage);
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070045
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080046 template <class A>
Corey Tabaka2251d822017-04-20 16:04:07 -070047 void ForEachDisplaySurface(SurfaceType surface_type, A action) const {
48 ForEachChannel([surface_type,
49 action](const ChannelIterator::value_type& pair) mutable {
50 auto surface = std::static_pointer_cast<DisplaySurface>(pair.second);
51 if (surface->surface_type() == surface_type)
52 action(surface);
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080053 });
54 }
55
56 using DisplayConfigurationUpdateNotifier = std::function<void(void)>;
57 void SetDisplayConfigurationUpdateNotifier(
58 DisplayConfigurationUpdateNotifier notifier);
59
60 using VSyncCallback = HardwareComposer::VSyncCallback;
61 void SetVSyncCallback(VSyncCallback callback) {
62 hardware_composer_.SetVSyncCallback(callback);
63 }
64
65 HWCDisplayMetrics GetDisplayMetrics() {
66 return hardware_composer_.display_metrics();
67 }
68
Steven Thomas050b2c82017-03-06 11:45:16 -080069 void GrantDisplayOwnership() { hardware_composer_.Enable(); }
70 void SeizeDisplayOwnership() { hardware_composer_.Disable(); }
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080071
Steven Thomas3cfac282017-02-06 12:29:30 -080072 void OnHardwareComposerRefresh();
73
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080074 private:
75 friend BASE;
76 friend DisplaySurface;
77
78 friend class VrDisplayStateService;
79
Corey Tabaka2251d822017-04-20 16:04:07 -070080 using RequestDisplayCallback = std::function<void(bool)>;
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080081
Corey Tabaka2251d822017-04-20 16:04:07 -070082 DisplayService(android::Hwc2::Composer* hidl,
83 RequestDisplayCallback request_display_callback);
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080084
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070085 pdx::Status<BorrowedNativeBufferHandle> OnGetNamedBuffer(
86 pdx::Message& message, const std::string& name);
Corey Tabaka2251d822017-04-20 16:04:07 -070087 pdx::Status<display::Metrics> OnGetMetrics(pdx::Message& message);
88 pdx::Status<display::SurfaceInfo> OnCreateSurface(
89 pdx::Message& message, const display::SurfaceAttributes& attributes);
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080090
Albert Chaulkb7c8a4b2017-03-20 13:03:39 -040091 // Temporary query for current VR status. Will be removed later.
Corey Tabaka2251d822017-04-20 16:04:07 -070092 pdx::Status<bool> IsVrAppRunning(pdx::Message& message);
93
94 pdx::Status<void> AddEventHandler(int fd, int events,
95 EpollEventDispatcher::Handler handler) {
96 return dispatcher_.AddEventHandler(fd, events, handler);
97 }
98 pdx::Status<void> RemoveEventHandler(int fd) {
99 return dispatcher_.RemoveEventHandler(fd);
100 }
101
102 void SurfaceUpdated(SurfaceType surface_type,
103 display::SurfaceUpdateFlags update_flags);
Albert Chaulkb7c8a4b2017-03-20 13:03:39 -0400104
Alex Vakulenkoa8a92782017-01-27 14:41:57 -0800105 // Called by DisplaySurface to signal that a surface property has changed and
106 // the display manager should be notified.
107 void NotifyDisplayConfigurationUpdate();
108
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700109 pdx::Status<void> HandleSurfaceMessage(pdx::Message& message);
Alex Vakulenkoa8a92782017-01-27 14:41:57 -0800110
Alex Vakulenkoa8a92782017-01-27 14:41:57 -0800111 HardwareComposer hardware_composer_;
Corey Tabaka2251d822017-04-20 16:04:07 -0700112 RequestDisplayCallback request_display_callback_;
113 EpollEventDispatcher dispatcher_;
Alex Vakulenkoa8a92782017-01-27 14:41:57 -0800114 DisplayConfigurationUpdateNotifier update_notifier_;
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700115
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700116 std::unordered_map<std::string, std::unique_ptr<IonBuffer>> named_buffers_;
Corey Tabaka2251d822017-04-20 16:04:07 -0700117
118 DisplayService(const DisplayService&) = delete;
119 void operator=(const DisplayService&) = delete;
Alex Vakulenkoa8a92782017-01-27 14:41:57 -0800120};
121
122} // namespace dvr
123} // namespace android
124
125#endif // ANDROID_DVR_SERVICES_DISPLAYD_DISPLAY_SERVICE_H_