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 #ifndef MALI_GRALLOC_FORMATS_H_
     20 #define MALI_GRALLOC_FORMATS_H_
     21 
     22 #include <system/graphics.h>
     23 
     24 /* Internal formats are represented in gralloc as a 64bit identifier
     25  * where the 32 lower bits are a base format and the 32 upper bits are modifiers.
     26  *
     27  * Modifier bits are divided into mutually exclusive ones and those that are not.
     28  */
     29 /* Internal format type */
     30 typedef uint64_t mali_gralloc_internal_format;
     31 
     32 /* Internal format masks */
     33 #define    MALI_GRALLOC_INTFMT_FMT_MASK             0x00000000ffffffffULL
     34 #define    MALI_GRALLOC_INTFMT_EXT_MASK             0xffffffff00000000ULL
     35 #define    MALI_GRALLOC_INTFMT_ME_EXT_MASK          0x0000ffff00000000ULL
     36 #define    MALI_GRALLOC_INTFMT_REG_EXT_MASK         0xffff000000000000ULL
     37 
     38 /* Internal base formats */
     39 
     40 /* Base formats that do not have an identical HAL match
     41  * are defined starting at the Android private range
     42  */
     43 #define MALI_GRALLOC_FORMAT_INTERNAL_RANGE_BASE 0x100
     44 
     45 typedef enum
     46 {
     47     /* Internal definitions for HAL formats. */
     48     MALI_GRALLOC_FORMAT_INTERNAL_RGBA_8888 = HAL_PIXEL_FORMAT_RGBA_8888,
     49     MALI_GRALLOC_FORMAT_INTERNAL_RGBX_8888 = HAL_PIXEL_FORMAT_RGBX_8888,
     50     MALI_GRALLOC_FORMAT_INTERNAL_RGB_888 = HAL_PIXEL_FORMAT_RGB_888,
     51     MALI_GRALLOC_FORMAT_INTERNAL_RGB_565 = HAL_PIXEL_FORMAT_RGB_565 ,
     52     MALI_GRALLOC_FORMAT_INTERNAL_BGRA_8888 = HAL_PIXEL_FORMAT_BGRA_8888,
     53     MALI_GRALLOC_FORMAT_INTERNAL_YV12 = HAL_PIXEL_FORMAT_YV12 ,
     54     MALI_GRALLOC_FORMAT_INTERNAL_Y8 = HAL_PIXEL_FORMAT_Y8,
     55     MALI_GRALLOC_FORMAT_INTERNAL_Y16 = HAL_PIXEL_FORMAT_Y16,
     56     MALI_GRALLOC_FORMAT_INTERNAL_YUV420_888 = HAL_PIXEL_FORMAT_YCbCr_420_888,
     57 
     58     /* Camera specific HAL formats */
     59     MALI_GRALLOC_FORMAT_INTERNAL_RAW16 = HAL_PIXEL_FORMAT_RAW16,
     60     MALI_GRALLOC_FORMAT_INTERNAL_RAW12 = HAL_PIXEL_FORMAT_RAW12,
     61     MALI_GRALLOC_FORMAT_INTERNAL_RAW10 = HAL_PIXEL_FORMAT_RAW10,
     62     MALI_GRALLOC_FORMAT_INTERNAL_BLOB = HAL_PIXEL_FORMAT_BLOB,
     63 
     64     /* Flexible YUV formats would be parsed but not have any representation as
     65      * internal format itself but one of the ones below
     66      */
     67 
     68     /* The internal private formats that have no HAL equivivalent are defined
     69      * afterwards starting at a specific base range */
     70     MALI_GRALLOC_FORMAT_INTERNAL_NV12 = MALI_GRALLOC_FORMAT_INTERNAL_RANGE_BASE,
     71     MALI_GRALLOC_FORMAT_INTERNAL_NV21,
     72     MALI_GRALLOC_FORMAT_INTERNAL_YUV422_8BIT,
     73 
     74     /* Extended YUV formats
     75      *
     76      * NOTE: P010, P210, and Y410 are only supported uncompressed.
     77      */
     78     MALI_GRALLOC_FORMAT_INTERNAL_Y0L2,
     79     MALI_GRALLOC_FORMAT_INTERNAL_P010,
     80     MALI_GRALLOC_FORMAT_INTERNAL_P210,
     81     MALI_GRALLOC_FORMAT_INTERNAL_Y210,
     82     MALI_GRALLOC_FORMAT_INTERNAL_Y410,
     83 
     84     /* Add more internal formats here. Make sure decode_internal_format() is updated. */
     85 
     86     /* These are legacy 0.3 gralloc formats used only by the wrap/unwrap macros. */
     87     MALI_GRALLOC_FORMAT_INTERNAL_YV12_WRAP,
     88     MALI_GRALLOC_FORMAT_INTERNAL_Y8_WRAP,
     89     MALI_GRALLOC_FORMAT_INTERNAL_Y16_WRAP,
     90 
     91 	MALI_GRALLOC_FORMAT_INTERNAL_RANGE_LAST,
     92 } mali_gralloc_pixel_format;
     93 
     94 
     95 /* Format Modifier Bits Locations */
     96 #define MALI_GRALLOC_INTFMT_ME_EXTENSION_BIT_START             32
     97 #define MALI_GRALLOC_INTFMT_EXTENSION_BIT_START                (MALI_GRALLOC_INTFMT_ME_EXTENSION_BIT_START+16)
     98 
     99 /* Mutually Exclusive Modifier Bits */
    100 
    101 /* This format will use AFBC */
    102 #define    MALI_GRALLOC_INTFMT_AFBC_BASIC                 (1ULL << (MALI_GRALLOC_INTFMT_ME_EXTENSION_BIT_START+0))
    103 
    104 /* This format uses AFBC split block mode */
    105 #define    MALI_GRALLOC_INTFMT_AFBC_SPLITBLK        (1ULL << (MALI_GRALLOC_INTFMT_ME_EXTENSION_BIT_START+1))
    106 
    107 #define    MALI_GRALLOC_INTFMT_UNUSED               (1ULL << (MALI_GRALLOC_INTFMT_ME_EXTENSION_BIT_START+2))
    108 
    109 /* This format uses AFBC wide block mode */
    110 #define    MALI_GRALLOC_INTFMT_AFBC_WIDEBLK         (1ULL << (MALI_GRALLOC_INTFMT_ME_EXTENSION_BIT_START+3))
    111 
    112 
    113 /* Regular Modifier Bits */
    114 #define    MALI_GRALLOC_INTFMT_AFBC_TILED_HEADERS   (1ULL << (MALI_GRALLOC_INTFMT_EXTENSION_BIT_START+0))
    115 
    116 
    117 /* This mask should be used to check or clear support for AFBC for an internal format
    118  * These bits are mutually exclusive so this mask should not be used to enable support
    119  */
    120 #define    MALI_GRALLOC_INTFMT_AFBCENABLE_MASK                   ((uint64_t) (MALI_GRALLOC_INTFMT_AFBC_BASIC | \
    121                                                                    MALI_GRALLOC_INTFMT_AFBC_SPLITBLK | \
    122                                                                    MALI_GRALLOC_INTFMT_AFBC_WIDEBLK))
    123 
    124 /* Prototypes */
    125 uint64_t mali_gralloc_select_format(int req_format,int usage, int buffer_size);
    126 
    127 /* These are legacy Gralloc 0.3 support macros for passing private formats through the 0.3 alloc interface.
    128  * It packs modifier bits together with base format into a 32 bit format identifier.
    129  * Gralloc 1.0 interface should use private functions to set private buffer format in the buffer descriptor.
    130  *
    131  * Packing:
    132  *
    133  * Bits 15-0:    mali_gralloc_pixel_format format
    134  * Bits 23-16:   mutually exclusive modifier bits
    135  * Bits 31-24:   regular modifier bits
    136  */
    137 static inline int mali_gralloc_format_wrapper(int format, int modifiers)
    138 {
    139     /* Internal formats that are identical to HAL formats
    140      * have the same definition. This is convenient for
    141      * client parsing code to not have to parse them separately.
    142      *
    143      * For 3 of the HAL YUV formats that have very large definitions
    144      * this causes problems for packing in modifier bits.
    145      * Because of this reason we redefine these three formats
    146      * while packing/unpacking them.
    147      */
    148     if(format == MALI_GRALLOC_FORMAT_INTERNAL_YV12)
    149     {
    150         format = MALI_GRALLOC_FORMAT_INTERNAL_YV12_WRAP;
    151     }
    152     else if(format == MALI_GRALLOC_FORMAT_INTERNAL_Y8)
    153     {
    154         format = MALI_GRALLOC_FORMAT_INTERNAL_Y8_WRAP;
    155     }
    156     else if(format == MALI_GRALLOC_FORMAT_INTERNAL_Y16)
    157     {
    158         format = MALI_GRALLOC_FORMAT_INTERNAL_Y16_WRAP;
    159     }
    160     return (modifiers | format);
    161 }
    162 
    163 static inline uint64_t mali_gralloc_format_unwrap(int x)
    164 {
    165     uint64_t internal_format = (uint64_t) (    ((((uint64_t)(x)) & 0xff000000) << 24) | // Regular modifier bits
    166                                                ((((uint64_t)(x)) & 0x00ff0000) << 16) | // Mutually exclusive modifier bits
    167                                                 (((uint64_t)(x)) & 0x0000ffff)   );     // Private format
    168 
    169     uint64_t base_format = internal_format & MALI_GRALLOC_INTFMT_FMT_MASK;
    170     uint64_t modifiers = internal_format & MALI_GRALLOC_INTFMT_EXT_MASK;
    171 
    172     if(base_format == MALI_GRALLOC_FORMAT_INTERNAL_YV12_WRAP)
    173     {
    174         base_format = MALI_GRALLOC_FORMAT_INTERNAL_YV12;
    175     }
    176     else if(base_format == MALI_GRALLOC_FORMAT_INTERNAL_Y8_WRAP)
    177     {
    178         base_format = MALI_GRALLOC_FORMAT_INTERNAL_Y8;
    179     }
    180     else if(base_format == MALI_GRALLOC_FORMAT_INTERNAL_Y16_WRAP)
    181     {
    182         base_format = MALI_GRALLOC_FORMAT_INTERNAL_Y16;
    183     }
    184     return (modifiers | base_format);
    185 }
    186 
    187 #define    GRALLOC_PRIVATE_FORMAT_WRAPPER(x)                           ( mali_gralloc_format_wrapper(x, 0) )
    188 #define    GRALLOC_PRIVATE_FORMAT_WRAPPER_AFBC(x)                      ( mali_gralloc_format_wrapper(x, (MALI_GRALLOC_INTFMT_AFBC_BASIC >> 16)) )
    189 #define    GRALLOC_PRIVATE_FORMAT_WRAPPER_AFBC_SPLITBLK(x)             ( mali_gralloc_format_wrapper(x, (MALI_GRALLOC_INTFMT_AFBC_SPLITBLK >> 16)) )
    190 #define    GRALLOC_PRIVATE_FORMAT_WRAPPER_AFBC_WIDEBLK(x)              ( mali_gralloc_format_wrapper(x, (MALI_GRALLOC_INTFMT_AFBC_WIDEBLK >> 16)) )
    191 #define    GRALLOC_PRIVATE_FORMAT_WRAPPER_AFBC_TILED_HEADERS_BASIC(x)  ( mali_gralloc_format_wrapper(x, (MALI_GRALLOC_INTFMT_AFBC_TILED_HEADERS >> 24) | \
    192                                                                                                         (MALI_GRALLOC_INTFMT_AFBC_BASIC >> 16)))
    193 #define    GRALLOC_PRIVATE_FORMAT_WRAPPER_AFBC_TILED_HEADERS_WIDE(x)   ( mali_gralloc_format_wrapper(x, (MALI_GRALLOC_INTFMT_AFBC_TILED_HEADERS >> 24) | \
    194                                                                                                         (MALI_GRALLOC_INTFMT_AFBC_WIDEBLK >> 16)))
    195 #define    GRALLOC_PRIVATE_FORMAT_UNWRAP(x)                            mali_gralloc_format_unwrap(x)
    196 
    197 /* IP block capability masks */
    198 #define MALI_GRALLOC_FORMAT_CAPABILITY_OPTIONS_PRESENT            ((uint64_t) (1 << 0))
    199 #define MALI_GRALLOC_FORMAT_CAPABILITY_AFBC_BASIC                 ((uint64_t) (1 << 1))
    200 #define MALI_GRALLOC_FORMAT_CAPABILITY_AFBC_SPLITBLK              ((uint64_t) (1 << 2))
    201 #define MALI_GRALLOC_FORMAT_CAPABILITY_AFBC_WIDEBLK               ((uint64_t) (1 << 3))
    202 #define MALI_GRALLOC_FORMAT_CAPABILITY_AFBC_WIDEBLK_YUV_DISABLE   ((uint64_t) (1 << 4))
    203 #define MALI_GRALLOC_FORMAT_CAPABILITY_AFBC_YUV_NOREAD            ((uint64_t) (1 << 5))
    204 #define MALI_GRALLOC_FORMAT_CAPABILITY_AFBC_YUV_NOWRITE           ((uint64_t) (1 << 6))
    205 #define MALI_GRALLOC_FORMAT_CAPABILITY_AFBC_TILED_HEADERS         ((uint64_t) (1 << 7))
    206 
    207 #define MALI_GRALLOC_FORMAT_CAPABILITY_AFBCENABLE_MASK ((uint64_t) (MALI_GRALLOC_FORMAT_CAPABILITY_AFBC_BASIC | \
    208                                                                     MALI_GRALLOC_FORMAT_CAPABILITY_AFBC_SPLITBLK | \
    209                                                                     MALI_GRALLOC_FORMAT_CAPABILITY_AFBC_WIDEBLK | \
    210                                                                     MALI_GRALLOC_FORMAT_CAPABILITY_AFBC_TILED_HEADERS))
    211 
    212 struct mali_gralloc_format_caps
    213 {
    214 	uint64_t caps_mask;
    215 };
    216 typedef struct mali_gralloc_format_caps mali_gralloc_format_caps;
    217 
    218 #define MALI_GRALLOC_FORMATCAPS_SYM_NAME        mali_gralloc_format_capabilities
    219 #define MALI_GRALLOC_FORMATCAPS_SYM_NAME_STR    "mali_gralloc_format_capabilities"
    220 
    221 /* Producer and Consumer definitions */
    222 typedef enum
    223 {
    224 	MALI_GRALLOC_PRODUCER_VIDEO_DECODER,
    225 	MALI_GRALLOC_PRODUCER_GPU,
    226 	MALI_GRALLOC_PRODUCER_CAMERA,
    227 } mali_gralloc_producer_type;
    228 
    229 typedef enum
    230 {
    231 
    232     /* For surface composition in SurfaceFlinger a producer
    233      * will not know what consumer will process a buffer.
    234      *
    235      * MALI_GRALLOC_CONSUMER_GPU_OR_DISPLAY means the GPU
    236      * MUST support the given format but it should be allocated
    237      * with preference to the DPU.
    238      */
    239     MALI_GRALLOC_CONSUMER_GPU_OR_DISPLAY,
    240     MALI_GRALLOC_CONSUMER_VIDEO_ENCODER,
    241 
    242 
    243     /* This is used when no known "premium" dpu is configured.
    244      * For example, HDLCD/CLCD would be such a dpu.
    245      */
    246     MALI_GRALLOC_CONSUMER_GPU_EXCL,
    247 } mali_gralloc_consumer_type;
    248 
    249 
    250 /*
    251  * Below usage types overlap, this is intentional.
    252  * The reason is that for Gralloc 0.3 there are very
    253  * few usage flags we have at our disposal.
    254  *
    255  * The overlapping is handled by processing the definitions
    256  * in a specific order.
    257  *
    258  * MALI_GRALLOC_USAGE_PRIVATE_FORMAT and MALI_GRALLOC_USAGE_NO_AFBC
    259  * don't overlap and are processed first.
    260  *
    261  * MALI_GRALLOC_USAGE_YUV_CONF are only for YUV formats and clients
    262  * using MALI_GRALLOC_USAGE_NO_AFBC must never allocate YUV formats.
    263  * The latter is strictly enforced and allocations will fail.
    264  *
    265  * MALI_GRALLOC_USAGE_AFBC_PADDING is only valid if MALI_GRALLOC_USAGE_NO_AFBC
    266  * is not present.
    267  */
    268 typedef enum
    269 {
    270 	/* The client has specified a private format in the format parameter */
    271 	MALI_GRALLOC_USAGE_PRIVATE_FORMAT = (int) GRALLOC_USAGE_PRIVATE_3,
    272 
    273 	/* Buffer won't be allocated as AFBC */
    274 	MALI_GRALLOC_USAGE_NO_AFBC = (int) (GRALLOC_USAGE_PRIVATE_1 | GRALLOC_USAGE_PRIVATE_2),
    275 
    276 	/* Valid only for YUV allocations */
    277 	MALI_GRALLOC_USAGE_YUV_CONF_0 = 0,
    278 	MALI_GRALLOC_USAGE_YUV_CONF_1 = (int) GRALLOC_USAGE_PRIVATE_1,
    279 	MALI_GRALLOC_USAGE_YUV_CONF_2 = (int) GRALLOC_USAGE_PRIVATE_0,
    280 	MALI_GRALLOC_USAGE_YUV_CONF_3 = (int) (GRALLOC_USAGE_PRIVATE_0 | GRALLOC_USAGE_PRIVATE_1),
    281 	MALI_GRALLOC_USAGE_YUV_CONF_MASK = MALI_GRALLOC_USAGE_YUV_CONF_3,
    282 
    283 	/* A very specific alignment is requested on some buffers */
    284 	MALI_GRALLOC_USAGE_AFBC_PADDING = GRALLOC_USAGE_PRIVATE_2,
    285 
    286 } mali_gralloc_usage_type;
    287 
    288 /* Prototypes */
    289 uint64_t mali_gralloc_select_format(int req_format,int usage, int buffer_size);
    290 
    291 #ifdef __cplusplus
    292 extern "C"
    293 {
    294 #endif
    295 
    296 void mali_gralloc_get_gpu_caps(struct mali_gralloc_format_caps *gpu_caps);
    297 
    298 #ifdef __cplusplus
    299 }
    300 #endif
    301 
    302 #endif /* MALI_GRALLOC_FORMATS_H_ */
    303