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