blob: 55cf96920d81acd32e12de3dbcf3e39dc51b3df6 [file] [log] [blame]
Alex Vakulenkoe4eec202017-01-27 14:41:04 -08001#ifndef ANDROID_DVR_BUFFERHUBD_CONSUMER_CHANNEL_H_
2#define ANDROID_DVR_BUFFERHUBD_CONSUMER_CHANNEL_H_
3
4#include "buffer_hub.h"
5
6#include <pdx/rpc/buffer_wrapper.h>
7#include <private/dvr/bufferhub_rpc.h>
8
9namespace android {
10namespace dvr {
11
12// Consumer channels are attached to a Producer channel
13class ConsumerChannel : public BufferHubChannel {
14 public:
Corey Tabaka52ea25c2017-09-13 18:02:48 -070015 using BorrowedHandle = pdx::BorrowedHandle;
Alex Vakulenkoe4eec202017-01-27 14:41:04 -080016 using Channel = pdx::Channel;
17 using Message = pdx::Message;
18
19 ConsumerChannel(BufferHubService* service, int buffer_id, int channel_id,
Corey Tabaka52ea25c2017-09-13 18:02:48 -070020 uint64_t consumer_state_bit,
Alex Vakulenkoe4eec202017-01-27 14:41:04 -080021 const std::shared_ptr<Channel> producer);
22 ~ConsumerChannel() override;
23
24 bool HandleMessage(Message& message) override;
25 void HandleImpulse(Message& message) override;
26
Corey Tabaka52ea25c2017-09-13 18:02:48 -070027 uint64_t consumer_state_bit() const { return consumer_state_bit_; }
Alex Vakulenkoe4eec202017-01-27 14:41:04 -080028 BufferInfo GetBufferInfo() const override;
29
30 bool OnProducerPosted();
31 void OnProducerClosed();
32
33 private:
Alex Vakulenkoe4eec202017-01-27 14:41:04 -080034 std::shared_ptr<ProducerChannel> GetProducer() const;
35
Corey Tabaka52ea25c2017-09-13 18:02:48 -070036 pdx::Status<BufferDescription<BorrowedHandle>> OnGetBuffer(Message& message);
37
38 pdx::Status<LocalFence> OnConsumerAcquire(Message& message);
Corey Tabakacd52dd92017-04-07 18:03:57 -070039 pdx::Status<void> OnConsumerRelease(Message& message,
40 LocalFence release_fence);
41 pdx::Status<void> OnConsumerSetIgnore(Message& message, bool ignore);
Alex Vakulenkoe4eec202017-01-27 14:41:04 -080042
Corey Tabaka52ea25c2017-09-13 18:02:48 -070043 uint64_t consumer_state_bit_{0};
Corey Tabakad53870c2017-07-06 18:04:27 -070044 bool acquired_{false};
45 bool released_{true};
46 bool ignored_{false}; // True if we are ignoring events.
Alex Vakulenkoe4eec202017-01-27 14:41:04 -080047 std::weak_ptr<Channel> producer_;
48
49 ConsumerChannel(const ConsumerChannel&) = delete;
50 void operator=(const ConsumerChannel&) = delete;
51};
52
53} // namespace dvr
54} // namespace android
55
56#endif // ANDROID_DVR_BUFFERHUBD_CONSUMER_CHANNEL_H_