blob: 2a71b4ae0bbe96171e9e0f36e04edad58f74de6d [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>
5#include <private/dvr/buffer_hub_client.h>
6#include <private/dvr/display_rpc.h>
7#include <private/dvr/late_latch.h>
8
9#include <functional>
10#include <iterator>
11#include <memory>
12#include <string>
13#include <vector>
14
15#include "acquired_buffer.h"
16#include "display_surface.h"
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080017#include "hardware_composer.h"
18
19namespace android {
20namespace dvr {
21
22// DisplayService implements the displayd display service over ServiceFS.
23class DisplayService : public pdx::ServiceBase<DisplayService> {
24 public:
Stephen Kiazyk016e5e32017-02-21 17:09:22 -080025 bool IsInitialized() const override;
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080026 std::string DumpState(size_t max_length) override;
27
28 void OnChannelClose(pdx::Message& message,
29 const std::shared_ptr<pdx::Channel>& channel) override;
30 int HandleMessage(pdx::Message& message) override;
31
32 std::shared_ptr<DisplaySurface> GetDisplaySurface(int surface_id) const;
33 std::vector<std::shared_ptr<DisplaySurface>> GetDisplaySurfaces() const;
34 std::vector<std::shared_ptr<DisplaySurface>> GetVisibleDisplaySurfaces()
35 const;
36
37 // Updates the list of actively displayed surfaces. This must be called after
38 // any change to client/manager attributes that affect visibility or z order.
Steven Thomas050b2c82017-03-06 11:45:16 -080039 void UpdateActiveDisplaySurfaces();
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080040
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070041 pdx::BorrowedChannelHandle SetupPoseBuffer(size_t extended_region_size,
42 int usage);
43
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080044 template <class A>
45 void ForEachDisplaySurface(A action) const {
46 ForEachChannel([action](const ChannelIterator::value_type& pair) mutable {
47 auto surface = std::static_pointer_cast<SurfaceChannel>(pair.second);
48 if (surface->type() == SurfaceTypeEnum::Normal)
49 action(std::static_pointer_cast<DisplaySurface>(surface));
50 });
51 }
52
53 using DisplayConfigurationUpdateNotifier = std::function<void(void)>;
54 void SetDisplayConfigurationUpdateNotifier(
55 DisplayConfigurationUpdateNotifier notifier);
56
57 using VSyncCallback = HardwareComposer::VSyncCallback;
58 void SetVSyncCallback(VSyncCallback callback) {
59 hardware_composer_.SetVSyncCallback(callback);
60 }
61
62 HWCDisplayMetrics GetDisplayMetrics() {
63 return hardware_composer_.display_metrics();
64 }
65
Steven Thomas050b2c82017-03-06 11:45:16 -080066 void GrantDisplayOwnership() { hardware_composer_.Enable(); }
67 void SeizeDisplayOwnership() { hardware_composer_.Disable(); }
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080068
Steven Thomas3cfac282017-02-06 12:29:30 -080069 void OnHardwareComposerRefresh();
70
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080071 private:
72 friend BASE;
73 friend DisplaySurface;
74
75 friend class VrDisplayStateService;
76
77 DisplayService();
78 DisplayService(android::Hwc2::Composer* hidl);
79
80 SystemDisplayMetrics OnGetMetrics(pdx::Message& message);
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070081 int OnCreateSurface(pdx::Message& message, int width, int height, int format,
82 int usage, DisplaySurfaceFlags flags);
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080083
84 DisplayRPC::ByteBuffer OnGetEdsCapture(pdx::Message& message);
85
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070086 void OnSetViewerParams(pdx::Message& message,
87 const ViewerParams& view_params);
88 pdx::LocalChannelHandle OnGetPoseBuffer(pdx::Message& message);
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080089
90 // Called by DisplaySurface to signal that a surface property has changed and
91 // the display manager should be notified.
92 void NotifyDisplayConfigurationUpdate();
93
94 int HandleSurfaceMessage(pdx::Message& message);
95
96 DisplayService(const DisplayService&) = delete;
97 void operator=(const DisplayService&) = delete;
98
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080099 HardwareComposer hardware_composer_;
100 DisplayConfigurationUpdateNotifier update_notifier_;
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700101
102 std::unique_ptr<BufferProducer> pose_buffer_;
Alex Vakulenkoa8a92782017-01-27 14:41:57 -0800103};
104
105} // namespace dvr
106} // namespace android
107
108#endif // ANDROID_DVR_SERVICES_DISPLAYD_DISPLAY_SERVICE_H_