summaryrefslogtreecommitdiff
path: root/format_chooser_blockinit.cpp (plain)
blob: cd5834049514fbb1aba6f46b1eb893d82f94d08b
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#include <hardware/hardware.h>
19#include <hardware/gralloc.h>
20
21/* The extension bits are defined for indexed formats when setting
22 * up the definitions. This define exports them before including
23 * the block definitions.
24 */
25#include "format_chooser.h"
26
27#include "formatdef_files/gpu_default.defs"
28
29#if MALI_AFBC_GRALLOC == 1
30#if MALI_SUPPORT_AFBC_WIDEBLK == 1
31#include "formatdef_files/gpu_afbc_wideblk.defs"
32#else
33#include "formatdef_files/gpu_afbc.defs"
34#endif
35#ifdef MALI_DISPLAY_VERSION
36#include "formatdef_files/display_afbc.defs"
37#endif
38#endif
39
40
41/* Defines a translation list of requested formats that are compatible with the internal indexed format */
42const internal_fmt_info translate_internal_indexed[GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_LAST] =
43{
44 {
45 HAL_PIXEL_FORMAT_RGBA_8888,
46 {GRALLOC_ARM_HAL_FORMAT_INDEXED_RGBA_8888, GRALLOC_ARM_HAL_FORMAT_INDEXED_BGRA_8888}
47 },
48
49 {
50 HAL_PIXEL_FORMAT_RGBX_8888,
51 {GRALLOC_ARM_HAL_FORMAT_INDEXED_RGBX_8888, GRALLOC_ARM_HAL_FORMAT_INDEXED_RGB_888}
52 },
53
54 {
55 HAL_PIXEL_FORMAT_RGB_888,
56 {GRALLOC_ARM_HAL_FORMAT_INDEXED_RGB_888, GRALLOC_ARM_HAL_FORMAT_INDEXED_RGBX_8888}
57 },
58
59 {
60 HAL_PIXEL_FORMAT_RGB_565,
61 {GRALLOC_ARM_HAL_FORMAT_INDEXED_RGB_565}
62 },
63
64 {
65 HAL_PIXEL_FORMAT_BGRA_8888,
66 {GRALLOC_ARM_HAL_FORMAT_INDEXED_BGRA_8888, GRALLOC_ARM_HAL_FORMAT_INDEXED_RGBA_8888}
67 },
68
69#if PLATFORM_SDK_VERSION >= 19 && PLATFORM_SDK_VERSION <= 22
70 {HAL_PIXEL_FORMAT_sRGB_A_8888, {GRALLOC_ARM_HAL_FORMAT_INDEXED_sRGB_A_8888} },
71 {HAL_PIXEL_FORMAT_sRGB_X_8888, {GRALLOC_ARM_HAL_FORMAT_INDEXED_sRGB_X_8888} },
72#else
73 {0, {GRALLOC_ARM_HAL_FORMAT_INDEXED_sRGB_A_8888} },
74 {0, {GRALLOC_ARM_HAL_FORMAT_INDEXED_sRGB_X_8888} },
75#endif
76
77 {
78 HAL_PIXEL_FORMAT_YV12,
79 {GRALLOC_ARM_HAL_FORMAT_INDEXED_YV12}
80 },
81
82#if PLATFORM_SDK_VERSION >= 18
83 {HAL_PIXEL_FORMAT_Y8, {GRALLOC_ARM_HAL_FORMAT_INDEXED_Y8} },
84 {HAL_PIXEL_FORMAT_Y16, {GRALLOC_ARM_HAL_FORMAT_INDEXED_Y16} },
85#else
86 {0, {GRALLOC_ARM_HAL_FORMAT_INDEXED_Y8} },
87 {0, {GRALLOC_ARM_HAL_FORMAT_INDEXED_Y16} },
88#endif
89
90 {HAL_PIXEL_FORMAT_YCbCr_420_888, {GRALLOC_ARM_HAL_FORMAT_INDEXED_YCbCr_420_888} },
91
92 {
93 HAL_PIXEL_FORMAT_RGBA_8888 | GRALLOC_ARM_INTFMT_AFBC,
94 {GRALLOC_ARM_HAL_FORMAT_INDEXED_RGBA_8888, GRALLOC_ARM_HAL_FORMAT_INDEXED_BGRA_8888}
95 },
96
97 {
98 HAL_PIXEL_FORMAT_RGBX_8888 | GRALLOC_ARM_INTFMT_AFBC,
99 {GRALLOC_ARM_HAL_FORMAT_INDEXED_RGBX_8888, GRALLOC_ARM_HAL_FORMAT_INDEXED_RGB_888}
100 },
101
102 {
103 HAL_PIXEL_FORMAT_RGB_888 | GRALLOC_ARM_INTFMT_AFBC,
104 {GRALLOC_ARM_HAL_FORMAT_INDEXED_RGB_888, GRALLOC_ARM_HAL_FORMAT_INDEXED_RGBX_8888}
105 },
106
107 {
108 HAL_PIXEL_FORMAT_RGB_565 | GRALLOC_ARM_INTFMT_AFBC,
109 {GRALLOC_ARM_HAL_FORMAT_INDEXED_RGB_565}
110 },
111
112 {
113 HAL_PIXEL_FORMAT_BGRA_8888 | GRALLOC_ARM_INTFMT_AFBC,
114 {GRALLOC_ARM_HAL_FORMAT_INDEXED_BGRA_8888, GRALLOC_ARM_HAL_FORMAT_INDEXED_RGBA_8888}
115 },
116
117 {
118 HAL_PIXEL_FORMAT_YV12 | GRALLOC_ARM_INTFMT_AFBC,
119 {GRALLOC_ARM_HAL_FORMAT_INDEXED_YV12, GRALLOC_ARM_HAL_FORMAT_INDEXED_YUV420_8BIT_AFBC}
120 },
121
122 {0, {GRALLOC_ARM_HAL_FORMAT_INDEXED_YUV422_8BIT_AFBC}},
123
124 {
125 HAL_PIXEL_FORMAT_RGBA_8888 | GRALLOC_ARM_INTFMT_AFBC_SPLITBLK,
126 {GRALLOC_ARM_HAL_FORMAT_INDEXED_RGBA_8888, GRALLOC_ARM_HAL_FORMAT_INDEXED_BGRA_8888}
127 },
128
129 {
130 HAL_PIXEL_FORMAT_RGBX_8888 | GRALLOC_ARM_INTFMT_AFBC_SPLITBLK,
131 {GRALLOC_ARM_HAL_FORMAT_INDEXED_RGBX_8888, GRALLOC_ARM_HAL_FORMAT_INDEXED_RGB_888}
132 },
133
134 {
135 HAL_PIXEL_FORMAT_RGB_888 | GRALLOC_ARM_INTFMT_AFBC_SPLITBLK,
136 {GRALLOC_ARM_HAL_FORMAT_INDEXED_RGB_888, GRALLOC_ARM_HAL_FORMAT_INDEXED_RGBX_8888}
137 },
138
139 {
140 HAL_PIXEL_FORMAT_RGB_565 | GRALLOC_ARM_INTFMT_AFBC_SPLITBLK,
141 {GRALLOC_ARM_HAL_FORMAT_INDEXED_RGB_565}
142 },
143
144 {
145 HAL_PIXEL_FORMAT_BGRA_8888 | GRALLOC_ARM_INTFMT_AFBC_SPLITBLK,
146 {GRALLOC_ARM_HAL_FORMAT_INDEXED_BGRA_8888, GRALLOC_ARM_HAL_FORMAT_INDEXED_RGBA_8888}
147 },
148
149 {
150 HAL_PIXEL_FORMAT_YV12 | GRALLOC_ARM_INTFMT_AFBC_SPLITBLK,
151 {GRALLOC_ARM_HAL_FORMAT_INDEXED_YV12, GRALLOC_ARM_HAL_FORMAT_INDEXED_YUV420_8BIT_AFBC}
152 },
153
154 {
155 HAL_PIXEL_FORMAT_RGBA_8888 | GRALLOC_ARM_INTFMT_AFBC_SPLITBLK | GRALLOC_ARM_INTFMT_AFBC_WIDEBLK,
156 {GRALLOC_ARM_HAL_FORMAT_INDEXED_RGBA_8888, GRALLOC_ARM_HAL_FORMAT_INDEXED_BGRA_8888}
157 },
158
159 {
160 HAL_PIXEL_FORMAT_RGBX_8888 | GRALLOC_ARM_INTFMT_AFBC_SPLITBLK | GRALLOC_ARM_INTFMT_AFBC_WIDEBLK,
161 {GRALLOC_ARM_HAL_FORMAT_INDEXED_RGBX_8888, GRALLOC_ARM_HAL_FORMAT_INDEXED_RGB_888}
162 },
163
164 {
165 HAL_PIXEL_FORMAT_RGB_888 | GRALLOC_ARM_INTFMT_AFBC_SPLITBLK | GRALLOC_ARM_INTFMT_AFBC_WIDEBLK,
166 {GRALLOC_ARM_HAL_FORMAT_INDEXED_RGB_888, GRALLOC_ARM_HAL_FORMAT_INDEXED_RGBX_8888}
167 },
168
169 {
170 HAL_PIXEL_FORMAT_RGB_565 | GRALLOC_ARM_INTFMT_AFBC_WIDEBLK,
171 {GRALLOC_ARM_HAL_FORMAT_INDEXED_RGB_565}
172 },
173
174 {
175 HAL_PIXEL_FORMAT_BGRA_8888 | GRALLOC_ARM_INTFMT_AFBC_SPLITBLK | GRALLOC_ARM_INTFMT_AFBC_WIDEBLK,
176 {GRALLOC_ARM_HAL_FORMAT_INDEXED_BGRA_8888, GRALLOC_ARM_HAL_FORMAT_INDEXED_RGBA_8888}
177 },
178
179 {
180 HAL_PIXEL_FORMAT_YV12 | GRALLOC_ARM_INTFMT_AFBC_WIDEBLK,
181 {GRALLOC_ARM_HAL_FORMAT_INDEXED_YV12, GRALLOC_ARM_HAL_FORMAT_INDEXED_YUV420_8BIT_AFBC}
182 },
183
184 {0, {GRALLOC_ARM_HAL_FORMAT_INDEXED_YUV422_8BIT_AFBC}},
185
186 /* No mapping as there is no corresponding HAL formats */
187 {0, {GRALLOC_ARM_HAL_FORMAT_INDEXED_Y0L2}},
188 {0, {GRALLOC_ARM_HAL_FORMAT_INDEXED_P010}},
189 {0, {GRALLOC_ARM_HAL_FORMAT_INDEXED_P210}},
190 {0, {GRALLOC_ARM_HAL_FORMAT_INDEXED_Y210}},
191 {0, {GRALLOC_ARM_HAL_FORMAT_INDEXED_Y410}},
192 /* Entry at GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_YUV420_10BIT_AFBC */
193 {0, {GRALLOC_ARM_HAL_FORMAT_INDEXED_YUV420_10BIT_AFBC}},
194 /* Entry at GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_YUV422_10BIT_AFBC */
195 {0, {GRALLOC_ARM_HAL_FORMAT_INDEXED_YUV422_10BIT_AFBC}},
196 /* Entry at GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_YUV420_10BIT_AFBC_WIDEBLK */
197 {0, {GRALLOC_ARM_HAL_FORMAT_INDEXED_YUV420_10BIT_AFBC}},
198 /* Entry at GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_YUV422_10BIT_AFBC_WIDEBLK */
199 {0, {GRALLOC_ARM_HAL_FORMAT_INDEXED_YUV422_10BIT_AFBC}},
200};
201
202blkinit blklist[] =
203{
204#if MALI_AFBC_GRALLOC == 1
205#ifdef MALI_DISPLAY_VERSION
206 {
207 display_afbc_hwc_blkinit,{0,{}}
208 },
209#endif
210 {
211 gpu_afbc_write_blkinit,{0,{}}
212 },
213 {
214 gpu_afbc_read_blkinit,{0,{}}
215 },
216#else
217 {
218 gpu_write_blkinit,{0,{}}
219 },
220 {
221 gpu_read_blkinit,{0,{}}
222 },
223#endif
224
225 /* Empty entry */
226 {
227 NULL,{0,{}}
228 }
229};
230
231uint32_t blklist_array_size = sizeof(blklist);
232
233void initialize_blk_conf()
234{
235 int i,j,k;
236
237 i=0;
238 while (blklist[i].blk_init != 0)
239 {
240 int16_t *array=0;
241
242 for (j = 0; j < GRALLOC_ARM_HAL_FORMAT_INDEXED_LAST; j++)
243 {
244 for (k = 0; k < (int) GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_LAST; k++)
245 {
246 blklist[i].hwblkconf.weights[j][k] = DEFAULT_WEIGHT_UNSUPPORTED;
247 }
248 }
249 blklist[i].blk_init( &blklist[i].hwblkconf , &array);
250 if (*array != 0)
251 {
252 for (k = GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_FIRST; k < GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_LAST; k++)
253 {
254 /* Zero weights are not suppose to be used in the preferred array because that usually means
255 * uninitialized values.
256 */
257 if ( array[k] != DEFAULT_WEIGHT_UNSUPPORTED && array[k] != 0 )
258 {
259 int n;
260
261 /* For this internal format we will for its base format setup matching weights
262 * for itself as well as swizzled versions of the format. When initializing
263 * swizzled/compatible formats with same weight, we insert a slight preference
264 * on the base format(which is listed first) to choose that when the base is selected.
265 * Other blocks' preference might adjust this.
266 */
267 for (n=0; n<MAX_COMPATIBLE; n++)
268 {
269 if ( translate_internal_indexed[k].comp_format_list[n] != GRALLOC_ARM_HAL_FORMAT_INDEXED_INVALID )
270 {
271 if (n == 0)
272 {
273 blklist[i].hwblkconf.weights[translate_internal_indexed[k].comp_format_list[n]][k] = array[k]+1;
274 }
275 else
276 {
277 blklist[i].hwblkconf.weights[translate_internal_indexed[k].comp_format_list[n]][k] = array[k];
278 }
279 }
280 }
281 }
282 }
283 }
284 i++;
285 }
286}
287