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