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*/ 169enum { 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 177enum { 178 BUFFER_TYPE_UI = 0, 179 BUFFER_TYPE_VIDEO 180}; 181 182#ifdef __cplusplus 183struct 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; 248 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) : 257 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 } 270 ~private_handle_t() { 271 magic = 0; 272 } 273 274 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 304 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