1 /* 2 * Copyright (C) 2008 The Android Open Source Project 3 * Copyright (c) 2011 - 2016, The Linux Foundation. All rights reserved. 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 #ifndef GRALLOC_PRIV_H_ 19 #define GRALLOC_PRIV_H_ 20 21 #include <stdint.h> 22 #include <limits.h> 23 #include <sys/cdefs.h> 24 #include <hardware/gralloc.h> 25 #include <pthread.h> 26 #include <errno.h> 27 #include <unistd.h> 28 29 #include <cutils/native_handle.h> 30 31 #include <cutils/log.h> 32 33 #define ROUND_UP_PAGESIZE(x) ( (((unsigned long)(x)) + PAGE_SIZE-1) & \ 34 (~(PAGE_SIZE-1)) ) 35 36 /* Gralloc usage bits indicating the type of allocation that should be used */ 37 /* SYSTEM heap comes from kernel vmalloc (ION_SYSTEM_HEAP_ID) 38 * is cached by default and 39 * is not secured */ 40 41 /* GRALLOC_USAGE_PRIVATE_0 is unused */ 42 43 /* Non linear, Universal Bandwidth Compression */ 44 #define GRALLOC_USAGE_PRIVATE_ALLOC_UBWC GRALLOC_USAGE_PRIVATE_1 45 46 /* IOMMU heap comes from manually allocated pages, can be cached/uncached, 47 * is not secured */ 48 #define GRALLOC_USAGE_PRIVATE_IOMMU_HEAP GRALLOC_USAGE_PRIVATE_2 49 50 /* MM heap is a carveout heap for video, can be secured */ 51 #define GRALLOC_USAGE_PRIVATE_MM_HEAP GRALLOC_USAGE_PRIVATE_3 52 53 /* ADSP heap is a carveout heap, is not secured */ 54 #define GRALLOC_USAGE_PRIVATE_ADSP_HEAP 0x01000000 55 56 /* Set this for allocating uncached memory (using O_DSYNC), 57 * cannot be used with noncontiguous heaps */ 58 #define GRALLOC_USAGE_PRIVATE_UNCACHED 0x02000000 59 60 /* Buffer content should be displayed on an primary display only */ 61 #define GRALLOC_USAGE_PRIVATE_INTERNAL_ONLY 0x04000000 62 63 /* Buffer content should be displayed on an external display only */ 64 #define GRALLOC_USAGE_PRIVATE_EXTERNAL_ONLY 0x08000000 65 66 /* This flag is set for WFD usecase */ 67 #define GRALLOC_USAGE_PRIVATE_WFD 0x00200000 68 69 /* CAMERA heap is a carveout heap for camera, is not secured */ 70 #define GRALLOC_USAGE_PRIVATE_CAMERA_HEAP 0x00400000 71 72 /* This flag is used for SECURE display usecase */ 73 #define GRALLOC_USAGE_PRIVATE_SECURE_DISPLAY 0x00800000 74 75 /* define Gralloc perform */ 76 #define GRALLOC_MODULE_PERFORM_CREATE_HANDLE_FROM_BUFFER 1 77 // This will be used by the graphics drivers to know if certain features 78 // are defined in this display HAL. 79 // Ex: Newer GFX libraries + Older Display HAL 80 #define GRALLOC_MODULE_PERFORM_GET_STRIDE 2 81 #define GRALLOC_MODULE_PERFORM_GET_CUSTOM_STRIDE_FROM_HANDLE 3 82 #define GRALLOC_MODULE_PERFORM_GET_CUSTOM_STRIDE_AND_HEIGHT_FROM_HANDLE 4 83 #define GRALLOC_MODULE_PERFORM_GET_ATTRIBUTES 5 84 #define GRALLOC_MODULE_PERFORM_GET_COLOR_SPACE_FROM_HANDLE 6 85 #define GRALLOC_MODULE_PERFORM_GET_YUV_PLANE_INFO 7 86 #define GRALLOC_MODULE_PERFORM_GET_MAP_SECURE_BUFFER_INFO 8 87 #define GRALLOC_MODULE_PERFORM_GET_UBWC_FLAG 9 88 #define GRALLOC_MODULE_PERFORM_GET_RGB_DATA_ADDRESS 10 89 #define GRALLOC_MODULE_PERFORM_GET_IGC 11 90 #define GRALLOC_MODULE_PERFORM_SET_IGC 12 91 #define GRALLOC_MODULE_PERFORM_SET_SINGLE_BUFFER_MODE 13 92 93 /* OEM specific HAL formats */ 94 95 #define HAL_PIXEL_FORMAT_RGBA_5551 6 96 #define HAL_PIXEL_FORMAT_RGBA_4444 7 97 #define HAL_PIXEL_FORMAT_NV12_ENCODEABLE 0x102 98 #define HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS 0x7FA30C04 99 #define HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED 0x7FA30C03 100 #define HAL_PIXEL_FORMAT_YCbCr_420_SP 0x109 101 #define HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO 0x7FA30C01 102 #define HAL_PIXEL_FORMAT_YCrCb_422_SP 0x10B 103 #define HAL_PIXEL_FORMAT_R_8 0x10D 104 #define HAL_PIXEL_FORMAT_RG_88 0x10E 105 #define HAL_PIXEL_FORMAT_YCbCr_444_SP 0x10F 106 #define HAL_PIXEL_FORMAT_YCrCb_444_SP 0x110 107 #define HAL_PIXEL_FORMAT_YCrCb_422_I 0x111 108 #define HAL_PIXEL_FORMAT_BGRX_8888 0x112 109 #define HAL_PIXEL_FORMAT_NV21_ZSL 0x113 110 #define HAL_PIXEL_FORMAT_YCrCb_420_SP_VENUS 0x114 111 #define HAL_PIXEL_FORMAT_BGR_565 0x115 112 #define HAL_PIXEL_FORMAT_RGBA_1010102 0x116 113 #define HAL_PIXEL_FORMAT_ARGB_2101010 0x117 114 #define HAL_PIXEL_FORMAT_RGBX_1010102 0x118 115 #define HAL_PIXEL_FORMAT_XRGB_2101010 0x119 116 #define HAL_PIXEL_FORMAT_BGRA_1010102 0x11A 117 #define HAL_PIXEL_FORMAT_ABGR_2101010 0x11B 118 #define HAL_PIXEL_FORMAT_BGRX_1010102 0x11C 119 #define HAL_PIXEL_FORMAT_XBGR_2101010 0x11D 120 #define HAL_PIXEL_FORMAT_YCbCr_420_P010 0x11F 121 #define HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC 0x120 122 123 #define HAL_PIXEL_FORMAT_INTERLACE 0x180 124 125 //v4l2_fourcc('Y', 'U', 'Y', 'L'). 24 bpp YUYV 4:2:2 10 bit per component 126 #define HAL_PIXEL_FORMAT_YCbCr_422_I_10BIT 0x4C595559 127 128 //v4l2_fourcc('Y', 'B', 'W', 'C'). 10 bit per component. This compressed 129 //format reduces the memory access bandwidth 130 #define HAL_PIXEL_FORMAT_YCbCr_422_I_10BIT_COMPRESSED 0x43574259 131 132 // UBWC aligned Venus format 133 #define HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC 0x7FA30C06 134 135 //Khronos ASTC formats 136 #define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0 137 #define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1 138 #define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2 139 #define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3 140 #define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4 141 #define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5 142 #define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6 143 #define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7 144 #define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8 145 #define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9 146 #define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA 147 #define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB 148 #define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC 149 #define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD 150 #define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0 151 #define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1 152 #define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2 153 #define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3 154 #define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4 155 #define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5 156 #define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6 157 #define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7 158 #define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8 159 #define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9 160 #define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA 161 #define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB 162 #define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC 163 #define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD 164 165 /* possible values for inverse gamma correction */ 166 #define HAL_IGC_NOT_SPECIFIED 0 167 #define HAL_IGC_s_RGB 1 168 169 /* possible formats for 3D content*/ 170 enum { 171 HAL_NO_3D = 0x0, 172 HAL_3D_SIDE_BY_SIDE_L_R = 0x1, 173 HAL_3D_SIDE_BY_SIDE_R_L = 0x2, 174 HAL_3D_TOP_BOTTOM = 0x4, 175 HAL_3D_IN_SIDE_BY_SIDE_L_R = 0x10000, //unused legacy format 176 }; 177 178 enum { 179 BUFFER_TYPE_UI = 0, 180 BUFFER_TYPE_VIDEO 181 }; 182 183 #ifdef __cplusplus 184 struct private_handle_t : public native_handle { 185 #else 186 struct private_handle_t { 187 native_handle_t nativeHandle; 188 #endif 189 enum { 190 PRIV_FLAGS_FRAMEBUFFER = 0x00000001, 191 PRIV_FLAGS_USES_ION = 0x00000008, 192 PRIV_FLAGS_USES_ASHMEM = 0x00000010, 193 PRIV_FLAGS_NEEDS_FLUSH = 0x00000020, 194 PRIV_FLAGS_INTERNAL_ONLY = 0x00000040, 195 PRIV_FLAGS_NON_CPU_WRITER = 0x00000080, 196 PRIV_FLAGS_NONCONTIGUOUS_MEM = 0x00000100, 197 PRIV_FLAGS_CACHED = 0x00000200, 198 PRIV_FLAGS_SECURE_BUFFER = 0x00000400, 199 // Display on external only 200 PRIV_FLAGS_EXTERNAL_ONLY = 0x00002000, 201 // Set by HWC for protected non secure buffers 202 PRIV_FLAGS_PROTECTED_BUFFER = 0x00004000, 203 PRIV_FLAGS_VIDEO_ENCODER = 0x00010000, 204 PRIV_FLAGS_CAMERA_WRITE = 0x00020000, 205 PRIV_FLAGS_CAMERA_READ = 0x00040000, 206 PRIV_FLAGS_HW_COMPOSER = 0x00080000, 207 PRIV_FLAGS_HW_TEXTURE = 0x00100000, 208 PRIV_FLAGS_ITU_R_601 = 0x00200000, //Unused from display 209 PRIV_FLAGS_ITU_R_601_FR = 0x00400000, //Unused from display 210 PRIV_FLAGS_ITU_R_709 = 0x00800000, //Unused from display 211 PRIV_FLAGS_SECURE_DISPLAY = 0x01000000, 212 // Buffer is rendered in Tile Format 213 PRIV_FLAGS_TILE_RENDERED = 0x02000000, 214 // Buffer rendered using CPU/SW renderer 215 PRIV_FLAGS_CPU_RENDERED = 0x04000000, 216 // Buffer is allocated with UBWC alignment 217 PRIV_FLAGS_UBWC_ALIGNED = 0x08000000, 218 // Buffer allocated will be consumed by SF/HWC 219 PRIV_FLAGS_DISP_CONSUMER = 0x10000000 220 }; 221 222 // file-descriptors 223 int fd; 224 int fd_metadata; // fd for the meta-data 225 // ints 226 int magic; 227 int flags; 228 unsigned int size; 229 unsigned int offset; 230 int bufferType; 231 uint64_t base __attribute__((aligned(8))); 232 unsigned int offset_metadata; 233 // The gpu address mapped into the mmu. 234 uint64_t gpuaddr __attribute__((aligned(8))); 235 int format; 236 int width; 237 int height; 238 uint64_t base_metadata __attribute__((aligned(8))); 239 240 #ifdef __cplusplus 241 static const int sNumFds = 2; sNumIntsprivate_handle_t242 static inline int sNumInts() { 243 return ((sizeof(private_handle_t) - sizeof(native_handle_t)) / 244 sizeof(int)) - sNumFds; 245 } 246 static const int sMagic = 'gmsm'; 247 248 private_handle_t(int fd, unsigned int size, int flags, int bufferType, 249 int format, int width, int height, int eFd = -1, 250 unsigned int eOffset = 0, uint64_t eBase = 0) : fdprivate_handle_t251 fd(fd), fd_metadata(eFd), magic(sMagic), 252 flags(flags), size(size), offset(0), bufferType(bufferType), 253 base(0), offset_metadata(eOffset), gpuaddr(0), 254 format(format), width(width), height(height), 255 base_metadata(eBase) 256 { 257 version = (int) sizeof(native_handle); 258 numInts = sNumInts(); 259 numFds = sNumFds; 260 } ~private_handle_tprivate_handle_t261 ~private_handle_t() { 262 magic = 0; 263 } 264 validateprivate_handle_t265 static int validate(const native_handle* h) { 266 const private_handle_t* hnd = (const private_handle_t*)h; 267 if (!h || h->version != sizeof(native_handle) || 268 h->numInts != sNumInts() || h->numFds != sNumFds || 269 hnd->magic != sMagic) 270 { 271 ALOGD("Invalid gralloc handle (at %p): " 272 "ver(%d/%zu) ints(%d/%d) fds(%d/%d)" 273 "magic(%c%c%c%c/%c%c%c%c)", 274 h, 275 h ? h->version : -1, sizeof(native_handle), 276 h ? h->numInts : -1, sNumInts(), 277 h ? h->numFds : -1, sNumFds, 278 hnd ? (((hnd->magic >> 24) & 0xFF)? 279 ((hnd->magic >> 24) & 0xFF) : '-') : '?', 280 hnd ? (((hnd->magic >> 16) & 0xFF)? 281 ((hnd->magic >> 16) & 0xFF) : '-') : '?', 282 hnd ? (((hnd->magic >> 8) & 0xFF)? 283 ((hnd->magic >> 8) & 0xFF) : '-') : '?', 284 hnd ? (((hnd->magic >> 0) & 0xFF)? 285 ((hnd->magic >> 0) & 0xFF) : '-') : '?', 286 (sMagic >> 24) & 0xFF, 287 (sMagic >> 16) & 0xFF, 288 (sMagic >> 8) & 0xFF, 289 (sMagic >> 0) & 0xFF); 290 return -EINVAL; 291 } 292 return 0; 293 } 294 dynamicCastprivate_handle_t295 static private_handle_t* dynamicCast(const native_handle* in) { 296 if (validate(in) == 0) { 297 return (private_handle_t*) in; 298 } 299 return NULL; 300 } 301 #endif 302 }; 303 304 #endif /* GRALLOC_PRIV_H_ */ 305