summaryrefslogtreecommitdiff
path: root/format_chooser.h (plain)
blob: 8b99ecd8606e2ccfe7235d7eaf94db9b7004cc08
1/*
2 * Copyright (C) 2014 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 FORMAT_CHOOSER_H_
20#define FORMAT_CHOOSER_H_
21
22#include <hardware/hardware.h>
23
24
25#define GRALLOC_ARM_INTFMT_EXTENSION_BIT_START 32
26
27/* This format will be use AFBC */
28#define GRALLOC_ARM_INTFMT_AFBC (1ULL << (GRALLOC_ARM_INTFMT_EXTENSION_BIT_START+0))
29
30/* This format uses AFBC split block mode */
31#define GRALLOC_ARM_INTFMT_AFBC_SPLITBLK (1ULL << (GRALLOC_ARM_INTFMT_EXTENSION_BIT_START+1))
32
33/* 10bit or 16bit, "extended" YUV format bit */
34#define GRALLOC_ARM_INTFMT_EXTENDED_YUV (1ULL << (GRALLOC_ARM_INTFMT_EXTENSION_BIT_START+2))
35
36/* This format uses AFBC wide block mode */
37#define GRALLOC_ARM_INTFMT_AFBC_WIDEBLK (1ULL << (GRALLOC_ARM_INTFMT_EXTENSION_BIT_START+3))
38
39/* 8bit or 10bit, Compressed ARM YUV formats */
40#define GRALLOC_ARM_INTFMT_ARM_AFBC_YUV (1ULL << (GRALLOC_ARM_INTFMT_EXTENSION_BIT_START+4))
41
42/* Internal format masks */
43#define GRALLOC_ARM_INTFMT_FMT_MASK 0x00000000ffffffffULL
44#define GRALLOC_ARM_INTFMT_EXT_MASK 0xffffffff00000000ULL
45
46/* Android pixel format private range start from 0x100 */
47#define GRALLOC_ANDROID_PRIVATE_RANGE_BASE_AFBC 0x100
48#define GRALLOC_ANDROID_PRIVATE_RANGE_BASE_AFBC_SPLITBLK 0x200
49#define GRALLOC_ANDROID_PRIVATE_RANGE_BASE_YUVEXT 0x400
50#define GRALLOC_ANDROID_PRIVATE_RANGE_BASE_AFBC_WIDEBLK 0x800
51
52#define GRALLOC_PRIVATE_FORMAT_WRAPPER_AFBC(x) (GRALLOC_ANDROID_PRIVATE_RANGE_BASE_AFBC + (x))
53#define GRALLOC_PRIVATE_FORMAT_WRAPPER_AFBC_SPLITBLK(x) (GRALLOC_ANDROID_PRIVATE_RANGE_BASE_AFBC_SPLITBLK + (x))
54#define GRALLOC_PRIVATE_FORMAT_WRAPPER_YUVEXT(x) (GRALLOC_ANDROID_PRIVATE_RANGE_BASE_YUVEXT + (x))
55#define GRALLOC_PRIVATE_FORMAT_WRAPPER_AFBC_WIDEBLK(x) (GRALLOC_ANDROID_PRIVATE_RANGE_BASE_AFBC_WIDEBLK + (x))
56
57/* Index of the internal formats */
58typedef enum
59{
60 GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_FIRST,
61 GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_RGBA_8888=GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_FIRST,
62 GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_RGBX_8888,
63 GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_RGB_888,
64 GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_RGB_565,
65 GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_BGRA_8888,
66 GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_sRGB_A_8888,
67 GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_sRGB_X_8888,
68 GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_YV12,
69 GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_Y8,
70 GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_Y16,
71 GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_NV12,
72
73 GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_RGBA_8888_AFBC,
74 GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_RGBX_8888_AFBC,
75 GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_RGB_888_AFBC,
76 GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_RGB_565_AFBC,
77 GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_BGRA_8888_AFBC,
78 GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_YUV420_8BIT_AFBC,
79 GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_YUV422_8BIT_AFBC,
80
81 GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_AFBC_SPLITBLK_FIRST,
82 GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_RGBA_8888_AFBC_SPLITBLK=GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_AFBC_SPLITBLK_FIRST,
83 GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_RGBX_8888_AFBC_SPLITBLK,
84 GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_RGB_888_AFBC_SPLITBLK,
85 GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_RGB_565_AFBC_SPLITBLK,
86 GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_BGRA_8888_AFBC_SPLITBLK,
87 GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_YUV420_8BIT_AFBC_SPLITBLK,
88 GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_AFBC_SPLITBLK_LAST=GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_YUV420_8BIT_AFBC_SPLITBLK,
89
90 GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_AFBC_WIDEBLK_FIRST,
91 GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_RGBA_8888_AFBC_SPLITBLK_WIDEBLK=GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_AFBC_WIDEBLK_FIRST,
92 GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_RGBX_8888_AFBC_SPLITBLK_WIDEBLK,
93 GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_RGB_888_AFBC_SPLITBLK_WIDEBLK,
94 GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_RGB_565_AFBC_WIDEBLK,
95 GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_BGRA_8888_AFBC_SPLITBLK_WIDEBLK,
96 GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_YUV420_8BIT_AFBC_WIDEBLK,
97 GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_YUV422_8BIT_AFBC_WIDEBLK,
98 GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_AFBC_WIDEBLK_LAST=GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_YUV422_8BIT_AFBC_WIDEBLK,
99
100 /* Extended YUV formats */
101 GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_Y0L2,
102 GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_P010,
103 GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_P210,
104 GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_Y210,
105 GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_Y410,
106
107 /* Compressed extended YUV formats */
108 GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_YUV420_10BIT_AFBC,
109 GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_YUV422_10BIT_AFBC,
110 GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_YUV420_10BIT_AFBC_WIDEBLK,
111 GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_YUV422_10BIT_AFBC_WIDEBLK,
112
113 /* Add more internal formats here */
114
115 GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_LAST
116} gralloc_arm_internal_index_format;
117
118typedef enum
119{
120 /* Having an invalid format catches lists which are initialized with not all entries. */
121 GRALLOC_ARM_HAL_FORMAT_INDEXED_INVALID,
122 GRALLOC_ARM_HAL_FORMAT_INDEXED_RGBA_8888,
123 GRALLOC_ARM_HAL_FORMAT_INDEXED_RGBX_8888,
124 GRALLOC_ARM_HAL_FORMAT_INDEXED_RGB_888,
125 GRALLOC_ARM_HAL_FORMAT_INDEXED_RGB_565,
126 GRALLOC_ARM_HAL_FORMAT_INDEXED_BGRA_8888,
127 GRALLOC_ARM_HAL_FORMAT_INDEXED_sRGB_A_8888,
128 GRALLOC_ARM_HAL_FORMAT_INDEXED_sRGB_X_8888,
129 GRALLOC_ARM_HAL_FORMAT_INDEXED_YV12,
130 GRALLOC_ARM_HAL_FORMAT_INDEXED_Y8,
131 GRALLOC_ARM_HAL_FORMAT_INDEXED_Y16,
132 GRALLOC_ARM_HAL_FORMAT_INDEXED_YCbCr_420_888,
133
134 /* Compressed 8BIT YUV format */
135 GRALLOC_ARM_HAL_FORMAT_INDEXED_YUV420_8BIT_AFBC,
136 GRALLOC_ARM_HAL_FORMAT_INDEXED_YUV422_8BIT_AFBC,
137
138 /* Extended YUV formats */
139 GRALLOC_ARM_HAL_FORMAT_INDEXED_Y0L2,
140 GRALLOC_ARM_HAL_FORMAT_INDEXED_P010,
141 GRALLOC_ARM_HAL_FORMAT_INDEXED_P210,
142 GRALLOC_ARM_HAL_FORMAT_INDEXED_Y210,
143 GRALLOC_ARM_HAL_FORMAT_INDEXED_Y410,
144
145 /* Compressed extended YUV formats */
146 GRALLOC_ARM_HAL_FORMAT_INDEXED_YUV420_10BIT_AFBC,
147 GRALLOC_ARM_HAL_FORMAT_INDEXED_YUV422_10BIT_AFBC,
148
149 GRALLOC_ARM_HAL_FORMAT_INDEXED_LAST
150} gralloc_arm_hal_index_format;
151
152#define MAX_COMPATIBLE 3
153#define DEFAULT_WEIGHT_SUPPORTED 50
154#define DEFAULT_WEIGHT_MOST_PREFERRED 100
155#define DEFAULT_WEIGHT_UNSUPPORTED -1
156
157#define GRALLOC_ANDROID_PRIVATE_IN_RANGE_OF_AFBC(x) \
158 (((x) > GRALLOC_ANDROID_PRIVATE_RANGE_BASE_AFBC && \
159 (x) <= (GRALLOC_ANDROID_PRIVATE_RANGE_BASE_AFBC + 0xff)) || \
160 ((x) == (GRALLOC_ANDROID_PRIVATE_RANGE_BASE_AFBC + HAL_PIXEL_FORMAT_YV12)))
161#define GRALLOC_ANDROID_PRIVATE_IN_RANGE_OF_AFBC_SPLITBLK(x) \
162 (((x) > GRALLOC_ANDROID_PRIVATE_RANGE_BASE_AFBC_SPLITBLK && \
163 (x) <= (GRALLOC_ANDROID_PRIVATE_RANGE_BASE_AFBC_SPLITBLK + 0xff)) || \
164 ((x) == ( GRALLOC_ANDROID_PRIVATE_RANGE_BASE_AFBC_SPLITBLK + HAL_PIXEL_FORMAT_YV12)))
165#define GRALLOC_ANDROID_PRIVATE_IN_RANGE_OF_AFBC_WIDEBLK(x) \
166 (((x) > GRALLOC_ANDROID_PRIVATE_RANGE_BASE_AFBC_WIDEBLK && \
167 (x) <= (GRALLOC_ANDROID_PRIVATE_RANGE_BASE_AFBC_WIDEBLK + 0xff)) || \
168 ((x) == ( GRALLOC_ANDROID_PRIVATE_RANGE_BASE_AFBC_WIDEBLK + HAL_PIXEL_FORMAT_YV12)))
169#define GRALLOC_ANDROID_PRIVATE_IN_RANGE_OF_BASE_YUVEXT(x) \
170 (((x & GRALLOC_ARM_INTFMT_FMT_MASK) >= \
171 (GRALLOC_ARM_HAL_FORMAT_INDEXED_Y0L2 + GRALLOC_ANDROID_PRIVATE_RANGE_BASE_YUVEXT)) && \
172 ((x & GRALLOC_ARM_INTFMT_FMT_MASK) <= \
173 (GRALLOC_ARM_HAL_FORMAT_INDEXED_YUV422_10BIT_AFBC + GRALLOC_ANDROID_PRIVATE_RANGE_BASE_YUVEXT)))
174
175typedef struct
176{
177 /* The internal extended format exported outside of gralloc */
178 uint64_t internal_extended_format;
179
180 /* Swizzled versions of the requested format for this internal format */
181 gralloc_arm_hal_index_format comp_format_list[MAX_COMPATIBLE];
182} internal_fmt_info;
183
184uint64_t gralloc_select_format(int req_format, int usage, int buffer_size);
185
186struct hwblk
187{
188 uint32_t usage;
189 int16_t weights[GRALLOC_ARM_HAL_FORMAT_INDEXED_LAST][GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_LAST];
190};
191
192
193typedef struct
194{
195 void (*blk_init)(struct hwblk *format_matrix, int16_t **array);
196 struct hwblk hwblkconf;
197} blkinit;
198
199
200extern void initialize_blk_conf();
201extern const internal_fmt_info translate_internal_indexed[GRALLOC_ARM_FORMAT_INTERNAL_INDEXED_LAST];
202extern blkinit blklist[];
203extern uint32_t blklist_array_size;
204extern bool osd_afbcd_enable();
205
206#ifdef __cplusplus
207extern "C"
208{
209#endif
210 int gralloc_get_internal_format(int hal_format);
211 void *gralloc_get_internal_info(int *blkconf_size, int *gpu_conf);
212#ifdef __cplusplus
213}
214#endif
215
216#endif /* FORMAT_CHOOSER_H_ */
217