blob: 090e33863f470327d38371ded9dad42a9fce0c28 [file] [log] [blame]
John Stultz16100f62017-05-03 11:12:18 -07001/*
2 * Copyright (C) 2016 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#include <string.h>
20#include <dlfcn.h>
21#include <hardware/gralloc.h>
22#include <inttypes.h>
23#include <cutils/log.h>
24
25#include "mali_gralloc_formats.h"
26#include "gralloc_priv.h"
27
28static mali_gralloc_format_caps dpu_runtime_caps;
29static mali_gralloc_format_caps vpu_runtime_caps;
30static mali_gralloc_format_caps gpu_runtime_caps;
31static mali_gralloc_format_caps cam_runtime_caps;
32static pthread_mutex_t caps_init_mutex = PTHREAD_MUTEX_INITIALIZER;
33static bool runtime_caps_read = false;
34
35#define MALI_GRALLOC_GPU_LIB_NAME "libGLES_mali.so"
36#if defined(__LP64__)
37#define MALI_GRALLOC_GPU_LIBRARY_PATH1 "/vendor/lib64/egl/"
38#define MALI_GRALLOC_GPU_LIBRARY_PATH2 "/system/lib64/egl/"
39#else
40#define MALI_GRALLOC_GPU_LIBRARY_PATH1 "/vendor/lib/egl/"
41#define MALI_GRALLOC_GPU_LIBRARY_PATH2 "/system/lib/egl/"
42#endif
43
44static bool get_block_capabilities(bool hal_module, const char *name, mali_gralloc_format_caps *block_caps)
45{
46 void *dso_handle = NULL;
47 bool rval = false;
48
49 /* Look for MALI_GRALLOC_FORMATCAPS_SYM_NAME_STR symbol in user-space drivers
50 * to determine hw format capabilities.
51 */
52 if(!hal_module)
53 {
54 dso_handle = dlopen(name, RTLD_LAZY);
55 }
56 else
57 {
58 /* libhardware does some heuristics to find hal modules
59 * and then stores the dso handle internally. Use this.
60 */
61 const struct hw_module_t *module = {NULL};
62
63 if(hw_get_module(name, &module) >= 0)
64 {
65 dso_handle = module->dso;
66 }
67 }
68
69 if(dso_handle)
70 {
71 void *sym = dlsym(dso_handle, MALI_GRALLOC_FORMATCAPS_SYM_NAME_STR);
72
73 if(sym)
74 {
75 memcpy((void*) block_caps, sym, sizeof(mali_gralloc_format_caps));
76 rval = true;
77 }
78
79 if(!hal_module)
80 {
81 dlclose(dso_handle);
82 }
83 }
84
85 return rval;
86}
87
88static int map_flex_formats(int req_format, uint64_t *producer_runtime_mask)
89{
90 /* Map Android flexible formats to internal base formats */
91 if(req_format == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED ||
92 req_format == HAL_PIXEL_FORMAT_YCbCr_420_888)
93 {
94 req_format = MALI_GRALLOC_FORMAT_INTERNAL_NV12;
95
96 /*
97 * We disable AFBC for NV12 since neither VPU or DPU DDKs support
98 * them currently.
99 */
100 *producer_runtime_mask &= ~MALI_GRALLOC_FORMAT_CAPABILITY_AFBCENABLE_MASK;
101 }
102 else if(req_format == HAL_PIXEL_FORMAT_YCbCr_422_888)
103 {
104 /* To be determined */
105
106 /* Disable AFBC until we know though */
107 *producer_runtime_mask &= ~MALI_GRALLOC_FORMAT_CAPABILITY_AFBCENABLE_MASK;
108 }
109 else if(req_format == HAL_PIXEL_FORMAT_YCbCr_444_888)
110 {
111 /* To be determined */
112
113 /* Disable AFBC until we know though */
114 *producer_runtime_mask &= ~MALI_GRALLOC_FORMAT_CAPABILITY_AFBCENABLE_MASK;
115 }
116 return req_format;
117}
118
119static bool is_afbc_supported(int req_format_mapped)
120{
121 bool rval = true;
122
123 /* These base formats we currently don't support with compression */
124 switch(req_format_mapped)
125 {
126 case MALI_GRALLOC_FORMAT_INTERNAL_RAW16:
127 case MALI_GRALLOC_FORMAT_INTERNAL_RAW12:
128 case MALI_GRALLOC_FORMAT_INTERNAL_RAW10:
129 case MALI_GRALLOC_FORMAT_INTERNAL_BLOB:
130 case MALI_GRALLOC_FORMAT_INTERNAL_P010:
131 case MALI_GRALLOC_FORMAT_INTERNAL_P210:
132 case MALI_GRALLOC_FORMAT_INTERNAL_Y410:
133 case HAL_PIXEL_FORMAT_YCbCr_422_I:
134 rval = false;
135 break;
136 }
137 return rval;
138}
139
140static bool is_android_yuv_format(int req_format)
141{
142 bool rval = false;
143
144 switch(req_format)
145 {
146 case HAL_PIXEL_FORMAT_YV12:
147 case HAL_PIXEL_FORMAT_Y8:
148 case HAL_PIXEL_FORMAT_Y16:
149 case HAL_PIXEL_FORMAT_YCbCr_420_888:
150 case HAL_PIXEL_FORMAT_YCbCr_422_888:
151 case HAL_PIXEL_FORMAT_YCbCr_444_888:
152 rval = true;
153 break;
154 }
155 return rval;
156}
157
158static bool is_afbc_allowed(int buffer_size)
159{
160 bool afbc_allowed = false;
161
162 (void) buffer_size;
163
164#if GRALLOC_DISP_W != 0 && GRALLOC_DISP_H != 0
165 afbc_allowed = ((buffer_size*100) / (GRALLOC_DISP_W*GRALLOC_DISP_H)) >= GRALLOC_AFBC_MIN_SIZE;
166
167#else
168 /* If display size is not valid then always allow AFBC */
169 afbc_allowed = true;
170
171#endif
172
173 return afbc_allowed;
174}
175
176static bool is_afbc_format(uint64_t internal_format)
177{
178 return (internal_format & MALI_GRALLOC_FORMAT_CAPABILITY_AFBCENABLE_MASK) != 0;
179}
180
181static uint64_t determine_best_format(int req_format, mali_gralloc_producer_type producer, mali_gralloc_consumer_type consumer,
182 uint64_t producer_runtime_mask, uint64_t consumer_runtime_mask)
183{
184 /* Default is to return the requested format */
185 uint64_t internal_format = req_format;
186 uint64_t dpu_mask = dpu_runtime_caps.caps_mask;
187 uint64_t gpu_mask = gpu_runtime_caps.caps_mask;
188 uint64_t vpu_mask = vpu_runtime_caps.caps_mask;
189 uint64_t cam_mask = cam_runtime_caps.caps_mask;
190
191 if(producer == MALI_GRALLOC_PRODUCER_GPU && gpu_runtime_caps.caps_mask & MALI_GRALLOC_FORMAT_CAPABILITY_OPTIONS_PRESENT)
192 {
193 gpu_mask &= producer_runtime_mask;
194
195 if(consumer == MALI_GRALLOC_CONSUMER_GPU_OR_DISPLAY)
196 {
197 gpu_mask &= consumer_runtime_mask;
198 dpu_mask &= consumer_runtime_mask;
199
200 if(gpu_mask & MALI_GRALLOC_FORMAT_CAPABILITY_AFBC_SPLITBLK &&
201 dpu_mask & MALI_GRALLOC_FORMAT_CAPABILITY_AFBC_SPLITBLK)
202 {
203 internal_format |= MALI_GRALLOC_INTFMT_AFBC_SPLITBLK;
204 }
205 else if(gpu_mask & MALI_GRALLOC_FORMAT_CAPABILITY_AFBC_BASIC &&
206 dpu_mask & MALI_GRALLOC_FORMAT_CAPABILITY_AFBC_BASIC)
207 {
208 internal_format |= MALI_GRALLOC_INTFMT_AFBC_BASIC;
209
210 if(gpu_mask & MALI_GRALLOC_FORMAT_CAPABILITY_AFBC_TILED_HEADERS &&
211 dpu_mask & MALI_GRALLOC_FORMAT_CAPABILITY_AFBC_TILED_HEADERS)
212 {
213 internal_format |= MALI_GRALLOC_INTFMT_AFBC_TILED_HEADERS;
214 }
215 }
216 }
217 else if(consumer == MALI_GRALLOC_CONSUMER_GPU_EXCL)
218 {
219 gpu_mask &= consumer_runtime_mask;
220
221 /* When GPU acts as both producer and consumer it prefers 16x16 superblocks */
222 if(gpu_mask & MALI_GRALLOC_FORMAT_CAPABILITY_AFBC_BASIC)
223 {
224 internal_format |= MALI_GRALLOC_INTFMT_AFBC_BASIC;
225 }
226
227 if(gpu_mask & MALI_GRALLOC_FORMAT_CAPABILITY_AFBC_TILED_HEADERS)
228 {
229 internal_format |= MALI_GRALLOC_INTFMT_AFBC_TILED_HEADERS;
230 }
231 }
232 else if(consumer == MALI_GRALLOC_CONSUMER_VIDEO_ENCODER)
233 {
234 vpu_mask &= consumer_runtime_mask;
235
236 if(req_format == HAL_PIXEL_FORMAT_YV12)
237 {
238 if(gpu_mask & MALI_GRALLOC_FORMAT_CAPABILITY_AFBC_BASIC &&
239 vpu_mask & MALI_GRALLOC_FORMAT_CAPABILITY_AFBC_BASIC)
240 {
241 internal_format |= MALI_GRALLOC_INTFMT_AFBC_BASIC;
242 }
243
244 if(gpu_mask & MALI_GRALLOC_FORMAT_CAPABILITY_AFBC_TILED_HEADERS &&
245 vpu_mask & MALI_GRALLOC_FORMAT_CAPABILITY_AFBC_TILED_HEADERS)
246 {
247 internal_format |= MALI_GRALLOC_INTFMT_AFBC_TILED_HEADERS;
248 }
249 }
250 }
251 }
252 else if(producer == MALI_GRALLOC_PRODUCER_VIDEO_DECODER && vpu_runtime_caps.caps_mask & MALI_GRALLOC_FORMAT_CAPABILITY_OPTIONS_PRESENT)
253 {
254 vpu_mask &= producer_runtime_mask;
255
256 if(consumer == MALI_GRALLOC_CONSUMER_GPU_OR_DISPLAY)
257 {
258 gpu_mask &= consumer_runtime_mask;
259 dpu_mask &= consumer_runtime_mask;
260
261 if(internal_format == HAL_PIXEL_FORMAT_YV12)
262 {
263 if(vpu_mask & MALI_GRALLOC_FORMAT_CAPABILITY_AFBC_BASIC &&
264 gpu_mask & MALI_GRALLOC_FORMAT_CAPABILITY_AFBC_BASIC &&
265 dpu_mask & MALI_GRALLOC_FORMAT_CAPABILITY_AFBC_BASIC)
266 {
267 internal_format |= MALI_GRALLOC_INTFMT_AFBC_BASIC;
268 }
269
270 if(vpu_mask & MALI_GRALLOC_FORMAT_CAPABILITY_AFBC_TILED_HEADERS &&
271 gpu_mask & MALI_GRALLOC_FORMAT_CAPABILITY_AFBC_TILED_HEADERS &&
272 dpu_mask & MALI_GRALLOC_FORMAT_CAPABILITY_AFBC_TILED_HEADERS)
273 {
274 internal_format |= MALI_GRALLOC_INTFMT_AFBC_TILED_HEADERS;
275 }
276 }
277 }
278 else if(consumer == MALI_GRALLOC_CONSUMER_GPU_EXCL)
279 {
280 gpu_mask &= consumer_runtime_mask;
281
282 if(internal_format == HAL_PIXEL_FORMAT_YV12)
283 {
284 if(gpu_mask & MALI_GRALLOC_FORMAT_CAPABILITY_AFBC_BASIC &&
285 vpu_mask & MALI_GRALLOC_FORMAT_CAPABILITY_AFBC_BASIC)
286 {
287 internal_format |= MALI_GRALLOC_INTFMT_AFBC_BASIC;
288 }
289
290 if(gpu_mask & MALI_GRALLOC_FORMAT_CAPABILITY_AFBC_TILED_HEADERS &&
291 vpu_mask & MALI_GRALLOC_FORMAT_CAPABILITY_AFBC_TILED_HEADERS)
292 {
293 internal_format |= MALI_GRALLOC_INTFMT_AFBC_TILED_HEADERS;
294 }
295 }
296 }
297 else if(consumer == MALI_GRALLOC_CONSUMER_VIDEO_ENCODER)
298 {
299 /* Fall-through. To be decided.*/
300 }
301 }
302 else if(producer == MALI_GRALLOC_PRODUCER_CAMERA && cam_runtime_caps.caps_mask & MALI_GRALLOC_FORMAT_CAPABILITY_OPTIONS_PRESENT)
303 {
304 if(consumer == MALI_GRALLOC_CONSUMER_GPU_OR_DISPLAY)
305 {
306 /* Fall-through. To be decided.*/
307 }
308 else if(consumer == MALI_GRALLOC_CONSUMER_GPU_EXCL)
309 {
310 /* Fall-through. To be decided.*/
311 }
312 else if(consumer == MALI_GRALLOC_CONSUMER_VIDEO_ENCODER)
313 {
314 /* Fall-through. To be decided.*/
315 }
316 }
317 return internal_format;
318}
319
320static uint64_t decode_internal_format(int req_format)
321{
322 uint64_t internal_format, me_mask, base_format, mapped_base_format;
323 uint64_t ignore_mask;
324
325 internal_format = GRALLOC_PRIVATE_FORMAT_UNWRAP(req_format);
326
327 me_mask = internal_format & MALI_GRALLOC_INTFMT_ME_EXT_MASK;
328 if(me_mask > 0 && ((me_mask - 1) & me_mask) != 0)
329 {
330 ALOGE("Internal format contains multiple mutually exclusive modifier bits: %" PRIx64, internal_format);
331 internal_format = 0;
332 goto out;
333 }
334
335 base_format = internal_format & MALI_GRALLOC_INTFMT_FMT_MASK;
336
337 /* Even though private format allocations are intended to be for specific
338 * formats, certain test cases uses the flexible formats that needs to be mapped
339 * to internal ones.
340 */
341 mapped_base_format = map_flex_formats((uint32_t ) base_format, &ignore_mask);
342
343 /* Validate the internal base format passed in */
344 switch(mapped_base_format)
345 {
346 case MALI_GRALLOC_FORMAT_INTERNAL_RGBA_8888:
347 case MALI_GRALLOC_FORMAT_INTERNAL_RGBX_8888:
348 case MALI_GRALLOC_FORMAT_INTERNAL_RGB_888:
349 case MALI_GRALLOC_FORMAT_INTERNAL_RGB_565:
350 case MALI_GRALLOC_FORMAT_INTERNAL_BGRA_8888:
351 case MALI_GRALLOC_FORMAT_INTERNAL_YV12:
352 case MALI_GRALLOC_FORMAT_INTERNAL_Y8:
353 case MALI_GRALLOC_FORMAT_INTERNAL_Y16:
354 case MALI_GRALLOC_FORMAT_INTERNAL_RAW16:
355 case MALI_GRALLOC_FORMAT_INTERNAL_RAW12:
356 case MALI_GRALLOC_FORMAT_INTERNAL_RAW10:
357 case MALI_GRALLOC_FORMAT_INTERNAL_BLOB:
358 case MALI_GRALLOC_FORMAT_INTERNAL_NV12:
359 case MALI_GRALLOC_FORMAT_INTERNAL_NV21:
360 case MALI_GRALLOC_FORMAT_INTERNAL_YUV422_8BIT:
361 case MALI_GRALLOC_FORMAT_INTERNAL_Y0L2:
362 case MALI_GRALLOC_FORMAT_INTERNAL_P010:
363 case MALI_GRALLOC_FORMAT_INTERNAL_P210:
364 case MALI_GRALLOC_FORMAT_INTERNAL_Y210:
365 case MALI_GRALLOC_FORMAT_INTERNAL_Y410:
366 if(mapped_base_format != base_format)
367 {
368 internal_format = (internal_format & MALI_GRALLOC_INTFMT_EXT_MASK) | mapped_base_format;
369 }
370 break;
371
372 default:
373 ALOGE("Internal base format requested is unrecognized: %" PRIx64 ,internal_format);
374 internal_format = 0;
375 break;
376 }
377out:
378 return internal_format;
379}
380
381static bool determine_producer(mali_gralloc_producer_type *producer, uint64_t *producer_runtime_mask, int req_format, int usage)
382{
383 bool rval = true;
384
385 /* Default to GPU */
386 *producer = MALI_GRALLOC_PRODUCER_GPU;
387
388 if(usage & (GRALLOC_USAGE_SW_READ_MASK | GRALLOC_USAGE_SW_WRITE_MASK))
389 {
390 rval = false;
391 }
392 else if(usage & GRALLOC_USAGE_HW_RENDER)
393 {
394 if(is_android_yuv_format(req_format))
395 {
396 if(gpu_runtime_caps.caps_mask & MALI_GRALLOC_FORMAT_CAPABILITY_AFBC_YUV_NOWRITE)
397 {
398 *producer_runtime_mask &= ~MALI_GRALLOC_FORMAT_CAPABILITY_AFBCENABLE_MASK;
399 }
400 else
401 {
402 /* All GPUs that can write YUV AFBC can only do it in 16x16, optionally with tiled */
403 *producer_runtime_mask &= ~(MALI_GRALLOC_FORMAT_CAPABILITY_AFBC_SPLITBLK | MALI_GRALLOC_FORMAT_CAPABILITY_AFBC_WIDEBLK);
404 }
405 }
406 *producer = MALI_GRALLOC_PRODUCER_GPU;
407 }
408 else if(usage & GRALLOC_USAGE_HW_CAMERA_MASK)
409 {
410 *producer = MALI_GRALLOC_PRODUCER_CAMERA;
411 }
412 /* HW_TEXTURE+HW_COMPOSER+EXTERNAL_DISP is a definition set by
413 * stagefright for "video decoder". We check for it here.
414 */
415 else if((usage & (GRALLOC_USAGE_HW_TEXTURE | GRALLOC_USAGE_HW_COMPOSER | GRALLOC_USAGE_EXTERNAL_DISP)) ==
416 (GRALLOC_USAGE_HW_TEXTURE | GRALLOC_USAGE_HW_COMPOSER | GRALLOC_USAGE_EXTERNAL_DISP))
417 {
418 *producer = MALI_GRALLOC_PRODUCER_VIDEO_DECODER;
419 }
420
421 return rval;
422}
423
424static bool determine_consumer(mali_gralloc_consumer_type *consumer, uint64_t *consumer_runtime_mask, int req_format, int usage)
425{
426 bool rval = true;
427
428 /* Default to GPU */
429 *consumer = MALI_GRALLOC_CONSUMER_GPU_EXCL;
430
431 if(usage & (GRALLOC_USAGE_SW_READ_MASK | GRALLOC_USAGE_SW_WRITE_MASK))
432 {
433 rval = false;
434 }
435 /* When usage explicitly targets a consumer, as it does with GRALLOC_USAGE_HW_FB,
436 * we pick DPU even if there are no runtime capabilities present.
437 */
438 else if( usage & GRALLOC_USAGE_HW_FB )
439 {
440 *consumer = MALI_GRALLOC_CONSUMER_GPU_OR_DISPLAY;
441 }
442 else if(usage & GRALLOC_USAGE_HW_VIDEO_ENCODER)
443 {
444 if((vpu_runtime_caps.caps_mask & MALI_GRALLOC_FORMAT_CAPABILITY_AFBC_YUV_NOREAD) &&
445 is_android_yuv_format(req_format))
446 {
447 *consumer_runtime_mask &= ~MALI_GRALLOC_FORMAT_CAPABILITY_AFBCENABLE_MASK;
448 }
449 *consumer = MALI_GRALLOC_CONSUMER_VIDEO_ENCODER;
450 }
451 /* GRALLOC_USAGE_HW_COMPOSER is by default applied by SurfaceFlinger so we can't exclusively rely on it
452 * to determine consumer. When a buffer is targeted for either we reject the DPU when it lacks
453 * runtime capabilities, in favor of the more capable GPU.
454 */
455 else if((usage & (GRALLOC_USAGE_HW_TEXTURE | GRALLOC_USAGE_HW_COMPOSER )) == (GRALLOC_USAGE_HW_TEXTURE | GRALLOC_USAGE_HW_COMPOSER ) &&
456 dpu_runtime_caps.caps_mask & MALI_GRALLOC_FORMAT_CAPABILITY_OPTIONS_PRESENT)
457 {
458 *consumer = MALI_GRALLOC_CONSUMER_GPU_OR_DISPLAY;
459 }
460 else if(usage & GRALLOC_USAGE_HW_TEXTURE)
461 {
462 *consumer = MALI_GRALLOC_CONSUMER_GPU_EXCL;
463 }
464 return rval;
465}
466
467/*
468 * Here we determine format capabilities for the 4 IPs we support.
469 * For now these are controlled by build defines, but in the future
470 * they should be read out from each user-space driver.
471 */
472static void determine_format_capabilities()
473{
474 /* Loading libraries can take some time and
475 * we may see many allocations at boot.
476 */
477 pthread_mutex_lock(&caps_init_mutex);
478
479 if(runtime_caps_read)
480 {
481 goto already_init;
482 }
483
484 memset((void*) &dpu_runtime_caps,0,sizeof(dpu_runtime_caps));
485 memset((void*) &vpu_runtime_caps,0,sizeof(vpu_runtime_caps));
486 memset((void*) &gpu_runtime_caps,0,sizeof(gpu_runtime_caps));
487 memset((void*) &cam_runtime_caps,0,sizeof(cam_runtime_caps));
488
489 /* Determine DPU format capabilities */
490 if(!get_block_capabilities(true, "hwcomposer", &dpu_runtime_caps))
491 {
492#if MALI_DISPLAY_VERSION >= 500
493 dpu_runtime_caps.caps_mask |= MALI_GRALLOC_FORMAT_CAPABILITY_OPTIONS_PRESENT;
494 dpu_runtime_caps.caps_mask |= MALI_GRALLOC_FORMAT_CAPABILITY_AFBC_BASIC;
495
496#if MALI_DISPLAY_VERSION >= 550
497 dpu_runtime_caps.caps_mask |= MALI_GRALLOC_FORMAT_CAPABILITY_AFBC_SPLITBLK;
498#endif
499#endif
500 }
501
502 /* Determine GPU format capabilities */
503 if(access(MALI_GRALLOC_GPU_LIBRARY_PATH1 MALI_GRALLOC_GPU_LIB_NAME,R_OK) == 0)
504 {
505 get_block_capabilities(false, MALI_GRALLOC_GPU_LIBRARY_PATH1 MALI_GRALLOC_GPU_LIB_NAME, &gpu_runtime_caps);
506 }
507 else if(access(MALI_GRALLOC_GPU_LIBRARY_PATH2 MALI_GRALLOC_GPU_LIB_NAME,R_OK) == 0)
508 {
509 get_block_capabilities(false, MALI_GRALLOC_GPU_LIBRARY_PATH2 MALI_GRALLOC_GPU_LIB_NAME, &gpu_runtime_caps);
510 }
511
512 if((gpu_runtime_caps.caps_mask & MALI_GRALLOC_FORMAT_CAPABILITY_OPTIONS_PRESENT) == 0)
513 {
514 ALOGW("Failed to find GPU block configuration in %s. Using static build configuration.", MALI_GRALLOC_GPU_LIB_NAME);
515
516#if MALI_GPU_SUPPORT_AFBC_BASIC == 1
517 gpu_runtime_caps.caps_mask |= MALI_GRALLOC_FORMAT_CAPABILITY_OPTIONS_PRESENT;
518 gpu_runtime_caps.caps_mask |= MALI_GRALLOC_FORMAT_CAPABILITY_AFBC_BASIC;
519
520 /* Need to verify when to remove this */
521 gpu_runtime_caps.caps_mask |= MALI_GRALLOC_FORMAT_CAPABILITY_AFBC_YUV_NOWRITE;
522
523#if MALI_SUPPORT_AFBC_SPLITBLK == 1
524 gpu_runtime_caps.caps_mask |= MALI_GRALLOC_FORMAT_CAPABILITY_AFBC_SPLITBLK;
525#endif
526
527#if MALI_SUPPORT_AFBC_WIDEBLK == 1
528 gpu_runtime_caps.caps_mask |= MALI_GRALLOC_FORMAT_CAPABILITY_AFBC_SPLITBLK;
529 gpu_runtime_caps.caps_mask |= MALI_GRALLOC_FORMAT_CAPABILITY_AFBC_WIDEBLK;
530#endif
531
532#if MALI_USE_YUV_AFBC_WIDEBLK != 1
533 gpu_runtime_caps.caps_mask |= MALI_GRALLOC_FORMAT_CAPABILITY_AFBC_WIDEBLK_YUV_DISABLE;
534#endif
535
536#if MALI_SUPPORT_AFBC_TILED_HEADERS == 1
537 gpu_runtime_caps.caps_mask |= MALI_GRALLOC_FORMAT_CAPABILITY_AFBC_SPLITBLK;
538 gpu_runtime_caps.caps_mask |= MALI_GRALLOC_FORMAT_CAPABILITY_AFBC_WIDEBLK;
539 gpu_runtime_caps.caps_mask |= MALI_GRALLOC_FORMAT_CAPABILITY_AFBC_TILED_HEADERS;
540#endif
541#endif /* MALI_GPU_SUPPORT_AFBC_BASIC == 1 */
542 }
543
544 /* Determine VPU format capabilities */
545#if MALI_VIDEO_VERSION == 500 || MALI_VIDEO_VERSION == 550
546 vpu_runtime_caps.caps_mask |= MALI_GRALLOC_FORMAT_CAPABILITY_OPTIONS_PRESENT;
547 vpu_runtime_caps.caps_mask |= MALI_GRALLOC_FORMAT_CAPABILITY_AFBC_BASIC;
548 vpu_runtime_caps.caps_mask |= MALI_GRALLOC_FORMAT_CAPABILITY_AFBC_YUV_NOREAD;
549#endif
550
551#if MALI_VIDEO_VERSION == 61
552 vpu_runtime_caps.caps_mask |= MALI_GRALLOC_FORMAT_CAPABILITY_OPTIONS_PRESENT;
553 vpu_runtime_caps.caps_mask |= MALI_GRALLOC_FORMAT_CAPABILITY_AFBC_BASIC;
554 vpu_runtime_caps.caps_mask |= MALI_GRALLOC_FORMAT_CAPABILITY_AFBC_TILED_HEADERS;
555#endif
556
557
558 /* Build specific capability changes */
559#if GRALLOC_ARM_NO_EXTERNAL_AFBC == 1
560 {
561 dpu_runtime_caps.caps_mask &= ~MALI_GRALLOC_FORMAT_CAPABILITY_AFBCENABLE_MASK;
562 gpu_runtime_caps.caps_mask &= ~MALI_GRALLOC_FORMAT_CAPABILITY_AFBCENABLE_MASK;
563 vpu_runtime_caps.caps_mask &= ~MALI_GRALLOC_FORMAT_CAPABILITY_AFBCENABLE_MASK;
564 cam_runtime_caps.caps_mask &= ~MALI_GRALLOC_FORMAT_CAPABILITY_AFBCENABLE_MASK;
565 }
566#endif
567
568 runtime_caps_read = true;
569
570already_init:
571 pthread_mutex_unlock(&caps_init_mutex);
572
573 ALOGV("GPU format capabilities 0x%" PRIx64 , gpu_runtime_caps.caps_mask);
574 ALOGV("DPU format capabilities 0x%" PRIx64 , dpu_runtime_caps.caps_mask);
575 ALOGV("VPU format capabilities 0x%" PRIx64 , vpu_runtime_caps.caps_mask);
576 ALOGV("CAM format capabilities 0x%" PRIx64 , cam_runtime_caps.caps_mask);
577}
578
579uint64_t mali_gralloc_select_format(int req_format, int usage, int buffer_size)
580{
581 uint64_t internal_format = 0;
582 mali_gralloc_consumer_type consumer;
583 mali_gralloc_producer_type producer;
584 uint64_t producer_runtime_mask = ~(0ULL);
585 uint64_t consumer_runtime_mask = ~(0ULL);
586 int req_format_mapped=0;
587
588 if(!runtime_caps_read)
589 {
590 /*
591 * It is better to initialize these when needed because
592 * not all processes allocates memory.
593 */
594 determine_format_capabilities();
595 }
596
597 /* A unique usage specifies that an internal format is in req_format */
598 if(usage & MALI_GRALLOC_USAGE_PRIVATE_FORMAT)
599 {
600 internal_format = decode_internal_format(req_format);
601 goto out;
602 }
603
604 /* Re-map special Android formats */
605 req_format_mapped = map_flex_formats(req_format, &producer_runtime_mask);
606
607 /* Determine producer/consumer */
608 if(!determine_producer(&producer, &producer_runtime_mask, req_format, usage) ||
609 !determine_consumer(&consumer, &consumer_runtime_mask, req_format, usage))
610 {
611 /* Failing to determine producer/consumer usually means
612 * client has requested sw rendering.
613 */
614 internal_format = req_format_mapped;
615 goto out;
616 }
617
618 /*
619 * Determine runtime capability limitations
620 */
621
622 /* Disable AFBC based on unique usage */
623 if ((usage & MALI_GRALLOC_USAGE_NO_AFBC) == MALI_GRALLOC_USAGE_NO_AFBC)
624 {
625 if(is_android_yuv_format(req_format_mapped))
626 {
627 ALOGE("It is invalid to specify NO_AFBC usage flags when allocating YUV formats.\
628 Requested fmt: 0x%08X Re-Mapped fmt: 0x%08X",req_format,req_format_mapped);
629 internal_format = 0;
630 goto out;
631 }
632 producer_runtime_mask &= ~MALI_GRALLOC_FORMAT_CAPABILITY_AFBCENABLE_MASK;
633 }
634 /* Disable AFBC based on buffer dimensions */
635 else if(!is_afbc_allowed(buffer_size))
636 {
637 producer_runtime_mask &= ~MALI_GRALLOC_FORMAT_CAPABILITY_AFBCENABLE_MASK;
638 }
639 else if(!is_afbc_supported(req_format_mapped))
640 {
641 producer_runtime_mask &= ~MALI_GRALLOC_FORMAT_CAPABILITY_AFBCENABLE_MASK;
642 }
643
644 /* Automatically select format in case producer/consumer identified */
645 internal_format = determine_best_format(req_format_mapped, producer, consumer, producer_runtime_mask, consumer_runtime_mask);
646
647out:
648 ALOGV("mali_gralloc_select_format: req_format=0x%08X req_fmt_mapped=0x%08X internal_format=0x%" PRIx64 " usage=0x%08X",req_format, req_format_mapped, internal_format, usage);
649
650 return internal_format;
651}
652
653extern "C"
654{
655void mali_gralloc_get_gpu_caps(struct mali_gralloc_format_caps *gpu_caps)
656{
657 if(gpu_caps != NULL)
658 {
659 if(!runtime_caps_read)
660 {
661 determine_format_capabilities();
662 }
663 memcpy(gpu_caps,(void*) &gpu_runtime_caps,sizeof(struct mali_gralloc_format_caps));
664 }
665}
666}