blob: ac99a73cc75b31f77a052a35a5d371389beed6fc [file] [log] [blame]
Jiwen 'Steve' Cai2e06c1c2018-07-30 21:35:32 -07001#ifndef ANDROID_DVR_BUFFERHUBD_BUFFER_CHANNEL_H_
2#define ANDROID_DVR_BUFFERHUBD_BUFFER_CHANNEL_H_
3
4#include "buffer_hub.h"
5#include "buffer_node.h"
6
7#include <pdx/channel_handle.h>
8#include <pdx/file_handle.h>
9
10namespace android {
11namespace dvr {
12
13class BufferChannel : public BufferHubChannel {
14 public:
15 ~BufferChannel() override;
16
17 template <typename... Args>
18 static std::unique_ptr<BufferChannel> Create(Args&&... args) {
19 auto buffer = std::unique_ptr<BufferChannel>(
20 new BufferChannel(std::forward<Args>(args)...));
21 return buffer->IsValid() ? std::move(buffer) : nullptr;
22 }
23
24 // Returns whether the object holds a valid graphic buffer.
25 bool IsValid() const {
26 return buffer_node_ != nullptr && buffer_node_->IsValid();
27 }
28
29 // Captures buffer info for use by BufferHubService::DumpState().
30 BufferInfo GetBufferInfo() const override;
31
32 bool HandleMessage(pdx::Message& message) override;
33 void HandleImpulse(pdx::Message& message) override;
34
35 private:
36 // Creates a detached buffer from existing IonBuffers.
37 BufferChannel(BufferHubService* service, int buffer_id, int channel_id,
38 IonBuffer buffer, IonBuffer metadata_buffer,
39 size_t user_metadata_size);
40
41 // Allocates a new detached buffer.
42 BufferChannel(BufferHubService* service, int buffer_id, uint32_t width,
43 uint32_t height, uint32_t layer_count, uint32_t format,
44 uint64_t usage, size_t user_metadata_size);
45
46 // Creates a detached buffer from an existing BufferNode.
47 BufferChannel(BufferHubService* service, int buffer_id, int channel_id,
48 std::shared_ptr<BufferNode> buffer_node,
49 uint64_t buffer_state_bit);
50
51 pdx::Status<BufferDescription<pdx::BorrowedHandle>> OnImport(
52 pdx::Message& message);
53 pdx::Status<pdx::RemoteChannelHandle> OnDuplicate(pdx::Message& message);
54 pdx::Status<pdx::RemoteChannelHandle> OnPromote(pdx::Message& message);
55
56 // The concrete implementation of the Buffer object.
57 std::shared_ptr<BufferNode> buffer_node_;
58
59 // The state bit of this buffer. Must be one the lower 63 bits.
60 uint64_t buffer_state_bit_;
61};
62
63} // namespace dvr
64} // namespace android
65
66#endif // ANDROID_DVR_BUFFERHUBD_BUFFER_CHANNEL_H_