diff options
Diffstat (limited to 'format_chooser.h')
-rwxr-xr-x | format_chooser.h | 195 |
1 files changed, 195 insertions, 0 deletions
diff --git a/format_chooser.h b/format_chooser.h new file mode 100755 index 0000000..f70182e --- /dev/null +++ b/format_chooser.h @@ -0,0 +1,195 @@ +/* + * Copyright (C) 2014 ARM Limited. All rights reserved. + * + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FORMAT_CHOOSER_H_ +#define FORMAT_CHOOSER_H_ + +#include <hardware/hardware.h> + + +#define GRALLOC_ARM_INTFMT_EXTENSION_BIT_START 32 + +/* This format will be use AFBC */ +#define GRALLOC_ARM_INTFMT_AFBC (1ULL << (GRALLOC_ARM_INTFMT_EXTENSION_BIT_START+0)) + +/* This format uses AFBC split block mode */ +#define GRALLOC_ARM_INTFMT_AFBC_SPLITBLK (1ULL << (GRALLOC_ARM_INTFMT_EXTENSION_BIT_START+1)) + +/* 10bit or 16bit, "extended" YUV format bit */ +#define GRALLOC_ARM_INTFMT_EXTENDED_YUV (1ULL << (GRALLOC_ARM_INTFMT_EXTENSION_BIT_START+2)) + +/* This format uses AFBC wide block mode */ +#define GRALLOC_ARM_INTFMT_AFBC_WIDEBLK (1ULL << (GRALLOC_ARM_INTFMT_EXTENSION_BIT_START+3)) + +/* 8bit or 10bit, Compressed ARM YUV formats */ +#define GRALLOC_ARM_INTFMT_ARM_AFBC_YUV (1ULL << (GRALLOC_ARM_INTFMT_EXTENSION_BIT_START+4)) + +/* Internal format masks */ +#define GRALLOC_ARM_INTFMT_FMT_MASK 0x00000000ffffffffULL +#define GRALLOC_ARM_INTFMT_EXT_MASK 0xffffffff00000000ULL + +/* Android pixel format private range start from 0x100 */ +#define GRALLOC_ANDROID_PRIVATE_RANGE_BASE_AFBC 0x100 +#define GRALLOC_ANDROID_PRIVATE_RANGE_BASE_AFBC_SPLITBLK 0x200 +#define GRALLOC_ANDROID_PRIVATE_RANGE_BASE_YUVEXT 0x400 +#define GRALLOC_ANDROID_PRIVATE_RANGE_BASE_AFBC_WIDEBLK 0x800 + +#define GRALLOC_PRIVATE_FORMAT_WRAPPER_AFBC(x) (GRALLOC_ANDROID_PRIVATE_RANGE_BASE_AFBC + (x)) +#define GRALLOC_PRIVATE_FORMAT_WRAPPER_AFBC_SPLITBLK(x) (GRALLOC_ANDROID_PRIVATE_RANGE_BASE_AFBC_SPLITBLK + (x)) +#define GRALLOC_PRIVATE_FORMAT_WRAPPER_YUVEXT(x) (GRALLOC_ANDROID_PRIVATE_RANGE_BASE_YUVEXT + (x)) +#define GRALLOC_PRIVATE_FORMAT_WRAPPER_AFBC_WIDEBLK(x) (GRALLOC_ANDROID_PRIVATE_RANGE_BASE_AFBC_WIDEBLK + (x)) + +/* Index of the internal formats */ +typedef enum +{ + GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_FIRST, + GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_RGBA_8888=GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_FIRST, + GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_RGBX_8888, + GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_RGB_888, + GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_RGB_565, + GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_BGRA_8888, + GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_sRGB_A_8888, + GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_sRGB_X_8888, + GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_YV12, + GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_Y8, + GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_Y16, + + GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_RGBA_8888_AFBC, + GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_RGBX_8888_AFBC, + GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_RGB_888_AFBC, + GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_RGB_565_AFBC, + GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_BGRA_8888_AFBC, + GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_YUV420_8BIT_AFBC, + GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_YUV422_8BIT_AFBC, + + GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_AFBC_SPLITBLK_FIRST, + GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_RGBA_8888_AFBC_SPLITBLK=GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_AFBC_SPLITBLK_FIRST, + GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_RGBX_8888_AFBC_SPLITBLK, + GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_RGB_888_AFBC_SPLITBLK, + GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_RGB_565_AFBC_SPLITBLK, + GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_BGRA_8888_AFBC_SPLITBLK, + GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_YUV420_8BIT_AFBC_SPLITBLK, + GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_AFBC_SPLITBLK_LAST=GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_YUV420_8BIT_AFBC_SPLITBLK, + + GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_AFBC_WIDEBLK_FIRST, + GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_RGBA_8888_AFBC_SPLITBLK_WIDEBLK=GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_AFBC_WIDEBLK_FIRST, + GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_RGBX_8888_AFBC_SPLITBLK_WIDEBLK, + GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_RGB_888_AFBC_SPLITBLK_WIDEBLK, + GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_RGB_565_AFBC_WIDEBLK, + GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_BGRA_8888_AFBC_SPLITBLK_WIDEBLK, + GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_YUV420_8BIT_AFBC_WIDEBLK, + GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_YUV422_8BIT_AFBC_WIDEBLK, + GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_AFBC_WIDEBLK_LAST=GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_YUV422_8BIT_AFBC_WIDEBLK, + + /* Extended YUV formats */ + GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_Y0L2, + GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_P010, + GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_P210, + GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_Y210, + GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_Y410, + + /* Compressed extended YUV formats */ + GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_YUV420_10BIT_AFBC, + GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_YUV422_10BIT_AFBC, + GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_YUV420_10BIT_AFBC_WIDEBLK, + GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_YUV422_10BIT_AFBC_WIDEBLK, + + /* Add more internal formats here */ + + GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_LAST +} gralloc_arm_internal_index_format; + +typedef enum +{ + /* Having an invalid format catches lists which are initialized with not all entries. */ + GRALLOC_ARM_HAL_FORMAT_INDEXED_INVALID, + GRALLOC_ARM_HAL_FORMAT_INDEXED_RGBA_8888, + GRALLOC_ARM_HAL_FORMAT_INDEXED_RGBX_8888, + GRALLOC_ARM_HAL_FORMAT_INDEXED_RGB_888, + GRALLOC_ARM_HAL_FORMAT_INDEXED_RGB_565, + GRALLOC_ARM_HAL_FORMAT_INDEXED_BGRA_8888, + GRALLOC_ARM_HAL_FORMAT_INDEXED_sRGB_A_8888, + GRALLOC_ARM_HAL_FORMAT_INDEXED_sRGB_X_8888, + GRALLOC_ARM_HAL_FORMAT_INDEXED_YV12, + GRALLOC_ARM_HAL_FORMAT_INDEXED_Y8, + GRALLOC_ARM_HAL_FORMAT_INDEXED_Y16, + + /* Compressed 8BIT YUV format */ + GRALLOC_ARM_HAL_FORMAT_INDEXED_YUV420_8BIT_AFBC, + GRALLOC_ARM_HAL_FORMAT_INDEXED_YUV422_8BIT_AFBC, + + /* Extended YUV formats */ + GRALLOC_ARM_HAL_FORMAT_INDEXED_Y0L2, + GRALLOC_ARM_HAL_FORMAT_INDEXED_P010, + GRALLOC_ARM_HAL_FORMAT_INDEXED_P210, + GRALLOC_ARM_HAL_FORMAT_INDEXED_Y210, + GRALLOC_ARM_HAL_FORMAT_INDEXED_Y410, + + /* Compressed extended YUV formats */ + GRALLOC_ARM_HAL_FORMAT_INDEXED_YUV420_10BIT_AFBC, + GRALLOC_ARM_HAL_FORMAT_INDEXED_YUV422_10BIT_AFBC, + + GRALLOC_ARM_HAL_FORMAT_INDEXED_LAST +} gralloc_arm_hal_index_format; + +#define MAX_COMPATIBLE 3 +#define DEFAULT_WEIGHT_SUPPORTED 50 +#define DEFAULT_WEIGHT_MOST_PREFERRED 100 +#define DEFAULT_WEIGHT_UNSUPPORTED -1 + +typedef struct +{ + /* The internal extended format exported outside of gralloc */ + uint64_t internal_extended_format; + + /* Swizzled versions of the requested format for this internal format */ + gralloc_arm_hal_index_format comp_format_list[MAX_COMPATIBLE]; +} internal_fmt_info; + +uint64_t gralloc_select_format(int req_format, int usage); + +struct hwblk +{ + uint32_t usage; + int16_t weights[GRALLOC_ARM_HAL_FORMAT_INDEXED_LAST][GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_LAST]; +}; + + +typedef struct +{ + void (*blk_init)(struct hwblk *format_matrix, int16_t **array); + struct hwblk hwblkconf; +} blkinit; + + +extern void initialize_blk_conf(); +extern const internal_fmt_info translate_internal_indexed[GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_LAST]; +extern blkinit blklist[]; +extern uint32_t blklist_array_size; + +#ifdef __cplusplus +extern "C" +{ +#endif + int gralloc_get_internal_format(int hal_format); + void *gralloc_get_internal_info(int *blkconf_size, int *gpu_conf); +#ifdef __cplusplus +} +#endif + +#endif /* FORMAT_CHOOSER_H_ */ |