123c1a735b673a9310f05b893a3d01de38d8c1166Jiwen 'Steve' Cai#ifndef ANDROID_DVR_BUFFERHUBD_DETACHED_BUFFER_CHANNEL_H_
223c1a735b673a9310f05b893a3d01de38d8c1166Jiwen 'Steve' Cai#define ANDROID_DVR_BUFFERHUBD_DETACHED_BUFFER_CHANNEL_H_
323c1a735b673a9310f05b893a3d01de38d8c1166Jiwen 'Steve' Cai
423c1a735b673a9310f05b893a3d01de38d8c1166Jiwen 'Steve' Cai#include "buffer_hub.h"
523c1a735b673a9310f05b893a3d01de38d8c1166Jiwen 'Steve' Cai
6a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai#include <pdx/channel_handle.h>
7a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai#include <pdx/file_handle.h>
823c1a735b673a9310f05b893a3d01de38d8c1166Jiwen 'Steve' Cai
923c1a735b673a9310f05b893a3d01de38d8c1166Jiwen 'Steve' Cainamespace android {
1023c1a735b673a9310f05b893a3d01de38d8c1166Jiwen 'Steve' Cainamespace dvr {
1123c1a735b673a9310f05b893a3d01de38d8c1166Jiwen 'Steve' Cai
1223c1a735b673a9310f05b893a3d01de38d8c1166Jiwen 'Steve' Caiclass DetachedBufferChannel : public BufferHubChannel {
1323c1a735b673a9310f05b893a3d01de38d8c1166Jiwen 'Steve' Cai public:
140728fa93c12145c2337a0033eb69056520b7bcd8Jiwen 'Steve' Cai  ~DetachedBufferChannel() override;
150728fa93c12145c2337a0033eb69056520b7bcd8Jiwen 'Steve' Cai
16a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai  template <typename... Args>
17a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai  static std::unique_ptr<DetachedBufferChannel> Create(Args&&... args) {
18a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai    auto buffer = std::unique_ptr<DetachedBufferChannel>(
19a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai        new DetachedBufferChannel(std::forward<Args>(args)...));
20a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai    return buffer->IsValid() ? std::move(buffer) : nullptr;
21a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai  }
22a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai
23a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai  // Returns whether the object holds a valid graphic buffer.
24a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai  bool IsValid() const {
25a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai    return buffer_.IsValid() && metadata_buffer_.IsValid();
26a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai  }
2723c1a735b673a9310f05b893a3d01de38d8c1166Jiwen 'Steve' Cai
2823c1a735b673a9310f05b893a3d01de38d8c1166Jiwen 'Steve' Cai  size_t user_metadata_size() const { return user_metadata_size_; }
2923c1a735b673a9310f05b893a3d01de38d8c1166Jiwen 'Steve' Cai
3023c1a735b673a9310f05b893a3d01de38d8c1166Jiwen 'Steve' Cai  // Captures buffer info for use by BufferHubService::DumpState().
3123c1a735b673a9310f05b893a3d01de38d8c1166Jiwen 'Steve' Cai  BufferInfo GetBufferInfo() const override;
3223c1a735b673a9310f05b893a3d01de38d8c1166Jiwen 'Steve' Cai
3323c1a735b673a9310f05b893a3d01de38d8c1166Jiwen 'Steve' Cai  bool HandleMessage(pdx::Message& message) override;
3423c1a735b673a9310f05b893a3d01de38d8c1166Jiwen 'Steve' Cai  void HandleImpulse(pdx::Message& message) override;
3523c1a735b673a9310f05b893a3d01de38d8c1166Jiwen 'Steve' Cai
3623c1a735b673a9310f05b893a3d01de38d8c1166Jiwen 'Steve' Cai private:
37a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai  // Creates a detached buffer from existing IonBuffers.
38a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai  DetachedBufferChannel(BufferHubService* service, int buffer_id,
39a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai                        int channel_id, IonBuffer buffer,
40a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai                        IonBuffer metadata_buffer, size_t user_metadata_size);
41a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai
42a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai  // Allocates a new detached buffer.
43a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai  DetachedBufferChannel(BufferHubService* service, int buffer_id,
44a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai                        uint32_t width, uint32_t height, uint32_t layer_count,
45a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai                        uint32_t format, uint64_t usage,
46a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai                        size_t user_metadata_size);
47a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai
48a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai  pdx::Status<BufferDescription<pdx::BorrowedHandle>> OnImport(
49a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai      pdx::Message& message);
5023c1a735b673a9310f05b893a3d01de38d8c1166Jiwen 'Steve' Cai  pdx::Status<pdx::RemoteChannelHandle> OnPromote(pdx::Message& message);
5123c1a735b673a9310f05b893a3d01de38d8c1166Jiwen 'Steve' Cai
5223c1a735b673a9310f05b893a3d01de38d8c1166Jiwen 'Steve' Cai  // Gralloc buffer handles.
5323c1a735b673a9310f05b893a3d01de38d8c1166Jiwen 'Steve' Cai  IonBuffer buffer_;
5423c1a735b673a9310f05b893a3d01de38d8c1166Jiwen 'Steve' Cai  IonBuffer metadata_buffer_;
5523c1a735b673a9310f05b893a3d01de38d8c1166Jiwen 'Steve' Cai
5623c1a735b673a9310f05b893a3d01de38d8c1166Jiwen 'Steve' Cai  // Size of user requested metadata.
5723c1a735b673a9310f05b893a3d01de38d8c1166Jiwen 'Steve' Cai  const size_t user_metadata_size_;
5823c1a735b673a9310f05b893a3d01de38d8c1166Jiwen 'Steve' Cai};
5923c1a735b673a9310f05b893a3d01de38d8c1166Jiwen 'Steve' Cai
6023c1a735b673a9310f05b893a3d01de38d8c1166Jiwen 'Steve' Cai}  // namespace dvr
6123c1a735b673a9310f05b893a3d01de38d8c1166Jiwen 'Steve' Cai}  // namespace android
6223c1a735b673a9310f05b893a3d01de38d8c1166Jiwen 'Steve' Cai
6323c1a735b673a9310f05b893a3d01de38d8c1166Jiwen 'Steve' Cai#endif  // ANDROID_DVR_BUFFERHUBD_DETACHED_BUFFER_CHANNEL_H_
64