blob: 3b0d07e7b0e120183845488fcbb754d8ae0f8e26 [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>
Hendrik Wagenaareaa55222017-04-06 10:56:23 -07006#include <private/dvr/bufferhub_rpc.h>
Corey Tabaka3f82d312017-04-20 14:42:08 -07007#include <private/dvr/display_protocol.h>
Alex Vakulenkoa8a92782017-01-27 14:41:57 -08008#include <private/dvr/late_latch.h>
9
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"
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080018#include "hardware_composer.h"
19
20namespace android {
21namespace dvr {
22
23// DisplayService implements the displayd display service over ServiceFS.
24class DisplayService : public pdx::ServiceBase<DisplayService> {
25 public:
Stephen Kiazyk016e5e32017-02-21 17:09:22 -080026 bool IsInitialized() const override;
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080027 std::string DumpState(size_t max_length) override;
28
29 void OnChannelClose(pdx::Message& message,
30 const std::shared_ptr<pdx::Channel>& channel) override;
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -070031 pdx::Status<void> HandleMessage(pdx::Message& message) override;
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080032
33 std::shared_ptr<DisplaySurface> GetDisplaySurface(int surface_id) const;
34 std::vector<std::shared_ptr<DisplaySurface>> GetDisplaySurfaces() const;
35 std::vector<std::shared_ptr<DisplaySurface>> GetVisibleDisplaySurfaces()
36 const;
37
38 // Updates the list of actively displayed surfaces. This must be called after
39 // any change to client/manager attributes that affect visibility or z order.
Steven Thomas050b2c82017-03-06 11:45:16 -080040 void UpdateActiveDisplaySurfaces();
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080041
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070042 pdx::Status<BorrowedNativeBufferHandle> SetupNamedBuffer(
Jiwen 'Steve' Cai0057fdd2017-05-02 11:21:18 -070043 const std::string& name, size_t size, int usage);
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070044
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080045 template <class A>
46 void ForEachDisplaySurface(A action) const {
47 ForEachChannel([action](const ChannelIterator::value_type& pair) mutable {
48 auto surface = std::static_pointer_cast<SurfaceChannel>(pair.second);
49 if (surface->type() == SurfaceTypeEnum::Normal)
50 action(std::static_pointer_cast<DisplaySurface>(surface));
51 });
52 }
53
54 using DisplayConfigurationUpdateNotifier = std::function<void(void)>;
55 void SetDisplayConfigurationUpdateNotifier(
56 DisplayConfigurationUpdateNotifier notifier);
57
58 using VSyncCallback = HardwareComposer::VSyncCallback;
59 void SetVSyncCallback(VSyncCallback callback) {
60 hardware_composer_.SetVSyncCallback(callback);
61 }
62
63 HWCDisplayMetrics GetDisplayMetrics() {
64 return hardware_composer_.display_metrics();
65 }
66
Steven Thomas050b2c82017-03-06 11:45:16 -080067 void GrantDisplayOwnership() { hardware_composer_.Enable(); }
68 void SeizeDisplayOwnership() { hardware_composer_.Disable(); }
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080069
Steven Thomas3cfac282017-02-06 12:29:30 -080070 void OnHardwareComposerRefresh();
71
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080072 private:
73 friend BASE;
74 friend DisplaySurface;
75
76 friend class VrDisplayStateService;
77
78 DisplayService();
79 DisplayService(android::Hwc2::Composer* hidl);
80
81 SystemDisplayMetrics OnGetMetrics(pdx::Message& message);
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070082 int OnCreateSurface(pdx::Message& message, int width, int height, int format,
83 int usage, DisplaySurfaceFlags flags);
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080084
85 DisplayRPC::ByteBuffer OnGetEdsCapture(pdx::Message& message);
86
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070087 void OnSetViewerParams(pdx::Message& message,
88 const ViewerParams& view_params);
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070089 pdx::Status<BorrowedNativeBufferHandle> OnGetNamedBuffer(
90 pdx::Message& message, const std::string& name);
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.
93 int IsVrAppRunning(pdx::Message& message);
94
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080095 // Called by DisplaySurface to signal that a surface property has changed and
96 // the display manager should be notified.
97 void NotifyDisplayConfigurationUpdate();
98
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -070099 pdx::Status<void> HandleSurfaceMessage(pdx::Message& message);
Alex Vakulenkoa8a92782017-01-27 14:41:57 -0800100
101 DisplayService(const DisplayService&) = delete;
102 void operator=(const DisplayService&) = delete;
103
Alex Vakulenkoa8a92782017-01-27 14:41:57 -0800104 HardwareComposer hardware_composer_;
105 DisplayConfigurationUpdateNotifier update_notifier_;
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700106
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700107 std::unordered_map<std::string, std::unique_ptr<IonBuffer>> named_buffers_;
Alex Vakulenkoa8a92782017-01-27 14:41:57 -0800108};
109
110} // namespace dvr
111} // namespace android
112
113#endif // ANDROID_DVR_SERVICES_DISPLAYD_DISPLAY_SERVICE_H_