blob: e7ca459164496a62a0334552c39141fc0580317f [file] [log] [blame]
Alex Vakulenkoe4eec202017-01-27 14:41:04 -08001#ifndef ANDROID_DVR_BUFFERHUBD_PRODUCER_CHANNEL_H_
2#define ANDROID_DVR_BUFFERHUBD_PRODUCER_CHANNEL_H_
3
4#include "buffer_hub.h"
5
6#include <functional>
7#include <memory>
8#include <vector>
9
10#include <pdx/channel_handle.h>
11#include <pdx/file_handle.h>
12#include <pdx/rpc/buffer_wrapper.h>
13#include <private/dvr/bufferhub_rpc.h>
14#include <private/dvr/ion_buffer.h>
15
16namespace android {
17namespace dvr {
18
19// The buffer changes ownership according to the following sequence:
20// POST -> ACQUIRE/RELEASE (all consumers) -> GAIN (producer acquires) -> POST
21
22// The producer channel is owned by a single app that writes into buffers and
23// calls POST when drawing is complete. This channel has a set of consumer
24// channels associated with it that are waiting for notifications.
25class ProducerChannel : public BufferHubChannel {
26 public:
27 using Message = pdx::Message;
28 using BorrowedHandle = pdx::BorrowedHandle;
29 using RemoteChannelHandle = pdx::RemoteChannelHandle;
30 template <typename T>
31 using BufferWrapper = pdx::rpc::BufferWrapper<T>;
32
33 static std::shared_ptr<ProducerChannel> Create(
34 BufferHubService* service, int channel_id, int width, int height,
35 int format, int usage, size_t meta_size_bytes, size_t slice_count,
36 int* error);
37
38 ~ProducerChannel() override;
39
40 bool HandleMessage(Message& message) override;
41 void HandleImpulse(Message& message) override;
42
43 BufferInfo GetBufferInfo() const override;
44
45 NativeBufferHandle<BorrowedHandle> OnGetBuffer(Message& message,
46 unsigned index);
47 std::vector<NativeBufferHandle<BorrowedHandle>> OnGetBuffers(
48 Message& message);
49
50 RemoteChannelHandle CreateConsumer(Message& message);
51 RemoteChannelHandle OnNewConsumer(Message& message);
52
53 std::pair<BorrowedFence, BufferWrapper<std::uint8_t*>> OnConsumerAcquire(
54 Message& message, std::size_t metadata_size);
55 int OnConsumerRelease(Message& message, LocalFence release_fence);
56
57 void OnConsumerIgnored();
58
59 void AddConsumer(ConsumerChannel* channel);
60 void RemoveConsumer(ConsumerChannel* channel);
61
62 bool CheckAccess(int euid, int egid);
63 bool CheckParameters(int width, int height, int format, int usage,
64 size_t meta_size_bytes, size_t slice_count);
65
66 int OnProducerMakePersistent(Message& message, const std::string& name,
67 int user_id, int group_id);
68 int OnRemovePersistence(Message& message);
69
70 private:
71 std::vector<ConsumerChannel*> consumer_channels_;
72 // This counts the number of consumers left to process this buffer. If this is
73 // zero then the producer can re-acquire ownership.
74 int pending_consumers_;
75
76 std::vector<IonBuffer> slices_;
77
78 bool producer_owns_;
79 LocalFence post_fence_;
80 LocalFence returned_fence_;
81 size_t meta_size_bytes_;
82 std::unique_ptr<uint8_t[]> meta_;
83
84 static constexpr int kNoCheckId = -1;
85 static constexpr int kUseCallerId = 0;
86 static constexpr int kRootId = 0;
87
88 // User and group id to check when obtaining a persistent buffer.
89 int owner_user_id_ = kNoCheckId;
90 int owner_group_id_ = kNoCheckId;
91
92 std::string name_;
93
94 ProducerChannel(BufferHubService* service, int channel, int width, int height,
95 int format, int usage, size_t meta_size_bytes,
96 size_t slice_count, int* error);
97
98 int OnProducerPost(Message& message, LocalFence acquire_fence,
99 BufferWrapper<std::vector<std::uint8_t>> metadata);
100 LocalFence OnProducerGain(Message& message);
101
102 ProducerChannel(const ProducerChannel&) = delete;
103 void operator=(const ProducerChannel&) = delete;
104};
105
106} // namespace dvr
107} // namespace android
108
109#endif // ANDROID_DVR_BUFFERHUBD_PRODUCER_CHANNEL_H_