1e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#ifndef ANDROID_DVR_BUFFER_HUB_CLIENT_H_ 2e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#define ANDROID_DVR_BUFFER_HUB_CLIENT_H_ 3e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 4e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <hardware/gralloc.h> 5e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <pdx/channel_handle.h> 6e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <pdx/client.h> 7e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <pdx/file_handle.h> 8e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <pdx/status.h> 9e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 10e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <vector> 11e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 12e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <private/dvr/ion_buffer.h> 13e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 14e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkonamespace android { 15e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkonamespace dvr { 16e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 17e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoclass BufferHubBuffer : public pdx::Client { 18e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko public: 19e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko using LocalHandle = pdx::LocalHandle; 20e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko using LocalChannelHandle = pdx::LocalChannelHandle; 21e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko template <typename T> 22e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko using Status = pdx::Status<T>; 23e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 24e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Create a new consumer channel that is attached to the producer. Returns 25e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // a file descriptor for the new channel or a negative error code. 26e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko Status<LocalChannelHandle> CreateConsumer(); 27e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 28e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Polls the fd for |timeout_ms| milliseconds (-1 for infinity). 29e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko int Poll(int timeout_ms); 30e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 31e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Locks the area specified by (x, y, width, height) for a specific usage. If 32e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // the usage is software then |addr| will be updated to point to the address 33e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // of the buffer in virtual memory. The caller should only access/modify the 34e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // pixels in the specified area. anything else is undefined behavior. 354d3590f3fd0fd65f4e8758d3228de9f55cf135d0Hendrik Wagenaar int Lock(int usage, int x, int y, int width, int height, void** addr); 36e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 37e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Must be called after Lock() when the caller has finished changing the 38e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // buffer. 394d3590f3fd0fd65f4e8758d3228de9f55cf135d0Hendrik Wagenaar int Unlock(); 40e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 41e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Gets a blob buffer that was created with BufferProducer::CreateBlob. 42e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Locking and Unlocking is handled internally. There's no need to Unlock 43e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // after calling this method. 44e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko int GetBlobReadWritePointer(size_t size, void** addr); 45e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 46e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Gets a blob buffer that was created with BufferProducer::CreateBlob. 47e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Locking and Unlocking is handled internally. There's no need to Unlock 48e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // after calling this method. 49e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko int GetBlobReadOnlyPointer(size_t size, void** addr); 50e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 51e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Returns a dup'd file descriptor for accessing the blob shared memory. The 52e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // caller takes ownership of the file descriptor and must close it or pass on 53e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // ownership. Some GPU API extensions can take file descriptors to bind shared 54e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // memory gralloc buffers to GPU buffer objects. 55e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko LocalHandle GetBlobFd() const { 56e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Current GPU vendor puts the buffer allocation in one FD. If we change GPU 57e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // vendors and this is the wrong fd, late-latching and EDS will very clearly 58e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // stop working and we will need to correct this. The alternative is to use 59e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // a GL context in the pose service to allocate this buffer or to use the 60e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // ION API directly instead of gralloc. 61e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return LocalHandle(dup(native_handle()->data[0])); 62e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 63e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 6410e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar // Get up to |max_fds_count| file descriptors for accessing the blob shared 6510e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar // memory. |fds_count| will contain the actual number of file descriptors. 6610e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar void GetBlobFds(int* fds, size_t* fds_count, size_t max_fds_count) const; 6710e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar 68e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko using Client::event_fd; 693079cb7c32421099a73e1a774b228635eeb3f189Corey Tabaka 703079cb7c32421099a73e1a774b228635eeb3f189Corey Tabaka Status<int> GetEventMask(int events) { 713079cb7c32421099a73e1a774b228635eeb3f189Corey Tabaka if (auto* client_channel = GetChannel()) { 723079cb7c32421099a73e1a774b228635eeb3f189Corey Tabaka return client_channel->GetEventMask(events); 733079cb7c32421099a73e1a774b228635eeb3f189Corey Tabaka } else { 743079cb7c32421099a73e1a774b228635eeb3f189Corey Tabaka return pdx::ErrorStatus(EINVAL); 753079cb7c32421099a73e1a774b228635eeb3f189Corey Tabaka } 763079cb7c32421099a73e1a774b228635eeb3f189Corey Tabaka } 773079cb7c32421099a73e1a774b228635eeb3f189Corey Tabaka 78e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko native_handle_t* native_handle() const { 794d3590f3fd0fd65f4e8758d3228de9f55cf135d0Hendrik Wagenaar return const_cast<native_handle_t*>(buffer_.handle()); 80e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 812655e1cd5498749381701aa1fa7f29c66364a7efCorey Tabaka 824d3590f3fd0fd65f4e8758d3228de9f55cf135d0Hendrik Wagenaar IonBuffer* buffer() { return &buffer_; } 834d3590f3fd0fd65f4e8758d3228de9f55cf135d0Hendrik Wagenaar const IonBuffer* buffer() const { return &buffer_; } 84e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 85e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko int id() const { return id_; } 86e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 87e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // The following methods return settings of the first buffer. Currently, 88e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // it is only possible to create multi-buffer BufferHubBuffers with the same 89e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // settings. 904d3590f3fd0fd65f4e8758d3228de9f55cf135d0Hendrik Wagenaar uint32_t width() const { return buffer_.width(); } 914d3590f3fd0fd65f4e8758d3228de9f55cf135d0Hendrik Wagenaar uint32_t height() const { return buffer_.height(); } 924d3590f3fd0fd65f4e8758d3228de9f55cf135d0Hendrik Wagenaar uint32_t stride() const { return buffer_.stride(); } 934d3590f3fd0fd65f4e8758d3228de9f55cf135d0Hendrik Wagenaar uint32_t format() const { return buffer_.format(); } 944d3590f3fd0fd65f4e8758d3228de9f55cf135d0Hendrik Wagenaar uint32_t usage() const { return buffer_.usage(); } 954d3590f3fd0fd65f4e8758d3228de9f55cf135d0Hendrik Wagenaar uint32_t layer_count() const { return buffer_.layer_count(); } 96044963e1dd0479035b6e5f2c6bd618bde7143710Jiwen 'Steve' Cai 97ec971362bc651d8c98febb8399981877da859c14Corey Tabaka // TODO(b/37881101) Clean up producer/consumer usage. 984d3590f3fd0fd65f4e8758d3228de9f55cf135d0Hendrik Wagenaar uint64_t producer_usage() const { return buffer_.usage(); } 994d3590f3fd0fd65f4e8758d3228de9f55cf135d0Hendrik Wagenaar uint64_t consumer_usage() const { return buffer_.usage(); } 100ec971362bc651d8c98febb8399981877da859c14Corey Tabaka 101e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko protected: 102e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko explicit BufferHubBuffer(LocalChannelHandle channel); 103e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko explicit BufferHubBuffer(const std::string& endpoint_path); 104e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko virtual ~BufferHubBuffer(); 105e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 106e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Initialization helper. 107e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko int ImportBuffer(); 108e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 109e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko private: 110e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko BufferHubBuffer(const BufferHubBuffer&) = delete; 111e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko void operator=(const BufferHubBuffer&) = delete; 112e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 113e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Global id for the buffer that is consistent across processes. It is meant 114e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // for logging and debugging purposes only and should not be used for lookup 115e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // or any other functional purpose as a security precaution. 116e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko int id_; 117e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 1184d3590f3fd0fd65f4e8758d3228de9f55cf135d0Hendrik Wagenaar IonBuffer buffer_; 119e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}; 120e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 121e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// This represents a writable buffer. Calling Post notifies all clients and 122e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// makes the buffer read-only. Call Gain to acquire write access. A buffer 123e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// may have many consumers. 124e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// 125e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// The user of BufferProducer is responsible with making sure that the Post() is 126e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// done with the correct metadata type and size. The user is also responsible 127e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// for making sure that remote ends (BufferConsumers) are also using the correct 128e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// metadata when acquiring the buffer. The API guarantees that a Post() with a 129e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// metadata of wrong size will fail. However, it currently does not do any 130e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// type checking. 131e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// The API also assumes that metadata is a serializable type (plain old data). 132e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoclass BufferProducer : public pdx::ClientBase<BufferProducer, BufferHubBuffer> { 133e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko public: 134e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Imports a bufferhub producer channel, assuming ownership of its handle. 135e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko static std::unique_ptr<BufferProducer> Import(LocalChannelHandle channel); 136e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko static std::unique_ptr<BufferProducer> Import( 137e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko Status<LocalChannelHandle> status); 138e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 139e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Post this buffer, passing |ready_fence| to the consumers. The bytes in 140e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // |meta| are passed unaltered to the consumers. The producer must not modify 141e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // the buffer until it is re-gained. 142e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // This returns zero or a negative unix error code. 143e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko int Post(const LocalHandle& ready_fence, const void* meta, 144e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko size_t meta_size_bytes); 145e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 146e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko template <typename Meta, 147e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko typename = typename std::enable_if<std::is_void<Meta>::value>::type> 148e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko int Post(const LocalHandle& ready_fence) { 149e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return Post(ready_fence, nullptr, 0); 150e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 1512655e1cd5498749381701aa1fa7f29c66364a7efCorey Tabaka template <typename Meta, typename = typename std::enable_if< 1522655e1cd5498749381701aa1fa7f29c66364a7efCorey Tabaka !std::is_void<Meta>::value>::type> 153e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko int Post(const LocalHandle& ready_fence, const Meta& meta) { 154e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return Post(ready_fence, &meta, sizeof(meta)); 155e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 156e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 157e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Attempt to re-gain the buffer for writing. If |release_fence| is valid, it 158e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // must be waited on before using the buffer. If it is not valid then the 159e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // buffer is free for immediate use. This call will only succeed if the buffer 160e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // is in the released state. 161e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // This returns zero or a negative unix error code. 162e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko int Gain(LocalHandle* release_fence); 163e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 164e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Asynchronously marks a released buffer as gained. This method is similar to 165e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // the synchronous version above, except that it does not wait for BufferHub 166e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // to acknowledge success or failure, nor does it transfer a release fence to 167e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // the client. This version may be used in situations where a release fence is 168e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // not needed. Because of the asynchronous nature of the underlying message, 169e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // no error is returned if this method is called when the buffer is in an 170e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // incorrect state. Returns zero if sending the message succeeded, or a 171e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // negative errno code otherwise. 172e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko int GainAsync(); 173e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 174e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Attaches the producer to |name| so that it becomes a persistent buffer that 175e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // may be retrieved by name at a later time. This may be used in cases where a 176e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // shared memory buffer should persist across the life of the producer process 177e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // (i.e. the buffer may be held by clients across a service restart). The 178e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // buffer may be associated with a user and/or group id to restrict access to 179e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // the buffer. If user_id or group_id is -1 then checks for the respective id 180e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // are disabled. If user_id or group_id is 0 then the respective id of the 181e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // calling process is used instead. 182e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko int MakePersistent(const std::string& name, int user_id, int group_id); 183e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 184e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Removes the persistence of the producer. 185e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko int RemovePersistence(); 186e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 187e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko private: 188e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko friend BASE; 189e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 190e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Constructors are automatically exposed through BufferProducer::Create(...) 191e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // static template methods inherited from ClientBase, which take the same 192e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // arguments as the constructors. 193e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 194e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Constructs a buffer with the given geometry and parameters. 195cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka BufferProducer(uint32_t width, uint32_t height, uint32_t format, 1964d3590f3fd0fd65f4e8758d3228de9f55cf135d0Hendrik Wagenaar uint32_t usage, size_t metadata_size = 0); 197ec971362bc651d8c98febb8399981877da859c14Corey Tabaka BufferProducer(uint32_t width, uint32_t height, uint32_t format, 198ec971362bc651d8c98febb8399981877da859c14Corey Tabaka uint64_t producer_usage, uint64_t consumer_usage, 1994d3590f3fd0fd65f4e8758d3228de9f55cf135d0Hendrik Wagenaar size_t metadata_size); 200e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 201e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Constructs a persistent buffer with the given geometry and parameters and 202e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // binds it to |name| in one shot. If a persistent buffer with the same name 203e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // and settings already exists and matches the given geometry and parameters, 204e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // that buffer is connected to this client instead of creating a new buffer. 205e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // If the name matches but the geometry or settings do not match then 206e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // construction fails and BufferProducer::Create() returns nullptr. 207e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // 208e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Access to the persistent buffer may be restricted by |user_id| and/or 209e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // |group_id|; these settings are established only when the buffer is first 210e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // created and cannot be changed. A user or group id of -1 disables checks for 211e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // that respective id. A user or group id of 0 is substituted with the 212e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // effective user or group id of the calling process. 213cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka BufferProducer(const std::string& name, int user_id, int group_id, 214cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka uint32_t width, uint32_t height, uint32_t format, 2154d3590f3fd0fd65f4e8758d3228de9f55cf135d0Hendrik Wagenaar uint32_t usage, size_t metadata_size = 0); 216ec971362bc651d8c98febb8399981877da859c14Corey Tabaka BufferProducer(const std::string& name, int user_id, int group_id, 217ec971362bc651d8c98febb8399981877da859c14Corey Tabaka uint32_t width, uint32_t height, uint32_t format, 218ec971362bc651d8c98febb8399981877da859c14Corey Tabaka uint64_t producer_usage, uint64_t consumer_usage, 2194d3590f3fd0fd65f4e8758d3228de9f55cf135d0Hendrik Wagenaar size_t meta_size_bytes); 220e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 221e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Constructs a blob (flat) buffer with the given usage flags. 222ec971362bc651d8c98febb8399981877da859c14Corey Tabaka BufferProducer(uint32_t usage, size_t size); 223ec971362bc651d8c98febb8399981877da859c14Corey Tabaka BufferProducer(uint64_t producer_usage, uint64_t consumer_usage, size_t size); 224e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 225e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Constructs a persistent blob (flat) buffer and binds it to |name|. 226cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka BufferProducer(const std::string& name, int user_id, int group_id, 227ec971362bc651d8c98febb8399981877da859c14Corey Tabaka uint32_t usage, size_t size); 228ec971362bc651d8c98febb8399981877da859c14Corey Tabaka BufferProducer(const std::string& name, int user_id, int group_id, 229ec971362bc651d8c98febb8399981877da859c14Corey Tabaka uint64_t producer_usage, uint64_t consumer_usage, size_t size); 230e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 231e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Constructs a channel to persistent buffer by name only. The buffer must 232e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // have been previously created or made persistent. 233e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko explicit BufferProducer(const std::string& name); 234e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 235e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Imports the given file handle to a producer channel, taking ownership. 236e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko explicit BufferProducer(LocalChannelHandle channel); 237e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}; 238e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 239e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// This is a connection to a producer buffer, which can be located in another 240e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// application. When that buffer is Post()ed, this fd will be signaled and 241e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Acquire allows read access. The user is responsible for making sure that 242e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Acquire is called with the correct metadata structure. The only guarantee the 243e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// API currently provides is that an Acquire() with metadata of the wrong size 244e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// will fail. 245e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoclass BufferConsumer : public pdx::ClientBase<BufferConsumer, BufferHubBuffer> { 246e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko public: 247e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // This call assumes ownership of |fd|. 248e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko static std::unique_ptr<BufferConsumer> Import(LocalChannelHandle channel); 249e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko static std::unique_ptr<BufferConsumer> Import( 250e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko Status<LocalChannelHandle> status); 251e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 252e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Attempt to retrieve a post event from buffer hub. If successful, 253e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // |ready_fence| will be set to a fence to wait on until the buffer is ready. 254e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // This call will only succeed after the fd is signalled. This call may be 255e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // performed as an alternative to the Acquire() with metadata. In such cases 256e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // the metadata is not read. 257e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // 258e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // This returns zero or negative unix error code. 259e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko int Acquire(LocalHandle* ready_fence); 260e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 261e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Attempt to retrieve a post event from buffer hub. If successful, 262e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // |ready_fence| is set to a fence signaling that the contents of the buffer 263e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // are available. This call will only succeed if the buffer is in the posted 264e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // state. 265e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Returns zero on success, or a negative errno code otherwise. 266e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko int Acquire(LocalHandle* ready_fence, void* meta, size_t meta_size_bytes); 267e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 268e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Attempt to retrieve a post event from buffer hub. If successful, 269e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // |ready_fence| is set to a fence to wait on until the buffer is ready. This 270e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // call will only succeed after the fd is signaled. This returns zero or a 271e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // negative unix error code. 272e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko template <typename Meta> 273e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko int Acquire(LocalHandle* ready_fence, Meta* meta) { 274e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return Acquire(ready_fence, meta, sizeof(*meta)); 275e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 276e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 277e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // This should be called after a successful Acquire call. If the fence is 278e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // valid the fence determines the buffer usage, otherwise the buffer is 279e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // released immediately. 280e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // This returns zero or a negative unix error code. 281e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko int Release(const LocalHandle& release_fence); 282e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 283e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Asynchronously releases a buffer. Similar to the synchronous version above, 284e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // except that it does not wait for BufferHub to reply with success or error, 285e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // nor does it transfer a release fence. This version may be used in 286e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // situations where a release fence is not needed. Because of the asynchronous 287e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // nature of the underlying message, no error is returned if this method is 288e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // called when the buffer is in an incorrect state. Returns zero if sending 289e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // the message succeeded, or a negative errno code otherwise. 290e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko int ReleaseAsync(); 291e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 292e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // May be called after or instead of Acquire to indicate that the consumer 293e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // does not need to access the buffer this cycle. This returns zero or a 294e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // negative unix error code. 295e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko int Discard(); 296e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 297e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // When set, this consumer is no longer notified when this buffer is 298e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // available. The system behaves as if Discard() is immediately called 299e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // whenever the buffer is posted. If ignore is set to true while a buffer is 300e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // pending, it will act as if Discard() was also called. 301e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // This returns zero or a negative unix error code. 302e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko int SetIgnore(bool ignore); 303e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 304e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko private: 305e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko friend BASE; 306e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 307e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko explicit BufferConsumer(LocalChannelHandle channel); 308e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}; 309e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 310e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} // namespace dvr 311e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} // namespace android 312e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 313e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#endif // ANDROID_DVR_BUFFER_HUB_CLIENT_H_ 314