Home | History | Annotate | Download | only in gralloc960
      1 /*
      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 
     28 static mali_gralloc_format_caps dpu_runtime_caps;
     29 static mali_gralloc_format_caps vpu_runtime_caps;
     30 static mali_gralloc_format_caps gpu_runtime_caps;
     31 static mali_gralloc_format_caps cam_runtime_caps;
     32 static pthread_mutex_t caps_init_mutex = PTHREAD_MUTEX_INITIALIZER;
     33 static 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 
     44 static 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 
     88 static 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 
    119 static 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 
    140 static 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 
    158 static 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 
    176 static bool is_afbc_format(uint64_t internal_format)
    177 {
    178     return (internal_format & MALI_GRALLOC_FORMAT_CAPABILITY_AFBCENABLE_MASK) != 0;
    179 }
    180 
    181 static 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 
    320 static 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     }
    377 out:
    378     return internal_format;
    379 }
    380 
    381 static 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 
    424 static 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  */
    472 static 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 
    570 already_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 
    579 uint64_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 
    647 out:
    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 
    653 extern "C"
    654 {
    655 void 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 }
    667