blob: e47ffa341770ffc6d5ae0109d2f9e29109af975e [file] [log] [blame]
Alex Vakulenkoe4eec202017-01-27 14:41:04 -08001#ifndef ANDROID_DVR_BUFFERHUBD_BUFFER_HUB_H_
2#define ANDROID_DVR_BUFFERHUBD_BUFFER_HUB_H_
3
4#include <memory>
5#include <string>
6#include <unordered_map>
7
8#include <hardware/gralloc.h>
9#include <pdx/service.h>
Corey Tabaka1db8a5d2017-03-22 02:12:52 -070010#include <private/dvr/bufferhub_rpc.h>
Alex Vakulenkoe4eec202017-01-27 14:41:04 -080011
12namespace android {
13namespace dvr {
14
15class BufferHubService;
16class ConsumerChannel;
17class ProducerChannel;
18class ConsumerQueueChannel;
19class ProducerQueueChannel;
20
21class BufferHubChannel : public pdx::Channel {
22 public:
23 enum ChannelType {
24 kProducerType,
25 kConsumerType,
Jiwen 'Steve' Cai23c1a732018-03-12 12:16:47 -070026 kDetachedBufferType,
Alex Vakulenkoe4eec202017-01-27 14:41:04 -080027 kProducerQueueType,
28 kConsumerQueueType,
29 };
30
Alex Vakulenkoe4eec202017-01-27 14:41:04 -080031 BufferHubChannel(BufferHubService* service, int buffer_id, int channel_id,
32 ChannelType channel_type)
33 : service_(service),
34 buffer_id_(buffer_id),
35 channel_id_(channel_id),
36 channel_type_(channel_type) {}
37 virtual ~BufferHubChannel() {}
38
39 virtual bool HandleMessage(pdx::Message& message) = 0;
40 virtual void HandleImpulse(pdx::Message& message) = 0;
41
42 // Captures buffer info for use by BufferHubService::DumpState().
43 struct BufferInfo {
44 // Common data field shared by BufferProducer and ProducerQueue.
45 int id = -1;
46 int type = -1;
47 size_t consumer_count = 0;
48
49 // Data field for buffer producer.
Corey Tabakacd52dd92017-04-07 18:03:57 -070050 uint32_t width = 0;
51 uint32_t height = 0;
Hendrik Wagenaar108e84f2017-05-07 22:19:17 -070052 uint32_t layer_count = 0;
Corey Tabakacd52dd92017-04-07 18:03:57 -070053 uint32_t format = 0;
Jiwen 'Steve' Cai0057fdd2017-05-02 11:21:18 -070054 uint64_t usage = 0;
Corey Tabaka52ea25c2017-09-13 18:02:48 -070055 size_t pending_count = 0;
56 uint64_t state = 0;
57 uint64_t signaled_mask = 0;
58 uint64_t index = 0;
Alex Vakulenkoe4eec202017-01-27 14:41:04 -080059
60 // Data filed for producer queue.
61 size_t capacity = 0;
Jiwen 'Steve' Cai0057fdd2017-05-02 11:21:18 -070062 UsagePolicy usage_policy{0, 0, 0, 0};
Alex Vakulenkoe4eec202017-01-27 14:41:04 -080063
Corey Tabakacd52dd92017-04-07 18:03:57 -070064 BufferInfo(int id, size_t consumer_count, uint32_t width, uint32_t height,
Corey Tabaka52ea25c2017-09-13 18:02:48 -070065 uint32_t layer_count, uint32_t format, uint64_t usage,
66 size_t pending_count, uint64_t state, uint64_t signaled_mask,
Jiwen 'Steve' Cai2f260332018-02-15 18:39:47 -080067 uint64_t index)
Alex Vakulenkoe4eec202017-01-27 14:41:04 -080068 : id(id),
69 type(kProducerType),
70 consumer_count(consumer_count),
71 width(width),
72 height(height),
Hendrik Wagenaar108e84f2017-05-07 22:19:17 -070073 layer_count(layer_count),
Alex Vakulenkoe4eec202017-01-27 14:41:04 -080074 format(format),
Jiwen 'Steve' Cai0057fdd2017-05-02 11:21:18 -070075 usage(usage),
Corey Tabaka52ea25c2017-09-13 18:02:48 -070076 pending_count(pending_count),
77 state(state),
78 signaled_mask(signaled_mask),
Jiwen 'Steve' Cai2f260332018-02-15 18:39:47 -080079 index(index) {}
Alex Vakulenkoe4eec202017-01-27 14:41:04 -080080
Corey Tabaka1db8a5d2017-03-22 02:12:52 -070081 BufferInfo(int id, size_t consumer_count, size_t capacity,
Corey Tabakacd52dd92017-04-07 18:03:57 -070082 const UsagePolicy& usage_policy)
Alex Vakulenkoe4eec202017-01-27 14:41:04 -080083 : id(id),
84 type(kProducerQueueType),
85 consumer_count(consumer_count),
86 capacity(capacity),
Corey Tabakacd52dd92017-04-07 18:03:57 -070087 usage_policy(usage_policy) {}
Alex Vakulenkoe4eec202017-01-27 14:41:04 -080088
89 BufferInfo() {}
90 };
91
92 // Returns the buffer info for this buffer.
93 virtual BufferInfo GetBufferInfo() const = 0;
94
95 // Signal the client fd that an ownership change occurred using POLLIN.
96 void SignalAvailable();
97
98 // Clear the ownership change event.
99 void ClearAvailable();
100
101 // Signal hangup event.
102 void Hangup();
103
104 BufferHubService* service() const { return service_; }
105 ChannelType channel_type() const { return channel_type_; }
106 int buffer_id() const { return buffer_id_; }
107
108 int channel_id() const { return channel_id_; }
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800109
Corey Tabaka52ea25c2017-09-13 18:02:48 -0700110 bool signaled() const { return signaled_; }
111
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800112 private:
113 BufferHubService* service_;
114
115 // Static id of the buffer for logging and informational purposes. This id
116 // does not change for the life of the buffer.
117 // TODO(eieio): Consider using an id allocator instead of the originating
118 // channel id; channel ids wrap after 2^31 ids, but this is not a problem in
119 // general because channel ids are not used for any lookup in this service.
120 int buffer_id_;
121
Jiwen 'Steve' Cai2f260332018-02-15 18:39:47 -0800122 // The channel id of the buffer.
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800123 int channel_id_;
124
Corey Tabaka52ea25c2017-09-13 18:02:48 -0700125 bool signaled_;
126
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800127 ChannelType channel_type_;
128
129 BufferHubChannel(const BufferHubChannel&) = delete;
130 void operator=(const BufferHubChannel&) = delete;
131};
132
133class BufferHubService : public pdx::ServiceBase<BufferHubService> {
134 public:
135 BufferHubService();
136 ~BufferHubService() override;
137
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700138 pdx::Status<void> HandleMessage(pdx::Message& message) override;
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800139 void HandleImpulse(pdx::Message& message) override;
140
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800141 bool IsInitialized() const override;
142 std::string DumpState(size_t max_length) override;
143
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800144 private:
145 friend BASE;
146
Jiwen 'Steve' Cai0057fdd2017-05-02 11:21:18 -0700147 pdx::Status<void> OnCreateBuffer(pdx::Message& message, uint32_t width,
148 uint32_t height, uint32_t format,
Hendrik Wagenaar4d3590f2017-05-06 22:36:04 -0700149 uint64_t usage, size_t meta_size_bytes);
Jiwen 'Steve' Caia8049a22018-03-28 15:14:02 -0700150 pdx::Status<void> OnCreateDetachedBuffer(pdx::Message& message,
151 uint32_t width, uint32_t height,
152 uint32_t layer_count,
153 uint32_t format, uint64_t usage,
154 size_t user_metadata_size);
Jiwen 'Steve' Cai6bffc672017-05-18 23:05:05 -0700155 pdx::Status<QueueInfo> OnCreateProducerQueue(
156 pdx::Message& message, const ProducerQueueConfig& producer_config,
157 const UsagePolicy& usage_policy);
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800158
159 BufferHubService(const BufferHubService&) = delete;
160 void operator=(const BufferHubService&) = delete;
161};
162
163} // namespace dvr
164} // namespace android
165
166#endif // ANDROID_DVR_BUFFERHUBD_BUFFER_HUB_H_