blob: 8b99ecd8606e2ccfe7235d7eaf94db9b7004cc08
1 | /* |
2 | * Copyright (C) 2014 ARM Limited. All rights reserved. |
3 | * |
4 | * Copyright (C) 2008 The Android Open Source Project |
5 | * |
6 | * Licensed under the Apache License, Version 2.0 (the "License"); |
7 | * you may not use this file except in compliance with the License. |
8 | * You may obtain a copy of the License at |
9 | * |
10 | * http://www.apache.org/licenses/LICENSE-2.0 |
11 | * |
12 | * Unless required by applicable law or agreed to in writing, software |
13 | * distributed under the License is distributed on an "AS IS" BASIS, |
14 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
15 | * See the License for the specific language governing permissions and |
16 | * limitations under the License. |
17 | */ |
18 | |
19 | #ifndef FORMAT_CHOOSER_H_ |
20 | #define FORMAT_CHOOSER_H_ |
21 | |
22 | #include <hardware/hardware.h> |
23 | |
24 | |
25 | #define GRALLOC_ARM_INTFMT_EXTENSION_BIT_START 32 |
26 | |
27 | /* This format will be use AFBC */ |
28 | #define GRALLOC_ARM_INTFMT_AFBC (1ULL << (GRALLOC_ARM_INTFMT_EXTENSION_BIT_START+0)) |
29 | |
30 | /* This format uses AFBC split block mode */ |
31 | #define GRALLOC_ARM_INTFMT_AFBC_SPLITBLK (1ULL << (GRALLOC_ARM_INTFMT_EXTENSION_BIT_START+1)) |
32 | |
33 | /* 10bit or 16bit, "extended" YUV format bit */ |
34 | #define GRALLOC_ARM_INTFMT_EXTENDED_YUV (1ULL << (GRALLOC_ARM_INTFMT_EXTENSION_BIT_START+2)) |
35 | |
36 | /* This format uses AFBC wide block mode */ |
37 | #define GRALLOC_ARM_INTFMT_AFBC_WIDEBLK (1ULL << (GRALLOC_ARM_INTFMT_EXTENSION_BIT_START+3)) |
38 | |
39 | /* 8bit or 10bit, Compressed ARM YUV formats */ |
40 | #define GRALLOC_ARM_INTFMT_ARM_AFBC_YUV (1ULL << (GRALLOC_ARM_INTFMT_EXTENSION_BIT_START+4)) |
41 | |
42 | /* Internal format masks */ |
43 | #define GRALLOC_ARM_INTFMT_FMT_MASK 0x00000000ffffffffULL |
44 | #define GRALLOC_ARM_INTFMT_EXT_MASK 0xffffffff00000000ULL |
45 | |
46 | /* Android pixel format private range start from 0x100 */ |
47 | #define GRALLOC_ANDROID_PRIVATE_RANGE_BASE_AFBC 0x100 |
48 | #define GRALLOC_ANDROID_PRIVATE_RANGE_BASE_AFBC_SPLITBLK 0x200 |
49 | #define GRALLOC_ANDROID_PRIVATE_RANGE_BASE_YUVEXT 0x400 |
50 | #define GRALLOC_ANDROID_PRIVATE_RANGE_BASE_AFBC_WIDEBLK 0x800 |
51 | |
52 | #define GRALLOC_PRIVATE_FORMAT_WRAPPER_AFBC(x) (GRALLOC_ANDROID_PRIVATE_RANGE_BASE_AFBC + (x)) |
53 | #define GRALLOC_PRIVATE_FORMAT_WRAPPER_AFBC_SPLITBLK(x) (GRALLOC_ANDROID_PRIVATE_RANGE_BASE_AFBC_SPLITBLK + (x)) |
54 | #define GRALLOC_PRIVATE_FORMAT_WRAPPER_YUVEXT(x) (GRALLOC_ANDROID_PRIVATE_RANGE_BASE_YUVEXT + (x)) |
55 | #define GRALLOC_PRIVATE_FORMAT_WRAPPER_AFBC_WIDEBLK(x) (GRALLOC_ANDROID_PRIVATE_RANGE_BASE_AFBC_WIDEBLK + (x)) |
56 | |
57 | /* Index of the internal formats */ |
58 | typedef enum |
59 | { |
60 | GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_FIRST, |
61 | GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_RGBA_8888=GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_FIRST, |
62 | GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_RGBX_8888, |
63 | GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_RGB_888, |
64 | GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_RGB_565, |
65 | GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_BGRA_8888, |
66 | GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_sRGB_A_8888, |
67 | GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_sRGB_X_8888, |
68 | GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_YV12, |
69 | GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_Y8, |
70 | GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_Y16, |
71 | GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_NV12, |
72 | |
73 | GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_RGBA_8888_AFBC, |
74 | GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_RGBX_8888_AFBC, |
75 | GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_RGB_888_AFBC, |
76 | GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_RGB_565_AFBC, |
77 | GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_BGRA_8888_AFBC, |
78 | GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_YUV420_8BIT_AFBC, |
79 | GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_YUV422_8BIT_AFBC, |
80 | |
81 | GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_AFBC_SPLITBLK_FIRST, |
82 | GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_RGBA_8888_AFBC_SPLITBLK=GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_AFBC_SPLITBLK_FIRST, |
83 | GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_RGBX_8888_AFBC_SPLITBLK, |
84 | GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_RGB_888_AFBC_SPLITBLK, |
85 | GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_RGB_565_AFBC_SPLITBLK, |
86 | GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_BGRA_8888_AFBC_SPLITBLK, |
87 | GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_YUV420_8BIT_AFBC_SPLITBLK, |
88 | GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_AFBC_SPLITBLK_LAST=GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_YUV420_8BIT_AFBC_SPLITBLK, |
89 | |
90 | GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_AFBC_WIDEBLK_FIRST, |
91 | GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_RGBA_8888_AFBC_SPLITBLK_WIDEBLK=GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_AFBC_WIDEBLK_FIRST, |
92 | GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_RGBX_8888_AFBC_SPLITBLK_WIDEBLK, |
93 | GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_RGB_888_AFBC_SPLITBLK_WIDEBLK, |
94 | GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_RGB_565_AFBC_WIDEBLK, |
95 | GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_BGRA_8888_AFBC_SPLITBLK_WIDEBLK, |
96 | GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_YUV420_8BIT_AFBC_WIDEBLK, |
97 | GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_YUV422_8BIT_AFBC_WIDEBLK, |
98 | GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_AFBC_WIDEBLK_LAST=GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_YUV422_8BIT_AFBC_WIDEBLK, |
99 | |
100 | /* Extended YUV formats */ |
101 | GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_Y0L2, |
102 | GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_P010, |
103 | GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_P210, |
104 | GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_Y210, |
105 | GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_Y410, |
106 | |
107 | /* Compressed extended YUV formats */ |
108 | GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_YUV420_10BIT_AFBC, |
109 | GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_YUV422_10BIT_AFBC, |
110 | GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_YUV420_10BIT_AFBC_WIDEBLK, |
111 | GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_YUV422_10BIT_AFBC_WIDEBLK, |
112 | |
113 | /* Add more internal formats here */ |
114 | |
115 | GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_LAST |
116 | } gralloc_arm_internal_index_format; |
117 | |
118 | typedef enum |
119 | { |
120 | /* Having an invalid format catches lists which are initialized with not all entries. */ |
121 | GRALLOC_ARM_HAL_FORMAT_INDEXED_INVALID, |
122 | GRALLOC_ARM_HAL_FORMAT_INDEXED_RGBA_8888, |
123 | GRALLOC_ARM_HAL_FORMAT_INDEXED_RGBX_8888, |
124 | GRALLOC_ARM_HAL_FORMAT_INDEXED_RGB_888, |
125 | GRALLOC_ARM_HAL_FORMAT_INDEXED_RGB_565, |
126 | GRALLOC_ARM_HAL_FORMAT_INDEXED_BGRA_8888, |
127 | GRALLOC_ARM_HAL_FORMAT_INDEXED_sRGB_A_8888, |
128 | GRALLOC_ARM_HAL_FORMAT_INDEXED_sRGB_X_8888, |
129 | GRALLOC_ARM_HAL_FORMAT_INDEXED_YV12, |
130 | GRALLOC_ARM_HAL_FORMAT_INDEXED_Y8, |
131 | GRALLOC_ARM_HAL_FORMAT_INDEXED_Y16, |
132 | GRALLOC_ARM_HAL_FORMAT_INDEXED_YCbCr_420_888, |
133 | |
134 | /* Compressed 8BIT YUV format */ |
135 | GRALLOC_ARM_HAL_FORMAT_INDEXED_YUV420_8BIT_AFBC, |
136 | GRALLOC_ARM_HAL_FORMAT_INDEXED_YUV422_8BIT_AFBC, |
137 | |
138 | /* Extended YUV formats */ |
139 | GRALLOC_ARM_HAL_FORMAT_INDEXED_Y0L2, |
140 | GRALLOC_ARM_HAL_FORMAT_INDEXED_P010, |
141 | GRALLOC_ARM_HAL_FORMAT_INDEXED_P210, |
142 | GRALLOC_ARM_HAL_FORMAT_INDEXED_Y210, |
143 | GRALLOC_ARM_HAL_FORMAT_INDEXED_Y410, |
144 | |
145 | /* Compressed extended YUV formats */ |
146 | GRALLOC_ARM_HAL_FORMAT_INDEXED_YUV420_10BIT_AFBC, |
147 | GRALLOC_ARM_HAL_FORMAT_INDEXED_YUV422_10BIT_AFBC, |
148 | |
149 | GRALLOC_ARM_HAL_FORMAT_INDEXED_LAST |
150 | } gralloc_arm_hal_index_format; |
151 | |
152 | #define MAX_COMPATIBLE 3 |
153 | #define DEFAULT_WEIGHT_SUPPORTED 50 |
154 | #define DEFAULT_WEIGHT_MOST_PREFERRED 100 |
155 | #define DEFAULT_WEIGHT_UNSUPPORTED -1 |
156 | |
157 | #define GRALLOC_ANDROID_PRIVATE_IN_RANGE_OF_AFBC(x) \ |
158 | (((x) > GRALLOC_ANDROID_PRIVATE_RANGE_BASE_AFBC && \ |
159 | (x) <= (GRALLOC_ANDROID_PRIVATE_RANGE_BASE_AFBC + 0xff)) || \ |
160 | ((x) == (GRALLOC_ANDROID_PRIVATE_RANGE_BASE_AFBC + HAL_PIXEL_FORMAT_YV12))) |
161 | #define GRALLOC_ANDROID_PRIVATE_IN_RANGE_OF_AFBC_SPLITBLK(x) \ |
162 | (((x) > GRALLOC_ANDROID_PRIVATE_RANGE_BASE_AFBC_SPLITBLK && \ |
163 | (x) <= (GRALLOC_ANDROID_PRIVATE_RANGE_BASE_AFBC_SPLITBLK + 0xff)) || \ |
164 | ((x) == ( GRALLOC_ANDROID_PRIVATE_RANGE_BASE_AFBC_SPLITBLK + HAL_PIXEL_FORMAT_YV12))) |
165 | #define GRALLOC_ANDROID_PRIVATE_IN_RANGE_OF_AFBC_WIDEBLK(x) \ |
166 | (((x) > GRALLOC_ANDROID_PRIVATE_RANGE_BASE_AFBC_WIDEBLK && \ |
167 | (x) <= (GRALLOC_ANDROID_PRIVATE_RANGE_BASE_AFBC_WIDEBLK + 0xff)) || \ |
168 | ((x) == ( GRALLOC_ANDROID_PRIVATE_RANGE_BASE_AFBC_WIDEBLK + HAL_PIXEL_FORMAT_YV12))) |
169 | #define GRALLOC_ANDROID_PRIVATE_IN_RANGE_OF_BASE_YUVEXT(x) \ |
170 | (((x & GRALLOC_ARM_INTFMT_FMT_MASK) >= \ |
171 | (GRALLOC_ARM_HAL_FORMAT_INDEXED_Y0L2 + GRALLOC_ANDROID_PRIVATE_RANGE_BASE_YUVEXT)) && \ |
172 | ((x & GRALLOC_ARM_INTFMT_FMT_MASK) <= \ |
173 | (GRALLOC_ARM_HAL_FORMAT_INDEXED_YUV422_10BIT_AFBC + GRALLOC_ANDROID_PRIVATE_RANGE_BASE_YUVEXT))) |
174 | |
175 | typedef struct |
176 | { |
177 | /* The internal extended format exported outside of gralloc */ |
178 | uint64_t internal_extended_format; |
179 | |
180 | /* Swizzled versions of the requested format for this internal format */ |
181 | gralloc_arm_hal_index_format comp_format_list[MAX_COMPATIBLE]; |
182 | } internal_fmt_info; |
183 | |
184 | uint64_t gralloc_select_format(int req_format, int usage, int buffer_size); |
185 | |
186 | struct hwblk |
187 | { |
188 | uint32_t usage; |
189 | int16_t weights[GRALLOC_ARM_HAL_FORMAT_INDEXED_LAST][GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_LAST]; |
190 | }; |
191 | |
192 | |
193 | typedef struct |
194 | { |
195 | void (*blk_init)(struct hwblk *format_matrix, int16_t **array); |
196 | struct hwblk hwblkconf; |
197 | } blkinit; |
198 | |
199 | |
200 | extern void initialize_blk_conf(); |
201 | extern const internal_fmt_info translate_internal_indexed[GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_LAST]; |
202 | extern blkinit blklist[]; |
203 | extern uint32_t blklist_array_size; |
204 | extern bool osd_afbcd_enable(); |
205 | |
206 | #ifdef __cplusplus |
207 | extern "C" |
208 | { |
209 | #endif |
210 | int gralloc_get_internal_format(int hal_format); |
211 | void *gralloc_get_internal_info(int *blkconf_size, int *gpu_conf); |
212 | #ifdef __cplusplus |
213 | } |
214 | #endif |
215 | |
216 | #endif /* FORMAT_CHOOSER_H_ */ |
217 |