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
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
|
/*
* Copyright Samsung Electronics Co.,LTD.
* Copyright (C) 2017 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 __UAPI_G2D_H__
#define __UAPI_G2D_H__
#ifdef __cplusplus
extern "C" {
#endif
#define G2D_SWZ_MASK 0xFFFF
#define G2D_SWZ_ARGB 0x3210
#define G2D_SWZ_ABGR 0x3012
#define G2D_SWZ_xBGR 0x5012
#define G2D_SWZ_xRGB 0x5210
#define G2D_SWZ_ALPHA_MASK (0xF << 12)
#define G2D_SWZ_ALPHA_ONE (0x5 << 12)
#define G2D_YUVORDER_MASK (0x3 << 24)
#define G2D_YUV_UV ((1 << 24) | G2D_SWZ_ARGB)
#define G2D_YUV_VU ((0 << 24) | G2D_SWZ_ARGB)
#define G2D_YUV_YC (0 << 25)
#define G2D_YUV_CY (1 << 25)
#define G2D_DATAFORMAT_AFBC (1 << 20)
#define G2D_DATAFORMAT_UORDER (1 << 21)
#define G2D_DATAFORMAT_SBWC (1 << 22)
#define G2D_DATAFMT_SHIFT 16
#define G2D_DATAFMT_MASK (0xF << G2D_DATAFMT_SHIFT)
#define G2D_DATAFMT_8888 (0 << G2D_DATAFMT_SHIFT)
#define G2D_DATAFMT_565 (1 << G2D_DATAFMT_SHIFT)
#define G2D_DATAFMT_4444 (2 << G2D_DATAFMT_SHIFT)
#define G2D_DATAFMT_888 (3 << G2D_DATAFMT_SHIFT)
#define G2D_DATAFMT_1555 (4 << G2D_DATAFMT_SHIFT)
#define G2D_DATAFMT_5551 (5 << G2D_DATAFMT_SHIFT)
#define G2D_DATAFMT_RGB8_MAX (5 << G2D_DATAFMT_SHIFT)
#define G2D_DATAFMT_8 (6 << G2D_DATAFMT_SHIFT)
#define G2D_DATAFMT_RESERVED (7 << G2D_DATAFMT_SHIFT)
#define G2D_DATAFMT_YUV_MIN (8 << G2D_DATAFMT_SHIFT)
#define G2D_DATAFMT_YUV420SP (8 << G2D_DATAFMT_SHIFT)
#define G2D_DATAFMT_YUV420P (9 << G2D_DATAFMT_SHIFT)
#define G2D_DATAFMT_YUV422I (10 << G2D_DATAFMT_SHIFT)
#define G2D_DATAFMT_YUV422SP (11 << G2D_DATAFMT_SHIFT)
#define G2D_DATAFMT_P010_LGCY (12 << G2D_DATAFMT_SHIFT)
#define G2D_DATAFMT_YUV_MAX (12 << G2D_DATAFMT_SHIFT)
#define G2D_DATAFMT_ABGR2101010 (14 << G2D_DATAFMT_SHIFT)
#define G2D_FMT_YCBCR_BITDEPTH_SHIFT 28
#define G2D_FMT_YCBCR_BITDEPTH_MASK (0x3 << G2D_FMT_YCBCR_BITDEPTH_SHIFT)
#define G2D_FMT_YCBCR_8BIT (0 << G2D_FMT_YCBCR_BITDEPTH_SHIFT)
#define G2D_FMT_YCBCR_10BIT (1 << G2D_FMT_YCBCR_BITDEPTH_SHIFT)
#define G2D_FMT_ARGB8888 (G2D_DATAFMT_8888 | G2D_SWZ_ARGB)
#define G2D_FMT_ABGR8888 (G2D_DATAFMT_8888 | G2D_SWZ_ABGR)
#define G2D_FMT_XBGR8888 (G2D_DATAFMT_8888 | G2D_SWZ_xBGR)
#define G2D_FMT_RGB565 (G2D_DATAFMT_565 | G2D_SWZ_xRGB)
#define G2D_FMT_BGR565 (G2D_DATAFMT_565 | G2D_SWZ_xBGR)
#define G2D_FMT_RGB888 (G2D_DATAFMT_888 | G2D_SWZ_xRGB)
#define G2D_FMT_NV12 (G2D_DATAFMT_YUV420SP | G2D_YUV_UV)
#define G2D_FMT_NV21 (G2D_DATAFMT_YUV420SP | G2D_YUV_VU)
#define G2D_FMT_YUV420P (G2D_DATAFMT_YUV420P | G2D_YUV_UV)
#define G2D_FMT_YV12 (G2D_DATAFMT_YUV420P | G2D_YUV_VU)
#define G2D_FMT_YUYV (G2D_DATAFMT_YUV422I | G2D_YUV_YC | G2D_YUV_UV)
#define G2D_FMT_YVYU (G2D_DATAFMT_YUV422I | G2D_YUV_YC | G2D_YUV_VU)
#define G2D_FMT_UYVY (G2D_DATAFMT_YUV422I | G2D_YUV_CY | G2D_YUV_UV)
#define G2D_FMT_VYUY (G2D_DATAFMT_YUV422I | G2D_YUV_CY | G2D_YUV_VU)
#define G2D_FMT_NV16 (G2D_DATAFMT_YUV422SP | G2D_YUV_UV)
#define G2D_FMT_NV61 (G2D_DATAFMT_YUV422SP | G2D_YUV_VU)
#define G2D_FMT_NV12_P010_LGCY (G2D_DATAFMT_P010_LGCY | G2D_YUV_UV)
#define G2D_FMT_NV21_P010_LGCY (G2D_DATAFMT_P010_LGCY | G2D_YUV_VU)
#define G2D_FMT_NV12_P010 (G2D_DATAFMT_YUV420SP | G2D_FMT_YCBCR_10BIT | G2D_YUV_UV)
#define G2D_FMT_NV21_P010 (G2D_DATAFMT_YUV420SP | G2D_FMT_YCBCR_10BIT | G2D_YUV_VU)
#define G2D_FMT_NV16_P210 (G2D_DATAFMT_YUV422SP | G2D_FMT_YCBCR_10BIT | G2D_YUV_UV)
#define G2D_FMT_NV61_P210 (G2D_DATAFMT_YUV422SP | G2D_FMT_YCBCR_10BIT | G2D_YUV_VU)
#define G2D_FMT_ABGR2101010 (G2D_DATAFMT_ABGR2101010 | G2D_SWZ_ABGR)
#define G2D_FMT_NV12_SBWC (G2D_FMT_NV12 | G2D_DATAFORMAT_SBWC)
#define G2D_FMT_NV21_SBWC (G2D_FMT_NV21 | G2D_DATAFORMAT_SBWC)
#define G2D_FMT_NV12_SBWC_10B (G2D_FMT_NV12_P010 | G2D_DATAFORMAT_SBWC)
#define G2D_FMT_NV21_SBWC_10B (G2D_FMT_NV21_P010 | G2D_DATAFORMAT_SBWC)
#define G2D_YCBCRMODE_DITHER (1 << 2)
#define IS_YUV(fmt) ((((fmt) & G2D_DATAFMT_MASK) >= G2D_DATAFMT_YUV_MIN) && (((fmt) & G2D_DATAFMT_MASK) <= G2D_DATAFMT_YUV_MAX))
#define IS_RGB(fmt) ((((fmt) & G2D_DATAFMT_MASK) <= G2D_DATAFMT_RGB8_MAX) || (((fmt) & G2D_DATAFMT_MASK) > G2D_DATAFMT_YUV_MAX))
#define G2D_IMGFMT(value) ((value) & \
(G2D_DATAFMT_MASK | G2D_YUVORDER_MASK | G2D_SWZ_MASK))
#define G2D_MAX_PLANES 4
#define G2D_ROTATEDIR_FLIP_SHIFT 4
#define G2D_ROTATEDIR_ROT90CCW (1 << 0)
#define G2D_BLEND_NONE (2 | (2 << 4) | (2 << 8) | (2 << 12) | (1 << 18)) // Ga*Sa*Sc + (1-Sa*Ga)*Dc
#define G2D_BLEND_SRCOVER (6 | (2 << 8) | (2 << 12) | (1 << 18)) // Ga*Sc + (1-Sa*Ga)*Dc
#define G2D_BLEND_SRCCOPY (6 | (1 << 8) ) // Ga*Sc
#define G2D_LAYERCMD_PREMULT_GLOBALALPHA (2 << 24)
#define G2D_LAYERCMD_PREMULT_ALPHA (1 << 24)
#define G2D_LAYERCMD_ALPHABLEND (1 << 20)
#define G2D_LAYERCMD_OPAQUE (1 << 1)
#define G2D_LAYERCMD_VALID (1 << 0)
#define G2D_LAYERSEL_COLORFILL 1
#define G2D_LAYER_YCBCRMODE_WIDE (1 << 4)
#define G2D_LAYER_YCBCRMODE_OFFX (2 << 8)
#define G2D_LAYER_YCBCRMODE_OFFY (2 << 12)
#define G2D_SCALECONTROL_BILINEAR 2
#define G2D_SCALECONTROL_POLYPHASE 3
#define G2D_SCALECONTROL_FILTERCOEF_SHIFT 4
#define G2D_SCALEFACTOR_FRACBITS 16
#define G2D_LAYER_HDRMODE_DEMULT_ALPHA (1 << 12)
struct g2d_reg {
uint32_t offset;
uint32_t value;
};
enum g2dsfr_img_register {
G2DSFR_IMG_STRIDE,
G2DSFR_IMG_COLORMODE,
G2DSFR_IMG_LEFT,
G2DSFR_IMG_TOP,
G2DSFR_IMG_RIGHT,
G2DSFR_IMG_BOTTOM,
G2DSFR_IMG_WIDTH,
G2DSFR_IMG_HEIGHT,
G2DSFR_IMG_FIELD_COUNT,
};
/*
* The order of command list should be fixed.
* The new command item must be added from the bottom.
*/
enum g2dsfr_src_register {
G2DSFR_SRC_COMMAND = G2DSFR_IMG_FIELD_COUNT,
G2DSFR_SRC_SELECT,
G2DSFR_SRC_ROTATE,
G2DSFR_SRC_DSTLEFT,
G2DSFR_SRC_DSTTOP,
G2DSFR_SRC_DSTRIGHT,
G2DSFR_SRC_DSTBOTTOM,
G2DSFR_SRC_SCALECONTROL,
G2DSFR_SRC_XSCALE,
G2DSFR_SRC_YSCALE,
G2DSFR_SRC_XPHASE,
G2DSFR_SRC_YPHASE,
G2DSFR_SRC_COLOR,
G2DSFR_SRC_ALPHA,
G2DSFR_SRC_BLEND,
G2DSFR_SRC_YCBCRMODE,
G2DSFR_SRC_HDRMODE,
G2DSFR_SRC_Y_HEADER_STRIDE,
G2DSFR_SRC_Y_PAYLOAD_STRIDE,
G2DSFR_SRC_C_HEADER_STRIDE,
G2DSFR_SRC_C_PAYLOAD_STRIDE,
G2DSFR_SRC_SBWCINFO,
G2DSFR_SRC_FIELD_COUNT
};
enum g2dsfr_dst_register {
G2DSFR_DST_YCBCRMODE = G2DSFR_IMG_FIELD_COUNT,
G2DSFR_DST_COMPAT_FIELD_COUNT,
G2DSFR_DST_Y_HEADER_STRIDE = G2DSFR_DST_COMPAT_FIELD_COUNT,
G2DSFR_DST_Y_PAYLOAD_STRIDE,
G2DSFR_DST_C_HEADER_STRIDE,
G2DSFR_DST_C_PAYLOAD_STRIDE,
G2DSFR_DST_SBWCINFO,
G2DSFR_DST_FIELD_COUNT,
};
#define G2D_MAX_PLANES 4
#define G2D_MAX_SFR_COUNT 1024
#define G2D_MAX_BUFFERS 4
#define G2D_MAX_IMAGES 16
#define G2D_MAX_PRIORITY 3
#define G2D_MAX_RELEASE_FENCES (G2D_MAX_IMAGES + 1)
struct g2d_compat_commands {
uint32_t target[G2DSFR_DST_COMPAT_FIELD_COUNT];
uint32_t *source[G2D_MAX_IMAGES];
struct g2d_reg *extra;
uint32_t num_extra_regs;
};
#define G2D_BUFTYPE_NONE 0
#define G2D_BUFTYPE_EMPTY 1
#define G2D_BUFTYPE_USERPTR 2
#define G2D_BUFTYPE_DMABUF 3
#define G2D_BUFTYPE_VALID(type) !(((type) & G2D_BUFTYPE_DMABUF) == 0)
struct g2d_buffer {
union {
void *userptr;
struct {
int32_t fd;
uint32_t offset;
} dmabuf;
};
uint32_t length;
};
#define G2D_LAYERFLAG_ACQUIRE_FENCE (1 << 1)
#define G2D_LAYERFLAG_SECURE (1 << 2)
#define G2D_LAYERFLAG_COLORFILL (1 << 3)
#define G2D_LAYERFLAG_MFC_STRIDE (1 << 4)
#define G2D_LAYERFLAG_NO_CACHECLEAN (1 << 16)
#define G2D_LAYERFLAG_NO_CACHEINV (1 << 17)
struct g2d_layer {
uint32_t flags;
int32_t fence;
uint32_t buffer_type;
uint32_t num_buffers;
struct g2d_buffer buffer[G2D_MAX_BUFFERS];
};
#define G2D_FLAG_DITHER (1 << 1)
#define G2D_FLAG_NONBLOCK (1 << 2)
#define G2D_FLAG_HWFC (1 << 3)
#define G2D_FLAG_APB (1 << 4)
#define G2D_FLAG_ERROR (1 << 5)
struct g2d_compat_task {
uint32_t version;
uint32_t flags;
uint32_t laptime_in_usec;
uint32_t priority;
uint32_t num_source;
uint32_t num_release_fences;
int32_t *release_fence;
struct g2d_layer target;
struct g2d_layer *source;
struct g2d_compat_commands commands;
};
/*
* Commands must be flexible because it may change according to H/W changes.
* The commands must be written in the promised order as version.
*/
struct g2d_commands {
uint32_t *target;
uint32_t *source[G2D_MAX_IMAGES];
struct g2d_reg *extra;
uint32_t num_extra_regs;
};
struct g2d_task {
uint32_t version;
uint32_t flags;
uint32_t laptime_in_usec;
uint32_t priority;
uint32_t num_source;
uint32_t num_release_fences;
int32_t *release_fence;
struct g2d_layer target;
struct g2d_layer *source;
struct g2d_commands commands;
};
#define G2D_PERF_LAYER_ROTATE (1 << 0)
#define G2D_PERF_LAYER_SCALING (1 << 1)
#define G2D_PERF_LAYER_YUV2P (1 << 4)
#define G2D_PERF_LAYER_SBWC (1 << 5)
#define G2D_PERF_LAYER_RGB_AFBC (1 << 6)
#define G2D_PERF_LAYER_YUV_AFBC (1 << 7)
struct g2d_performance_layer {
uint16_t crop_width;
uint16_t crop_height;
uint16_t window_width;
uint16_t window_height;
uint32_t layer_attr;
};
#define G2D_PERF_FRAME_SOLIDCOLORFILL (1 << 0)
struct g2d_performance_frame {
struct g2d_performance_layer layer[G2D_MAX_IMAGES];
uint32_t bandwidth_read;
uint32_t bandwidth_write;
uint32_t target_pixelcount;
uint32_t frame_rate;
uint32_t frame_attr;
uint32_t num_layers;
};
#define G2D_PERF_MAX_FRAMES 4
struct g2d_performance {
struct g2d_performance_frame frame[G2D_PERF_MAX_FRAMES];
uint32_t num_frame;
uint32_t reserved;
};
enum g2d_priority {
G2D_LOW_PRIORITY,
G2D_MEDIUM_PRIORITY,
G2D_DEFAULT_PRIORITY = G2D_MEDIUM_PRIORITY,
G2D_HIGH_PRIORITY,
G2D_HIGHEST_PRIORITY,
G2D_PRIORITY_END
};
#define G2D_IOC_PROCESS _IOWR('M', 3, struct g2d_task)
#define G2D_IOC_COMPAT_PROCESS _IOWR('M', 4, struct g2d_compat_task)
#define G2D_IOC_PRIORITY _IOR('M', 5, int32_t)
#define G2D_IOC_PERFORMANCE _IOR('M', 6, struct g2d_performance)
#define G2D_IOC_VERSION _IOR('M', 7, uint32_t)
#ifdef __cplusplus
}
#endif
#endif /* __UAPI_G2D_H__ */
|