blob: 62a8d63b38b06d9a87dca6cedb7fdb08a6cdeb4a [file] [log] [blame]
#ifndef ANDROID_FRAMEWORKS_BUFFERHUB_V1_0_BUFFER_NODE_H_
#define ANDROID_FRAMEWORKS_BUFFERHUB_V1_0_BUFFER_NODE_H_
#include <android/hardware_buffer.h>
#include <bufferhub/BufferHubIdGenerator.h>
#include <cutils/native_handle.h>
#include <ui/BufferHubEventFd.h>
#include <ui/BufferHubMetadata.h>
namespace android {
namespace frameworks {
namespace bufferhub {
namespace V1_0 {
namespace implementation {
class BufferNode {
public:
// Allocates a new BufferNode.
BufferNode(uint32_t width, uint32_t height, uint32_t layerCount, uint32_t format,
uint64_t usage, size_t userMetadataSize, int id = -1);
~BufferNode();
// Returns whether the object holds a valid metadata.
bool isValid() const { return mMetadata.isValid(); }
int id() const { return mId; }
size_t userMetadataSize() const { return mMetadata.userMetadataSize(); }
// Accessors of the buffer description and handle
const native_handle_t* bufferHandle() const { return mBufferHandle; }
const AHardwareBuffer_Desc& bufferDesc() const { return mBufferDesc; }
// Accessor of event fd.
const BufferHubEventFd& eventFd() const { return mEventFd; }
// Accessors of mMetadata.
const BufferHubMetadata& metadata() const { return mMetadata; }
// Gets the current value of mActiveClientsBitMask in mMetadata with
// std::memory_order_acquire, so that all previous releases of
// mActiveClientsBitMask from all threads will be returned here.
uint32_t getActiveClientsBitMask() const;
// Find and add a new client state mask to mActiveClientsBitMask in
// mMetadata.
// Return the new client state mask that is added to mActiveClientsBitMask.
// Return 0U if there are already 16 clients of the buffer.
uint32_t addNewActiveClientsBitToMask();
// Removes the value from active_clients_bit_mask in mMetadata with
// std::memory_order_release, so that the change will be visible to any
// acquire of mActiveClientsBitMask in any threads after the succeed of
// this operation.
void removeClientsBitFromMask(const uint32_t& value);
private:
// Helper method for constructors to initialize atomic metadata header
// variables in shared memory.
void initializeMetadata();
// Gralloc buffer handles.
native_handle_t* mBufferHandle;
AHardwareBuffer_Desc mBufferDesc;
// Eventfd used for signalling buffer events among the clients of the buffer.
BufferHubEventFd mEventFd;
// Metadata in shared memory.
BufferHubMetadata mMetadata;
// A system-unique id generated by bufferhub from 0 to std::numeric_limits<int>::max().
// BufferNodes not created by bufferhub will have id < 0, meaning "not specified".
// TODO(b/118891412): remove default id = -1 and update comments after pdx is no longer in use
const int mId = -1;
// The following variables are atomic variables in mMetadata that are visible
// to Bn object and Bp objects. Please find more info in
// BufferHubDefs::MetadataHeader.
// mBufferState tracks the state of the buffer. Buffer can be in one of these
// four states: gained, posted, acquired, released.
std::atomic<uint32_t>* mBufferState = nullptr;
// TODO(b/112012161): add comments to mFenceState.
std::atomic<uint32_t>* mFenceState = nullptr;
// mActiveClientsBitMask tracks all the bp clients of the buffer. It is the
// union of all client_state_mask of all bp clients.
std::atomic<uint32_t>* mActiveClientsBitMask = nullptr;
};
} // namespace implementation
} // namespace V1_0
} // namespace bufferhub
} // namespace frameworks
} // namespace android
#endif // ANDROID_FRAMEWORKS_BUFFERHUB_V1_0_BUFFER_NODE_H_