1 /* 2 * Copyright (C) 2008 The Android Open Source Project 3 * Copyright (c) 2011 - 2017, 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 int)( ((x) + getpagesize()-1) & \ 34 (~(getpagesize()-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_CbYCrY_422_I 0x120 122 #define HAL_PIXEL_FORMAT_BGR_888 0x121 123 #define HAL_PIXEL_FORMAT_RAW8 0x123 124 #define HAL_PIXEL_FORMAT_YCbCr_420_P010_UBWC 0x124 125 126 #define HAL_PIXEL_FORMAT_INTERLACE 0x180 127 128 //v4l2_fourcc('Y', 'U', 'Y', 'L'). 24 bpp YUYV 4:2:2 10 bit per component 129 #define HAL_PIXEL_FORMAT_YCbCr_422_I_10BIT 0x4C595559 130 131 //v4l2_fourcc('Y', 'B', 'W', 'C'). 10 bit per component. This compressed 132 //format reduces the memory access bandwidth 133 #define HAL_PIXEL_FORMAT_YCbCr_422_I_10BIT_COMPRESSED 0x43574259 134 135 // UBWC aligned Venus format 136 #define HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC 0x7FA30C06 137 #define HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC 0x7FA30C09 138 139 //Khronos ASTC formats 140 #define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0 141 #define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1 142 #define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2 143 #define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3 144 #define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4 145 #define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5 146 #define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6 147 #define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7 148 #define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8 149 #define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9 150 #define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA 151 #define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB 152 #define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC 153 #define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD 154 #define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0 155 #define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1 156 #define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2 157 #define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3 158 #define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4 159 #define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5 160 #define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6 161 #define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7 162 #define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8 163 #define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9 164 #define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA 165 #define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB 166 #define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC 167 #define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD 168 169 /* possible values for inverse gamma correction */ 170 #define HAL_IGC_NOT_SPECIFIED 0 171 #define HAL_IGC_s_RGB 1 172 173 /* Color Space: Values maps to ColorSpace_t in qdMetadata.h */ 174 #define HAL_CSC_ITU_R_601 0 175 #define HAL_CSC_ITU_R_601_FR 1 176 #define HAL_CSC_ITU_R_709 2 177 #define HAL_CSC_ITU_R_2020 3 178 #define HAL_CSC_ITU_R_2020_FR 4 179 180 /* possible formats for 3D content*/ 181 enum { 182 HAL_NO_3D = 0x0, 183 HAL_3D_SIDE_BY_SIDE_L_R = 0x1, 184 HAL_3D_SIDE_BY_SIDE_R_L = 0x2, 185 HAL_3D_TOP_BOTTOM = 0x4, 186 HAL_3D_IN_SIDE_BY_SIDE_L_R = 0x10000, //unused legacy format 187 }; 188 189 enum { 190 BUFFER_TYPE_UI = 0, 191 BUFFER_TYPE_VIDEO 192 }; 193 194 #ifdef __cplusplus 195 struct private_handle_t : public native_handle { 196 #else 197 struct private_handle_t { 198 native_handle_t nativeHandle; 199 #endif 200 enum { 201 PRIV_FLAGS_FRAMEBUFFER = 0x00000001, 202 PRIV_FLAGS_USES_ION = 0x00000008, 203 PRIV_FLAGS_USES_ASHMEM = 0x00000010, 204 PRIV_FLAGS_NEEDS_FLUSH = 0x00000020, 205 PRIV_FLAGS_INTERNAL_ONLY = 0x00000040, 206 PRIV_FLAGS_NON_CPU_WRITER = 0x00000080, 207 PRIV_FLAGS_NONCONTIGUOUS_MEM = 0x00000100, 208 PRIV_FLAGS_CACHED = 0x00000200, 209 PRIV_FLAGS_SECURE_BUFFER = 0x00000400, 210 // Display on external only 211 PRIV_FLAGS_EXTERNAL_ONLY = 0x00002000, 212 // Set by HWC for protected non secure buffers 213 PRIV_FLAGS_PROTECTED_BUFFER = 0x00004000, 214 PRIV_FLAGS_VIDEO_ENCODER = 0x00010000, 215 PRIV_FLAGS_CAMERA_WRITE = 0x00020000, 216 PRIV_FLAGS_CAMERA_READ = 0x00040000, 217 PRIV_FLAGS_HW_COMPOSER = 0x00080000, 218 PRIV_FLAGS_HW_TEXTURE = 0x00100000, 219 PRIV_FLAGS_ITU_R_601 = 0x00200000, //Unused from display 220 PRIV_FLAGS_ITU_R_601_FR = 0x00400000, //Unused from display 221 PRIV_FLAGS_ITU_R_709 = 0x00800000, //Unused from display 222 PRIV_FLAGS_SECURE_DISPLAY = 0x01000000, 223 // Buffer is rendered in Tile Format 224 PRIV_FLAGS_TILE_RENDERED = 0x02000000, 225 // Buffer rendered using CPU/SW renderer 226 PRIV_FLAGS_CPU_RENDERED = 0x04000000, 227 // Buffer is allocated with UBWC alignment 228 PRIV_FLAGS_UBWC_ALIGNED = 0x08000000, 229 // Buffer allocated will be consumed by SF/HWC 230 PRIV_FLAGS_DISP_CONSUMER = 0x10000000 231 }; 232 233 // file-descriptors 234 int fd; 235 int fd_metadata; // fd for the meta-data 236 // ints 237 int magic; 238 int flags; 239 unsigned int size; 240 unsigned int offset; 241 int bufferType; 242 uint64_t base __attribute__((aligned(8))); 243 unsigned int offset_metadata; 244 // The gpu address mapped into the mmu. 245 uint64_t gpuaddr __attribute__((aligned(8))); 246 int format; 247 int width; // holds aligned width of the actual buffer allocated 248 int height; // holds aligned height of the actual buffer allocated 249 uint64_t base_metadata __attribute__((aligned(8))); 250 int unaligned_width; // holds width client asked to allocate 251 int unaligned_height; // holds height client asked to allocate 252 253 #ifdef __cplusplus 254 static const int sNumFds = 2; sNumIntsprivate_handle_t255 static inline int sNumInts() { 256 return ((sizeof(private_handle_t) - sizeof(native_handle_t)) / 257 sizeof(int)) - sNumFds; 258 } 259 static const int sMagic = 'gmsm'; 260 private_handle_tprivate_handle_t261 private_handle_t(int fd, unsigned int size, int flags, int bufferType, 262 int format, int width, int height) : 263 fd(fd), fd_metadata(-1), magic(sMagic), 264 flags(flags), size(size), offset(0), bufferType(bufferType), 265 base(0), offset_metadata(0), gpuaddr(0), 266 format(format), width(width), height(height), 267 base_metadata(0), unaligned_width(width), 268 unaligned_height(height) 269 { 270 version = (int) sizeof(native_handle); 271 numInts = sNumInts(); 272 numFds = sNumFds; 273 } 274 private_handle_tprivate_handle_t275 private_handle_t(int fd, unsigned int size, int flags, int bufferType, 276 int format, int width, int height, 277 int eFd, unsigned int eOffset, uint64_t eBase) : 278 private_handle_t(fd, size, flags, bufferType, format, width, height) 279 { 280 fd_metadata = eFd; 281 offset_metadata = eOffset; 282 base_metadata = eBase; 283 } 284 private_handle_tprivate_handle_t285 private_handle_t(int fd, unsigned int size, int flags, int bufferType, 286 int format, int width, int height, 287 int eFd, unsigned int eOffset, uint64_t eBase, 288 int unaligned_w, int unaligned_h) : 289 private_handle_t(fd, size, flags, bufferType, format, width, height, 290 eFd, eOffset, eBase) 291 { 292 unaligned_width = unaligned_w; 293 unaligned_height = unaligned_h; 294 } 295 ~private_handle_tprivate_handle_t296 ~private_handle_t() { 297 magic = 0; 298 } 299 validateprivate_handle_t300 static int validate(const native_handle* h) { 301 const private_handle_t* hnd = (const private_handle_t*)h; 302 if (!h || h->version != sizeof(native_handle) || 303 h->numInts != sNumInts() || h->numFds != sNumFds || 304 hnd->magic != sMagic) 305 { 306 ALOGD("Invalid gralloc handle (at %p): " 307 "ver(%d/%zu) ints(%d/%d) fds(%d/%d)" 308 "magic(%c%c%c%c/%c%c%c%c)", 309 h, 310 h ? h->version : -1, sizeof(native_handle), 311 h ? h->numInts : -1, sNumInts(), 312 h ? h->numFds : -1, sNumFds, 313 hnd ? (((hnd->magic >> 24) & 0xFF)? 314 ((hnd->magic >> 24) & 0xFF) : '-') : '?', 315 hnd ? (((hnd->magic >> 16) & 0xFF)? 316 ((hnd->magic >> 16) & 0xFF) : '-') : '?', 317 hnd ? (((hnd->magic >> 8) & 0xFF)? 318 ((hnd->magic >> 8) & 0xFF) : '-') : '?', 319 hnd ? (((hnd->magic >> 0) & 0xFF)? 320 ((hnd->magic >> 0) & 0xFF) : '-') : '?', 321 (sMagic >> 24) & 0xFF, 322 (sMagic >> 16) & 0xFF, 323 (sMagic >> 8) & 0xFF, 324 (sMagic >> 0) & 0xFF); 325 return -EINVAL; 326 } 327 return 0; 328 } 329 dynamicCastprivate_handle_t330 static private_handle_t* dynamicCast(const native_handle* in) { 331 if (validate(in) == 0) { 332 return (private_handle_t*) in; 333 } 334 return NULL; 335 } 336 #endif 337 }; 338 339 #endif /* GRALLOC_PRIV_H_ */ 340