15 return AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM;
22 AHardwareBuffer_Desc ahb_desc = {};
28 ahb_desc.usage |= (AHARDWAREBUFFER_USAGE_GPU_FRAMEBUFFER |
29 AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT);
32 ahb_desc.usage |= AHARDWAREBUFFER_USAGE_COMPOSER_OVERLAY;
35 ahb_desc.usage |= AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE;
38 ahb_desc.usage |= AHARDWAREBUFFER_USAGE_CPU_READ_RARELY;
41 ahb_desc.usage |= AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN;
44 ahb_desc.usage |= AHARDWAREBUFFER_USAGE_CPU_WRITE_RARELY;
47 ahb_desc.usage |= AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN;
54 return GetProcTable().AHardwareBuffer_isSupported(&desc) != 0u;
58 : descriptor_(descriptor),
61 VALIDATION_LOG <<
"The hardware buffer descriptor is not allocatable.";
66 AHardwareBuffer* buffer =
nullptr;
68 proc_table.AHardwareBuffer_allocate(&android_descriptor_, &buffer);
69 result != 0 || buffer ==
nullptr) {
70 VALIDATION_LOG <<
"Could not allocate hardware buffer. Error: " << result;
73 buffer_.reset(buffer);
104 return android_descriptor_;
116 AHardwareBuffer* buffer) {
120 uint64_t out_id = 0u;
121 if (
GetProcTable().AHardwareBuffer_getId(buffer, &out_id) != 0) {
128 AHardwareBuffer* buffer) {
129 if (!buffer || !
GetProcTable().AHardwareBuffer_describe) {
132 AHardwareBuffer_Desc desc = {};
138 if (!is_valid_ || !
GetProcTable().AHardwareBuffer_lock) {
144 usage |= AHARDWAREBUFFER_USAGE_CPU_READ_MASK;
147 usage |= AHARDWAREBUFFER_USAGE_CPU_WRITE_MASK;
150 void* buffer =
nullptr;
151 const auto result =
GetProcTable().AHardwareBuffer_lock(
158 return result == 0 ? buffer :
nullptr;
162 if (!is_valid_ || !
GetProcTable().AHardwareBuffer_unlock) {
166 GetProcTable().AHardwareBuffer_unlock(buffer_.get(),
nullptr);
HardwareBuffer(HardwareBufferDescriptor descriptor)
static bool IsAvailableOnPlatform()
const HardwareBufferDescriptor & GetDescriptor() const
AHardwareBuffer * GetHandle() const
const AHardwareBuffer_Desc & GetAndroidDescriptor() const
bool Unlock() const
Unlock a mapping previously locked for CPU access.
static std::optional< AHardwareBuffer_Desc > Describe(AHardwareBuffer *buffer)
void * Lock(CPUAccessType type) const
Lock the buffer for CPU access. This call may fail if the buffer was not created with one the usages ...
std::optional< uint64_t > GetSystemUniqueID() const
Get the system wide unique ID of the hardware buffer if possible. This is only available on Android A...
const ProcTable & GetProcTable()
static AHardwareBuffer_Desc ToAHardwareBufferDesc(const HardwareBufferDescriptor &desc)
static AHardwareBuffer_Format ToAHardwareBufferFormat(HardwareBufferFormat format)
constexpr TSize Max(const TSize &o) const
A descriptor use to specify hardware buffer allocations.
static HardwareBufferDescriptor MakeForSwapchainImage(const ISize &size)
Create a descriptor of the given size that is suitable for use as a swapchain image.
HardwareBufferUsage usage
bool IsAllocatable() const
If hardware buffers can be created using this descriptor. Allocatable descriptors may still cause fai...
HardwareBufferFormat format
bool IsValid() const
If a valid proc table could be setup. This may fail in case of setup on non-Android platforms.