bufferhub_rpc.h revision cd52dd9f1b301854b4e1734e3741d9cef8f784b1
1#ifndef ANDROID_DVR_BUFFERHUB_RPC_H_
2#define ANDROID_DVR_BUFFERHUB_RPC_H_
3
4#include <cutils/native_handle.h>
5#include <gui/BufferQueueDefs.h>
6#include <sys/types.h>
7
8#include <pdx/channel_handle.h>
9#include <pdx/file_handle.h>
10#include <pdx/rpc/remote_method.h>
11#include <pdx/rpc/serializable.h>
12#include <private/dvr/ion_buffer.h>
13
14namespace android {
15namespace dvr {
16
17template <typename FileHandleType>
18class NativeBufferHandle {
19 public:
20  NativeBufferHandle() { Clear(); }
21  NativeBufferHandle(const IonBuffer& buffer, int id)
22      : id_(id),
23        stride_(buffer.stride()),
24        width_(buffer.width()),
25        height_(buffer.height()),
26        format_(buffer.format()),
27        producer_usage_(buffer.producer_usage()),
28        consumer_usage_(buffer.consumer_usage()) {
29    // Populate the fd and int vectors: native_handle->data[] is an array of fds
30    // followed by an array of opaque ints.
31    const int fd_count = buffer.handle()->numFds;
32    const int int_count = buffer.handle()->numInts;
33    for (int i = 0; i < fd_count; i++) {
34      fds_.emplace_back(FileHandleType::AsDuplicate(buffer.handle()->data[i]));
35    }
36    for (int i = 0; i < int_count; i++) {
37      opaque_ints_.push_back(buffer.handle()->data[fd_count + i]);
38    }
39  }
40  NativeBufferHandle(NativeBufferHandle&& other) = default;
41
42  // Imports the native handle into the given IonBuffer instance.
43  int Import(IonBuffer* buffer) {
44    // This is annoying, but we need to convert the vector of FileHandles into a
45    // vector of ints for the Import API.
46    std::vector<int> fd_ints;
47    for (const auto& fd : fds_)
48      fd_ints.push_back(fd.Get());
49
50    const int ret =
51        buffer->Import(fd_ints.data(), fd_ints.size(), opaque_ints_.data(),
52                       opaque_ints_.size(), width_, height_, stride_, format_,
53                       producer_usage_, consumer_usage_);
54    if (ret < 0)
55      return ret;
56
57    // Import succeeded, release the file handles which are now owned by the
58    // IonBuffer and clear members.
59    for (auto& fd : fds_)
60      fd.Release();
61    opaque_ints_.clear();
62    Clear();
63
64    return 0;
65  }
66
67  int id() const { return id_; }
68  size_t IntCount() const { return opaque_ints_.size(); }
69  size_t FdCount() const { return fds_.size(); }
70
71 private:
72  int id_;
73  uint32_t stride_;
74  uint32_t width_;
75  uint32_t height_;
76  uint32_t format_;
77  uint64_t producer_usage_;
78  uint64_t consumer_usage_;
79  std::vector<int> opaque_ints_;
80  std::vector<FileHandleType> fds_;
81
82  void Clear() {
83    id_ = -1;
84    stride_ = width_ = height_ = format_ = producer_usage_ = consumer_usage_ =
85        0;
86  }
87
88  PDX_SERIALIZABLE_MEMBERS(NativeBufferHandle<FileHandleType>, id_, stride_,
89                           width_, height_, format_, producer_usage_,
90                           consumer_usage_, opaque_ints_, fds_);
91
92  NativeBufferHandle(const NativeBufferHandle&) = delete;
93  void operator=(const NativeBufferHandle&) = delete;
94};
95
96template <typename FileHandleType>
97class FenceHandle {
98 public:
99  FenceHandle() = default;
100  explicit FenceHandle(int fence) : fence_{fence} {}
101  explicit FenceHandle(FileHandleType&& fence) : fence_{std::move(fence)} {}
102  FenceHandle(FenceHandle&&) = default;
103  FenceHandle& operator=(FenceHandle&&) = default;
104
105  explicit operator bool() const { return fence_.IsValid(); }
106
107  const FileHandleType& get() const { fence_; }
108  FileHandleType&& take() { return std::move(fence_); }
109
110  int get_fd() const { return fence_.Get(); }
111  void close() { fence_.Close(); }
112
113  FenceHandle<pdx::BorrowedHandle> borrow() const {
114    return FenceHandle<pdx::BorrowedHandle>(fence_.Borrow());
115  }
116
117 private:
118  FileHandleType fence_;
119
120  PDX_SERIALIZABLE_MEMBERS(FenceHandle<FileHandleType>, fence_);
121
122  FenceHandle(const FenceHandle&) = delete;
123  void operator=(const FenceHandle&) = delete;
124};
125
126using LocalFence = FenceHandle<pdx::LocalHandle>;
127using BorrowedFence = FenceHandle<pdx::BorrowedHandle>;
128
129struct QueueInfo {
130  size_t meta_size_bytes;
131  int id;
132
133 private:
134  PDX_SERIALIZABLE_MEMBERS(QueueInfo, meta_size_bytes, id);
135};
136
137struct UsagePolicy {
138  uint64_t producer_set_mask;
139  uint64_t producer_clear_mask;
140  uint64_t producer_deny_set_mask;
141  uint64_t producer_deny_clear_mask;
142  uint64_t consumer_set_mask;
143  uint64_t consumer_clear_mask;
144  uint64_t consumer_deny_set_mask;
145  uint64_t consumer_deny_clear_mask;
146
147 private:
148  PDX_SERIALIZABLE_MEMBERS(UsagePolicy, producer_set_mask, producer_clear_mask,
149                           producer_deny_set_mask, producer_deny_clear_mask,
150                           consumer_set_mask, consumer_clear_mask,
151                           consumer_deny_set_mask, consumer_deny_clear_mask);
152};
153
154// BufferHub Service RPC interface. Defines the endpoints, op codes, and method
155// type signatures supported by bufferhubd.
156struct BufferHubRPC {
157  // Service path.
158  static constexpr char kClientPath[] = "system/buffer_hub/client";
159
160  // |BufferHubQueue| will keep track of at most this value of buffers.
161  // Attempts at runtime to increase the number of buffers past this
162  // will fail. Note that the value is in sync with |android::BufferQueue|, so
163  // that slot id can be shared between |android::dvr::BufferHubQueueProducer|
164  // and |android::BufferQueueProducer| which both implements the same
165  // interface: |android::IGraphicBufferProducer|.
166  static constexpr size_t kMaxQueueCapacity =
167      android::BufferQueueDefs::NUM_BUFFER_SLOTS;
168
169  // Op codes.
170  enum {
171    kOpCreateBuffer = 0,
172    kOpCreatePersistentBuffer,
173    kOpGetPersistentBuffer,
174    kOpGetBuffer,
175    kOpGetBuffers,
176    kOpNewConsumer,
177    kOpProducerMakePersistent,
178    kOpProducerRemovePersistence,
179    kOpProducerPost,
180    kOpProducerGain,
181    kOpConsumerAcquire,
182    kOpConsumerRelease,
183    kOpConsumerSetIgnore,
184    kOpCreateProducerQueue,
185    kOpCreateConsumerQueue,
186    kOpGetQueueInfo,
187    kOpProducerQueueAllocateBuffers,
188    kOpProducerQueueDetachBuffer,
189    kOpConsumerQueueImportBuffers,
190  };
191
192  // Aliases.
193  using MetaData = pdx::rpc::BufferWrapper<std::uint8_t*>;
194  using LocalChannelHandle = pdx::LocalChannelHandle;
195  using LocalHandle = pdx::LocalHandle;
196  using Void = pdx::rpc::Void;
197
198  // Methods.
199  PDX_REMOTE_METHOD(CreateBuffer, kOpCreateBuffer,
200                    void(uint32_t width, uint32_t height, uint32_t format,
201                         uint64_t producer_usage, uint64_t consumer_usage,
202                         size_t meta_size_bytes, size_t slice_count));
203  PDX_REMOTE_METHOD(CreatePersistentBuffer, kOpCreatePersistentBuffer,
204                    void(const std::string& name, int user_id, int group_id,
205                         uint32_t width, uint32_t height, uint32_t format,
206                         uint64_t producer_usage, uint64_t consumer_usage,
207                         size_t meta_size_bytes, size_t slice_count));
208  PDX_REMOTE_METHOD(GetPersistentBuffer, kOpGetPersistentBuffer,
209                    void(const std::string& name));
210  PDX_REMOTE_METHOD(GetBuffer, kOpGetBuffer,
211                    NativeBufferHandle<LocalHandle>(unsigned index));
212  PDX_REMOTE_METHOD(GetBuffers, kOpGetBuffers,
213                    std::vector<NativeBufferHandle<LocalHandle>>(Void));
214  PDX_REMOTE_METHOD(NewConsumer, kOpNewConsumer, LocalChannelHandle(Void));
215  PDX_REMOTE_METHOD(ProducerMakePersistent, kOpProducerMakePersistent,
216                    void(const std::string& name, int user_id, int group_id));
217  PDX_REMOTE_METHOD(ProducerRemovePersistence, kOpProducerRemovePersistence,
218                    void(Void));
219  PDX_REMOTE_METHOD(ProducerPost, kOpProducerPost,
220                    void(LocalFence acquire_fence, MetaData));
221  PDX_REMOTE_METHOD(ProducerGain, kOpProducerGain, LocalFence(Void));
222  PDX_REMOTE_METHOD(ConsumerAcquire, kOpConsumerAcquire,
223                    std::pair<LocalFence, MetaData>(std::size_t metadata_size));
224  PDX_REMOTE_METHOD(ConsumerRelease, kOpConsumerRelease,
225                    void(LocalFence release_fence));
226  PDX_REMOTE_METHOD(ConsumerSetIgnore, kOpConsumerSetIgnore, void(bool ignore));
227
228  // Buffer Queue Methods.
229  PDX_REMOTE_METHOD(CreateProducerQueue, kOpCreateProducerQueue,
230                    QueueInfo(size_t meta_size_bytes,
231                              const UsagePolicy& usage_policy));
232  PDX_REMOTE_METHOD(CreateConsumerQueue, kOpCreateConsumerQueue,
233                    LocalChannelHandle(Void));
234  PDX_REMOTE_METHOD(GetQueueInfo, kOpGetQueueInfo, QueueInfo(Void));
235  PDX_REMOTE_METHOD(ProducerQueueAllocateBuffers,
236                    kOpProducerQueueAllocateBuffers,
237                    std::vector<std::pair<LocalChannelHandle, size_t>>(
238                        uint32_t width, uint32_t height, uint32_t format,
239                        uint64_t producer_usage, uint64_t consumer_usage,
240                        size_t slice_count, size_t buffer_count));
241  PDX_REMOTE_METHOD(ProducerQueueDetachBuffer, kOpProducerQueueDetachBuffer,
242                    void(size_t slot));
243  PDX_REMOTE_METHOD(ConsumerQueueImportBuffers, kOpConsumerQueueImportBuffers,
244                    std::vector<std::pair<LocalChannelHandle, size_t>>(Void));
245};
246
247}  // namespace dvr
248}  // namespace android
249
250#endif  // ANDROID_DVR_BUFFERHUB_RPC_H_
251