blob: 20a5b4be4c041f08cf5fd7171ea69a4af58bc15a [file] [log] [blame]
/*
* 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
#define GRALLOC_ANDROID_PRIVATE_IN_RANGE_OF_AFBC(x) \
(((x) > GRALLOC_ANDROID_PRIVATE_RANGE_BASE_AFBC && \
(x) <= (GRALLOC_ANDROID_PRIVATE_RANGE_BASE_AFBC + 0xff)) || \
((x) == (GRALLOC_ANDROID_PRIVATE_RANGE_BASE_AFBC + HAL_PIXEL_FORMAT_YV12)))
#define GRALLOC_ANDROID_PRIVATE_IN_RANGE_OF_AFBC_SPLITBLK(x) \
(((x) > GRALLOC_ANDROID_PRIVATE_RANGE_BASE_AFBC_SPLITBLK && \
(x) <= (GRALLOC_ANDROID_PRIVATE_RANGE_BASE_AFBC_SPLITBLK + 0xff)) || \
((x) == ( GRALLOC_ANDROID_PRIVATE_RANGE_BASE_AFBC_SPLITBLK + HAL_PIXEL_FORMAT_YV12)))
#define GRALLOC_ANDROID_PRIVATE_IN_RANGE_OF_AFBC_WIDEBLK(x) \
(((x) > GRALLOC_ANDROID_PRIVATE_RANGE_BASE_AFBC_WIDEBLK && \
(x) <= (GRALLOC_ANDROID_PRIVATE_RANGE_BASE_AFBC_WIDEBLK + 0xff)) || \
((x) == ( GRALLOC_ANDROID_PRIVATE_RANGE_BASE_AFBC_WIDEBLK + HAL_PIXEL_FORMAT_YV12)))
#define GRALLOC_ANDROID_PRIVATE_IN_RANGE_OF_BASE_YUVEXT(x) \
(((x & GRALLOC_ARM_INTFMT_FMT_MASK) >= \
(GRALLOC_ARM_HAL_FORMAT_INDEXED_Y0L2 + GRALLOC_ANDROID_PRIVATE_RANGE_BASE_YUVEXT)) && \
((x & GRALLOC_ARM_INTFMT_FMT_MASK) <= \
(GRALLOC_ARM_HAL_FORMAT_INDEXED_YUV422_10BIT_AFBC + GRALLOC_ANDROID_PRIVATE_RANGE_BASE_YUVEXT)))
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, int buffer_size);
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_ */