1# VendorGraphicBuffer 2 3libvendorgraphicbuffer abstracts away the gralloc version used by the system. 4So vendor modules that need to allocate/map buffers or look into a gralloc buffer's private_handle 5don't need to depend on a specific version of gralloc or allocator/mapper interfaces. 6 7 8To use libvendorgraphicbuffer add it as a shared library to your module and 9#include <VendorGraphicBuffer.h> 10 11Location of header: 12/hardware/google/gchips/libvendorgraphicbuffer/include 13 14Location of source code: 15/hardware/google/gchips/libvendorgraphicbuffer/gralloc3 16/hardware/google/gchips/libvendorgraphicbuffer/gralloc4 17 18 19 20### How to look at the buffer handle's metadata ### 21 22Standard metadata stored in the handle as value 23 24 VendorGraphicBufferMeta gmeta; 25 gmeta.init(dst_handle); 26 27 or 28 29 VendorGraphicBufferMeta gmeta(dst_handle); 30 31 32 gmeta.fd 33 gmeta.width 34 gmeta.format 35 ..... 36 etc 37 38 Please refer to VendorGraphicBufferMeta class to which values are available. 39 Please contact the Pixel Graphics System Software team if you need access to 40 metadata not preset here! 41 42 43Dynamic metadata (stored as file descriptor) 44 45 Get them by calling static functions of VendorGraphicBufferMeta 46 47- AFBC: 48 static int is_afbc(buffer_handle_t); 49 50 Returns 1 if buffer is compressed with AFBC (AFBC 1.0) 51 Returns 0 if buffer is not compressed. 52 53 e.g: 54 VendorGraphicBufferMeta::is_afbc(handle); 55 56- Video MetaData: 57 static void* get_video_metadata(buffer_handle_t); 58 59 Returns the address of video metadata that must be type cast to video metadata struct by 60 the user. 61 62 Please DO NOT FREE this address! 63 64 e.g: 65 metaData = (ExynosVideoMeta*)VendorGraphicBufferMeta::get_video_metadata(bufferHandle); 66 67- Buffer align information (needed by HWC) 68 69 static int get_pad_align(buffer_handle_t, pad_align_t *pad_align); 70 71 pad_align_t struct is defined in VendorGraphicBuffer.h header 72 and gets filled with short int type. 73 74 pad_align->align.w 75 pad_align->align.h 76 pad_align->pad.w 77 pad_align->pad.h 78 79 80### How to lock/unlock buffers ### 81 821) Get a Singleton instance of VendorGraphicBufferMapper: 83 84 static VendorGraphicBufferMapper& gmapper(VendorGraphicBufferMapper::get()); 85 862) Create Rect object that will be used as input to mapper function (and android_ycbcr object 87 if locking YUV buffers) 88 89 Android::Rect bounds(width, height); 90 android_ycbcr outLayout; 91 92 93 Android::Rect class is defined in /frameworks/native/libs/ui/include_vndk/ui/Rect.h 94 android_ycbcr struct is diefeind in /system/core/libsystem/include/system/graphics.h 95 96 Both headers should get included if you include VendorGraphicBuffer.h 97 983) lock the buffer: 99 To make sure you use 64-bit usages while locking the buffer: 100 status_t err = gmapper.lock64(bufferHandle, 64bit_usage, bounds, &vaddr); 101 status_t err = gmapper.lockYCbCr64(bufferHandle, 64_bit_usage, bounds, &outLayout); 102 103 You can still use the default mapper functions in the original GraphicBufferMapper class: 104 status_t err = gmapper.lock(....); 105 106 Refer to following header if you need to use more mapper functions: 107 /frameworks/native/libs/ui/include_vndk/ui/GraphicBufferMapper.h 108 1094) unlock the buffer: 110 gmapper.unlock(bufferHandle); 111 112 113### How to allocate buffers ### 114 1151) Get a Singleton instnace of VendorGraphicBufferAllocator: 116 VendorGraphicBufferAllocator& gAllocator(VendorGraphicBufferAllocator::get()); 117 1182) Allocate buffer 119 status_t error = gAllocator.allocate(width, height, format, layer_count, allocUsage, &dstBuffer, &dstStride, "requestorName"); 120 1213) To free the buffer 122 gAllocator.free(freeBuffer.bufferHandle); 123 124 You can still use the default allocator functions in the original GraphicBufferAllocator class: 125 126 Refer to following header if you need to use more mapper functions: 127 /frameworks/native/libs/ui/include_vndk/ui/GraphicBufferAllocator.h 128 129 130### New name for S.LSI specific USAGES ### 131 132New usages names can be accessed by adding the namespace containing them: 133using namespace vendor::graphics 134 or 135using vendor::graphics::BufferUsage 136using vendor::graphics::VendorGraphicBufferUsage 137 or directly by 138vendor::graphics::BufferUsage::<USAGE> 139vendor::graphics::VendorGraphicBufferUsage::<USAGE> 140 141 142*** gralloc1 default usages can still be used *** 143They remain so the users of libvendorgraphicbuffer don't have to change too much 144code when moving over to libvendorgraphicbuffer. 145But I recommend moving over the Usages declared in 146 /hardware/interfaces/graphics/common/1.0/types.hal 147 148 Instead of using GRALLOC1_PRODUCE_USAGE_VIDEO_DECORDER please consider using 149 BufferUsage::VIDEO_DECORDER 150 151 152*** But S.LSI specific usages have been RENAMED *** 153 154/* S.LSI specific usages */ 155enum VendorGraphicBufferUsage { 156 NO_AFBC = 1ULL << 29, 157 NOZEROED = 1ULL << 58, 158 PRIVATE_NONSECURE = 1ULL << 59, 159 VIDEO_PRIVATE_DATA = 1ULL << 60, 160}; 161 162 Instead of using GRALLOC1_PRODUCER_USAGE_NO_AFBC, 163 plese use VendorGraphicBufferUsage::NO_AFBC. 164 165This change was force to remove confusion between Android default and 166vendor-specific usages. 167