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_ARGB_2101010 0x117 113 #define HAL_PIXEL_FORMAT_RGBX_1010102 0x118 114 #define HAL_PIXEL_FORMAT_XRGB_2101010 0x119 115 #define HAL_PIXEL_FORMAT_BGRA_1010102 0x11A 116 #define HAL_PIXEL_FORMAT_ABGR_2101010 0x11B 117 #define HAL_PIXEL_FORMAT_BGRX_1010102 0x11C 118 #define HAL_PIXEL_FORMAT_XBGR_2101010 0x11D 119 #define HAL_PIXEL_FORMAT_YCbCr_420_P010 0x11F 120 #define HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC 0x120 121 122 #define HAL_PIXEL_FORMAT_INTERLACE 0x180 123 124 //v4l2_fourcc('Y', 'U', 'Y', 'L'). 24 bpp YUYV 4:2:2 10 bit per component 125 #define HAL_PIXEL_FORMAT_YCbCr_422_I_10BIT 0x4C595559 126 127 //v4l2_fourcc('Y', 'B', 'W', 'C'). 10 bit per component. This compressed 128 //format reduces the memory access bandwidth 129 #define HAL_PIXEL_FORMAT_YCbCr_422_I_10BIT_COMPRESSED 0x43574259 130 131 // UBWC aligned Venus format 132 #define HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC 0x7FA30C06 133 134 //Khronos ASTC formats 135 #define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0 136 #define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1 137 #define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2 138 #define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3 139 #define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4 140 #define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5 141 #define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6 142 #define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7 143 #define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8 144 #define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9 145 #define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA 146 #define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB 147 #define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC 148 #define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD 149 #define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0 150 #define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1 151 #define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2 152 #define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3 153 #define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4 154 #define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5 155 #define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6 156 #define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7 157 #define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8 158 #define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9 159 #define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA 160 #define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB 161 #define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC 162 #define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD 163 164 /* possible values for inverse gamma correction */ 165 #define HAL_IGC_NOT_SPECIFIED 0 166 #define HAL_IGC_s_RGB 1 167 168 /* possible formats for 3D content*/ 169 enum { 170 HAL_NO_3D = 0x0, 171 HAL_3D_SIDE_BY_SIDE_L_R = 0x1, 172 HAL_3D_SIDE_BY_SIDE_R_L = 0x2, 173 HAL_3D_TOP_BOTTOM = 0x4, 174 HAL_3D_IN_SIDE_BY_SIDE_L_R = 0x10000, //unused legacy format 175 }; 176 177 enum { 178 BUFFER_TYPE_UI = 0, 179 BUFFER_TYPE_VIDEO 180 }; 181 182 #ifdef __cplusplus 183 struct private_handle_t : public native_handle { 184 #else 185 struct private_handle_t { 186 native_handle_t nativeHandle; 187 #endif 188 enum { 189 PRIV_FLAGS_FRAMEBUFFER = 0x00000001, 190 PRIV_FLAGS_USES_ION = 0x00000008, 191 PRIV_FLAGS_USES_ASHMEM = 0x00000010, 192 PRIV_FLAGS_NEEDS_FLUSH = 0x00000020, 193 PRIV_FLAGS_INTERNAL_ONLY = 0x00000040, 194 PRIV_FLAGS_NON_CPU_WRITER = 0x00000080, 195 PRIV_FLAGS_NONCONTIGUOUS_MEM = 0x00000100, 196 PRIV_FLAGS_CACHED = 0x00000200, 197 PRIV_FLAGS_SECURE_BUFFER = 0x00000400, 198 // Display on external only 199 PRIV_FLAGS_EXTERNAL_ONLY = 0x00002000, 200 // Set by HWC for protected non secure buffers 201 PRIV_FLAGS_PROTECTED_BUFFER = 0x00004000, 202 PRIV_FLAGS_VIDEO_ENCODER = 0x00010000, 203 PRIV_FLAGS_CAMERA_WRITE = 0x00020000, 204 PRIV_FLAGS_CAMERA_READ = 0x00040000, 205 PRIV_FLAGS_HW_COMPOSER = 0x00080000, 206 PRIV_FLAGS_HW_TEXTURE = 0x00100000, 207 PRIV_FLAGS_ITU_R_601 = 0x00200000, //Unused from display 208 PRIV_FLAGS_ITU_R_601_FR = 0x00400000, //Unused from display 209 PRIV_FLAGS_ITU_R_709 = 0x00800000, //Unused from display 210 PRIV_FLAGS_SECURE_DISPLAY = 0x01000000, 211 // Buffer is rendered in Tile Format 212 PRIV_FLAGS_TILE_RENDERED = 0x02000000, 213 // Buffer rendered using CPU/SW renderer 214 PRIV_FLAGS_CPU_RENDERED = 0x04000000, 215 // Buffer is allocated with UBWC alignment 216 PRIV_FLAGS_UBWC_ALIGNED = 0x08000000, 217 // Buffer allocated will be consumed by SF/HWC 218 PRIV_FLAGS_DISP_CONSUMER = 0x10000000 219 }; 220 221 // file-descriptors 222 int fd; 223 int fd_metadata; // fd for the meta-data 224 // ints 225 int magic; 226 int flags; 227 unsigned int size; 228 unsigned int offset; 229 int bufferType; 230 uint64_t base __attribute__((aligned(8))); 231 unsigned int offset_metadata; 232 // The gpu address mapped into the mmu. 233 uint64_t gpuaddr __attribute__((aligned(8))); 234 int format; 235 int width; 236 int height; 237 238 int original_width; 239 int original_format; 240 int producer_usage; 241 int consumer_usage; 242 uint64_t backing_store __attribute__((aligned(8))); 243 244 uint64_t base_metadata __attribute__((aligned(8))); 245 246 #ifdef __cplusplus 247 static const int sNumFds = 2; sNumIntsprivate_handle_t248 static inline int sNumInts() { 249 return ((sizeof(private_handle_t) - sizeof(native_handle_t)) / 250 sizeof(int)) - sNumFds; 251 } 252 static const int sMagic = 'gmsm'; 253 254 private_handle_t(int fd, unsigned int size, int flags, int bufferType, 255 int format, int width, int height, int eFd = -1, 256 unsigned int eOffset = 0, uint64_t eBase = 0) : fdprivate_handle_t257 fd(fd), fd_metadata(eFd), magic(sMagic), 258 flags(flags), size(size), offset(0), bufferType(bufferType), 259 base(0), offset_metadata(eOffset), gpuaddr(0), 260 format(format), width(width), height(height), 261 original_width(0), original_format(0), 262 producer_usage(0), consumer_usage(0), 263 backing_store(0), 264 base_metadata(eBase) 265 { 266 version = (int) sizeof(native_handle); 267 numInts = sNumInts(); 268 numFds = sNumFds; 269 } ~private_handle_tprivate_handle_t270 ~private_handle_t() { 271 magic = 0; 272 } 273 validateprivate_handle_t274 static int validate(const native_handle* h) { 275 const private_handle_t* hnd = (const private_handle_t*)h; 276 if (!h || h->version != sizeof(native_handle) || 277 h->numInts != sNumInts() || h->numFds != sNumFds || 278 hnd->magic != sMagic) 279 { 280 ALOGD("Invalid gralloc handle (at %p): " 281 "ver(%d/%zu) ints(%d/%d) fds(%d/%d)" 282 "magic(%c%c%c%c/%c%c%c%c)", 283 h, 284 h ? h->version : -1, sizeof(native_handle), 285 h ? h->numInts : -1, sNumInts(), 286 h ? h->numFds : -1, sNumFds, 287 hnd ? (((hnd->magic >> 24) & 0xFF)? 288 ((hnd->magic >> 24) & 0xFF) : '-') : '?', 289 hnd ? (((hnd->magic >> 16) & 0xFF)? 290 ((hnd->magic >> 16) & 0xFF) : '-') : '?', 291 hnd ? (((hnd->magic >> 8) & 0xFF)? 292 ((hnd->magic >> 8) & 0xFF) : '-') : '?', 293 hnd ? (((hnd->magic >> 0) & 0xFF)? 294 ((hnd->magic >> 0) & 0xFF) : '-') : '?', 295 (sMagic >> 24) & 0xFF, 296 (sMagic >> 16) & 0xFF, 297 (sMagic >> 8) & 0xFF, 298 (sMagic >> 0) & 0xFF); 299 return -EINVAL; 300 } 301 return 0; 302 } 303 dynamicCastprivate_handle_t304 static private_handle_t* dynamicCast(const native_handle* in) { 305 if (validate(in) == 0) { 306 return (private_handle_t*) in; 307 } 308 return NULL; 309 } 310 #endif 311 }; 312 313 #endif /* GRALLOC_PRIV_H_ */ 314