libvendorgraphicbuffer abstracts away the gralloc version used by the system. So vendor modules that need to allocate/map buffers or look into a gralloc buffer's private_handle don't need to depend on a specific version of gralloc or allocator/mapper interfaces.
To use libvendorgraphicbuffer add it as a shared library to your module and #include <VendorGraphicBuffer.h>
Location of header: /hardware/google/gchips/libvendorgraphicbuffer/include
Location of source code: /hardware/google/gchips/libvendorgraphicbuffer/gralloc3 /hardware/google/gchips/libvendorgraphicbuffer/gralloc4
Standard metadata stored in the handle as value
VendorGraphicBufferMeta gmeta;
gmeta.init(dst_handle);
or
VendorGraphicBufferMeta gmeta(dst_handle);
gmeta.fd
gmeta.width
gmeta.format
.....
etc
Please refer to VendorGraphicBufferMeta class to which values are available.
Please contact the Pixel Graphics System Software team if you need access to
metadata not preset here!
Dynamic metadata (stored as file descriptor)
Get them by calling static functions of VendorGraphicBufferMeta
AFBC: static int is_afbc(buffer_handle_t);
Returns 1 if buffer is compressed with AFBC (AFBC 1.0)
Returns 0 if buffer is not compressed.
e.g:
VendorGraphicBufferMeta::is_afbc(handle);
Video MetaData: static void* get_video_metadata(buffer_handle_t);
Returns the address of video metadata that must be type cast to video metadata struct by
the user.
Please DO NOT FREE this address!
e.g:
metaData = (ExynosVideoMeta*)VendorGraphicBufferMeta::get_video_metadata(bufferHandle);
Buffer align information (needed by HWC)
static int get_pad_align(buffer_handle_t, pad_align_t *pad_align);
pad_align_t struct is defined in VendorGraphicBuffer.h header
and gets filled with short int type.
pad_align->align.w
pad_align->align.h
pad_align->pad.w
pad_align->pad.h
Get a Singleton instance of VendorGraphicBufferMapper:
static VendorGraphicBufferMapper& gmapper(VendorGraphicBufferMapper::get());
Create Rect object that will be used as input to mapper function (and android_ycbcr object if locking YUV buffers)
Android::Rect bounds(width, height);
android_ycbcr outLayout;
Android::Rect class is defined in /frameworks/native/libs/ui/include_vndk/ui/Rect.h android_ycbcr struct is diefeind in /system/core/libsystem/include/system/graphics.h
Both headers should get included if you include VendorGraphicBuffer.h
lock the buffer: To make sure you use 64-bit usages while locking the buffer: status_t err = gmapper.lock64(bufferHandle, 64bit_usage, bounds, &vaddr); status_t err = gmapper.lockYCbCr64(bufferHandle, 64_bit_usage, bounds, &outLayout);
You can still use the default mapper functions in the original GraphicBufferMapper class: status_t err = gmapper.lock(....);
Refer to following header if you need to use more mapper functions: /frameworks/native/libs/ui/include_vndk/ui/GraphicBufferMapper.h
unlock the buffer: gmapper.unlock(bufferHandle);
Get a Singleton instnace of VendorGraphicBufferAllocator: VendorGraphicBufferAllocator& gAllocator(VendorGraphicBufferAllocator::get());
Allocate buffer status_t error = gAllocator.allocate(width, height, format, layer_count, allocUsage, &dstBuffer, &dstStride, "requestorName");
To free the buffer gAllocator.free(freeBuffer.bufferHandle);
You can still use the default allocator functions in the original GraphicBufferAllocator class:
Refer to following header if you need to use more mapper functions: /frameworks/native/libs/ui/include_vndk/ui/GraphicBufferAllocator.h
New usages names can be accessed by adding the namespace containing them: using namespace vendor::graphics or using vendor::graphics::BufferUsage using vendor::graphics::VendorGraphicBufferUsage or directly by vendor::graphics::BufferUsage:: vendor::graphics::VendorGraphicBufferUsage::
*** gralloc1 default usages can still be used *** They remain so the users of libvendorgraphicbuffer don't have to change too much code when moving over to libvendorgraphicbuffer. But I recommend moving over the Usages declared in /hardware/interfaces/graphics/common/1.0/types.hal
Instead of using GRALLOC1_PRODUCE_USAGE_VIDEO_DECORDER please consider using BufferUsage::VIDEO_DECORDER
*** But S.LSI specific usages have been RENAMED ***
/* S.LSI specific usages */ enum VendorGraphicBufferUsage { NO_AFBC = 1ULL << 29, NOZEROED = 1ULL << 58, PRIVATE_NONSECURE = 1ULL << 59, VIDEO_PRIVATE_DATA = 1ULL << 60, };
Instead of using GRALLOC1_PRODUCER_USAGE_NO_AFBC,
plese use VendorGraphicBufferUsage::NO_AFBC.
This change was force to remove confusion between Android default and vendor-specific usages.