summaryrefslogtreecommitdiff
path: root/format_chooser.h
blob: f70182e3d3a3daf71cfc12fc683502da0d55cd74 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
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_ */