1054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* 2054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Copyright (C) 2008 The Android Open Source Project 3054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Copyright (c) 2011-2015, The Linux Foundation. All rights reserved. 4054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * 5054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Licensed under the Apache License, Version 2.0 (the "License"); 6054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * you may not use this file except in compliance with the License. 7054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * You may obtain a copy of the License at 8054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * 9054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * http://www.apache.org/licenses/LICENSE-2.0 10054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * 11054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Unless required by applicable law or agreed to in writing, software 12054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * distributed under the License is distributed on an "AS IS" BASIS, 13054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * See the License for the specific language governing permissions and 15054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * limitations under the License. 16054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin */ 17054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 18054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#ifndef GRALLOC_PRIV_H_ 19054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define GRALLOC_PRIV_H_ 20054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 21054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <stdint.h> 22054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <limits.h> 23054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <sys/cdefs.h> 24054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <hardware/gralloc.h> 25054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <pthread.h> 26054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <errno.h> 27054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <unistd.h> 28054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 29054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <cutils/native_handle.h> 30054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 31054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <cutils/log.h> 32054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 33054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define ROUND_UP_PAGESIZE(x) ( (((unsigned long)(x)) + PAGE_SIZE-1) & \ 34054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin (~(PAGE_SIZE-1)) ) 35054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 36054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinenum { 37054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* gralloc usage bits indicating the type 38054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * of allocation that should be used */ 39054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 40054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* SYSTEM heap comes from kernel vmalloc, 41054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * can never be uncached, is not secured*/ 42054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin GRALLOC_USAGE_PRIVATE_SYSTEM_HEAP = GRALLOC_USAGE_PRIVATE_0, 43054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 44054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* Non linear, Universal Bandwidth Compression */ 45054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin GRALLOC_USAGE_PRIVATE_ALLOC_UBWC = GRALLOC_USAGE_PRIVATE_1, 46054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 47054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* IOMMU heap comes from manually allocated pages, 48054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * can be cached/uncached, is not secured */ 49054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin GRALLOC_USAGE_PRIVATE_IOMMU_HEAP = GRALLOC_USAGE_PRIVATE_2, 50054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* MM heap is a carveout heap for video, can be secured*/ 51054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin GRALLOC_USAGE_PRIVATE_MM_HEAP = GRALLOC_USAGE_PRIVATE_3, 52054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* ADSP heap is a carveout heap, is not secured*/ 53054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin GRALLOC_USAGE_PRIVATE_ADSP_HEAP = 0x01000000, 54054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 55054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* Set this for allocating uncached memory (using O_DSYNC) 56054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * cannot be used with noncontiguous heaps */ 57054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin GRALLOC_USAGE_PRIVATE_UNCACHED = 0x02000000, 58054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 59054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* Buffer content should be displayed on an primary display only */ 60054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin GRALLOC_USAGE_PRIVATE_INTERNAL_ONLY = 0x04000000, 61054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 62054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* Buffer content should be displayed on an external display only */ 63054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin GRALLOC_USAGE_PRIVATE_EXTERNAL_ONLY = 0x08000000, 64054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 65054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* This flag is set for WFD usecase */ 66054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin GRALLOC_USAGE_PRIVATE_WFD = 0x00200000, 67054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 68054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* CAMERA heap is a carveout heap for camera, is not secured*/ 69054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin GRALLOC_USAGE_PRIVATE_CAMERA_HEAP = 0x00400000, 70054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 71054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* This flag is used for SECURE display usecase */ 72054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin GRALLOC_USAGE_PRIVATE_SECURE_DISPLAY = 0x00800000, 73054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}; 74054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 75054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* define Gralloc perform */ 76054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define GRALLOC_MODULE_PERFORM_CREATE_HANDLE_FROM_BUFFER 1 77054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin// This will be used by the graphics drivers to know if certain features 78054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin// are defined in this display HAL. 79054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin// Ex: Newer GFX libraries + Older Display HAL 80054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define GRALLOC_MODULE_PERFORM_GET_STRIDE 2 81054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define GRALLOC_MODULE_PERFORM_GET_CUSTOM_STRIDE_FROM_HANDLE 3 82054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define GRALLOC_MODULE_PERFORM_GET_CUSTOM_STRIDE_AND_HEIGHT_FROM_HANDLE 4 83054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define GRALLOC_MODULE_PERFORM_GET_ATTRIBUTES 5 84054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define GRALLOC_MODULE_PERFORM_GET_COLOR_SPACE_FROM_HANDLE 6 85054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define GRALLOC_MODULE_PERFORM_GET_YUV_PLANE_INFO 7 86054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define GRALLOC_MODULE_PERFORM_GET_MAP_SECURE_BUFFER_INFO 8 87054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 88054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define GRALLOC_HEAP_MASK (GRALLOC_USAGE_PRIVATE_SYSTEM_HEAP |\ 89054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin GRALLOC_USAGE_PRIVATE_IOMMU_HEAP |\ 90054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin GRALLOC_USAGE_PRIVATE_MM_HEAP |\ 91054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin GRALLOC_USAGE_PRIVATE_ADSP_HEAP) 92054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 93054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define INTERLACE_MASK 0x80 94054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define S3D_FORMAT_MASK 0xFF000 95054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/*****************************************************************************/ 96054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 97054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* OEM specific HAL formats */ 98054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 99054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define HAL_PIXEL_FORMAT_RGBA_5551 6 100054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define HAL_PIXEL_FORMAT_RGBA_4444 7 101054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define HAL_PIXEL_FORMAT_NV12_ENCODEABLE 0x102 102054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS 0x7FA30C04 103054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED 0x7FA30C03 104054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define HAL_PIXEL_FORMAT_YCbCr_420_SP 0x109 105054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO 0x7FA30C01 106054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define HAL_PIXEL_FORMAT_YCrCb_422_SP 0x10B 107054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define HAL_PIXEL_FORMAT_R_8 0x10D 108054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define HAL_PIXEL_FORMAT_RG_88 0x10E 109054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define HAL_PIXEL_FORMAT_YCbCr_444_SP 0x10F 110054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define HAL_PIXEL_FORMAT_YCrCb_444_SP 0x110 111054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define HAL_PIXEL_FORMAT_YCrCb_422_I 0x111 112054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define HAL_PIXEL_FORMAT_BGRX_8888 0x112 113054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define HAL_PIXEL_FORMAT_NV21_ZSL 0x113 114054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define HAL_PIXEL_FORMAT_INTERLACE 0x180 115054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 116054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin//v4l2_fourcc('Y', 'U', 'Y', 'L'). 24 bpp YUYV 4:2:2 10 bit per component 117054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define HAL_PIXEL_FORMAT_YCbCr_422_I_10BIT 0x4C595559 118054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 119054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin//v4l2_fourcc('Y', 'B', 'W', 'C'). 10 bit per component. This compressed 120054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin//format reduces the memory access bandwidth 121054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define HAL_PIXEL_FORMAT_YCbCr_422_I_10BIT_COMPRESSED 0x43574259 122054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 123054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin// UBWC aligned Venus format 124054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC 0x7FA30C06 125054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 126054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin//Khronos ASTC formats 127054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0 128054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1 129054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2 130054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3 131054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4 132054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5 133054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6 134054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7 135054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8 136054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9 137054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA 138054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB 139054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC 140054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD 141054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0 142054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1 143054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2 144054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3 145054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4 146054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5 147054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6 148054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7 149054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8 150054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9 151054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA 152054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB 153054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC 154054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD 155054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 156054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* possible formats for 3D content*/ 157054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinenum { 158054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin HAL_NO_3D = 0x0000, 159054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin HAL_3D_IN_SIDE_BY_SIDE_L_R = 0x10000, 160054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin HAL_3D_IN_TOP_BOTTOM = 0x20000, 161054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin HAL_3D_IN_INTERLEAVE = 0x40000, 162054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin HAL_3D_IN_SIDE_BY_SIDE_R_L = 0x80000, 163054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin HAL_3D_OUT_SIDE_BY_SIDE = 0x1000, 164054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin HAL_3D_OUT_TOP_BOTTOM = 0x2000, 165054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin HAL_3D_OUT_INTERLEAVE = 0x4000, 166054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin HAL_3D_OUT_MONOSCOPIC = 0x8000 167054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}; 168054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 169054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinenum { 170054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin BUFFER_TYPE_UI = 0, 171054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin BUFFER_TYPE_VIDEO 172054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}; 173054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 174054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/*****************************************************************************/ 175054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 176054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#ifdef __cplusplus 177054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinstruct private_handle_t : public native_handle { 178054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#else 179054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin struct private_handle_t { 180054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin native_handle_t nativeHandle; 181054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#endif 182054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin enum { 183054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin PRIV_FLAGS_FRAMEBUFFER = 0x00000001, 184054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin PRIV_FLAGS_USES_PMEM = 0x00000002, 185054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin PRIV_FLAGS_USES_PMEM_ADSP = 0x00000004, 186054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin PRIV_FLAGS_USES_ION = 0x00000008, 187054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin PRIV_FLAGS_USES_ASHMEM = 0x00000010, 188054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin PRIV_FLAGS_NEEDS_FLUSH = 0x00000020, 189054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin PRIV_FLAGS_NON_CPU_WRITER = 0x00000080, 190054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin PRIV_FLAGS_NONCONTIGUOUS_MEM = 0x00000100, 191054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin PRIV_FLAGS_CACHED = 0x00000200, 192054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin PRIV_FLAGS_SECURE_BUFFER = 0x00000400, 193054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin // For explicit synchronization 194054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin PRIV_FLAGS_UNSYNCHRONIZED = 0x00000800, 195054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin // Not mapped in userspace 196054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin PRIV_FLAGS_NOT_MAPPED = 0x00001000, 197054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin // Display on external only 198054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin PRIV_FLAGS_EXTERNAL_ONLY = 0x00002000, 199054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin // Set by HWC for protected non secure buffers 200054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin PRIV_FLAGS_PROTECTED_BUFFER = 0x00004000, 201054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin PRIV_FLAGS_VIDEO_ENCODER = 0x00010000, 202054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin PRIV_FLAGS_CAMERA_WRITE = 0x00020000, 203054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin PRIV_FLAGS_CAMERA_READ = 0x00040000, 204054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin PRIV_FLAGS_HW_COMPOSER = 0x00080000, 205054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin PRIV_FLAGS_HW_TEXTURE = 0x00100000, 206054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin PRIV_FLAGS_ITU_R_601 = 0x00200000, 207054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin PRIV_FLAGS_ITU_R_601_FR = 0x00400000, 208054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin PRIV_FLAGS_ITU_R_709 = 0x00800000, 209054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin PRIV_FLAGS_SECURE_DISPLAY = 0x01000000, 210054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin // Buffer is rendered in Tile Format 211054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin PRIV_FLAGS_TILE_RENDERED = 0x02000000, 212054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin // Buffer rendered using CPU/SW renderer 213054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin PRIV_FLAGS_CPU_RENDERED = 0x04000000, 214054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin // Buffer is allocated with UBWC alignment 215054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin PRIV_FLAGS_UBWC_ALIGNED = 0x08000000 216054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin }; 217054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 218054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin // file-descriptors 219054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int fd; 220054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int fd_metadata; // fd for the meta-data 221054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin // ints 222054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int magic; 223054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int flags; 224054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin unsigned int size; 225054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin unsigned int offset; 226054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int bufferType; 227054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin uint64_t base __attribute__((aligned(8))); 228054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin unsigned int offset_metadata; 229054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin // The gpu address mapped into the mmu. 230054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin uint64_t gpuaddr __attribute__((aligned(8))); 231054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int format; 232054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int width; 233054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int height; 234054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin uint64_t base_metadata __attribute__((aligned(8))); 235054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 236054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#ifdef __cplusplus 237054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin static const int sNumFds = 2; 238054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin static inline int sNumInts() { 239054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return ((sizeof(private_handle_t) - sizeof(native_handle_t)) / 240054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin sizeof(int)) - sNumFds; 241054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 242054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin static const int sMagic = 'gmsm'; 243054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 244054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin private_handle_t(int fd, unsigned int size, int flags, int bufferType, 245054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int format, int width, int height, int eFd = -1, 246054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin unsigned int eOffset = 0, uint64_t eBase = 0) : 247054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin fd(fd), fd_metadata(eFd), magic(sMagic), 248054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin flags(flags), size(size), offset(0), bufferType(bufferType), 249054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin base(0), offset_metadata(eOffset), gpuaddr(0), 250054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin format(format), width(width), height(height), 251054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin base_metadata(eBase) 252054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin { 253054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin version = (int) sizeof(native_handle); 254054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin numInts = sNumInts(); 255054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin numFds = sNumFds; 256054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 257054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ~private_handle_t() { 258054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin magic = 0; 259054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 260054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 261054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin bool usesPhysicallyContiguousMemory() { 262054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return (flags & PRIV_FLAGS_USES_PMEM) != 0; 263054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 264054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 265054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin static int validate(const native_handle* h) { 266054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin const private_handle_t* hnd = (const private_handle_t*)h; 267054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (!h || h->version != sizeof(native_handle) || 268054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin h->numInts != sNumInts() || h->numFds != sNumFds || 269054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin hnd->magic != sMagic) 270054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin { 271054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGD("Invalid gralloc handle (at %p): " 272054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin "ver(%d/%zu) ints(%d/%d) fds(%d/%d)" 273054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin "magic(%c%c%c%c/%c%c%c%c)", 274054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin h, 275054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin h ? h->version : -1, sizeof(native_handle), 276054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin h ? h->numInts : -1, sNumInts(), 277054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin h ? h->numFds : -1, sNumFds, 278054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin hnd ? (((hnd->magic >> 24) & 0xFF)? 279054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ((hnd->magic >> 24) & 0xFF) : '-') : '?', 280054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin hnd ? (((hnd->magic >> 16) & 0xFF)? 281054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ((hnd->magic >> 16) & 0xFF) : '-') : '?', 282054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin hnd ? (((hnd->magic >> 8) & 0xFF)? 283054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ((hnd->magic >> 8) & 0xFF) : '-') : '?', 284054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin hnd ? (((hnd->magic >> 0) & 0xFF)? 285054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ((hnd->magic >> 0) & 0xFF) : '-') : '?', 286054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin (sMagic >> 24) & 0xFF, 287054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin (sMagic >> 16) & 0xFF, 288054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin (sMagic >> 8) & 0xFF, 289054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin (sMagic >> 0) & 0xFF); 290054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return -EINVAL; 291054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 292054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return 0; 293054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 294054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 295054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin static private_handle_t* dynamicCast(const native_handle* in) { 296054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (validate(in) == 0) { 297054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return (private_handle_t*) in; 298054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 299054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return NULL; 300054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 301054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#endif 302054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin }; 303054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 304054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#endif /* GRALLOC_PRIV_H_ */ 305