Commit | Line | Data |
---|---|---|
f64122c1 DA |
1 | /* |
2 | Copyright (C) 2009 Red Hat, Inc. | |
3 | ||
4 | Redistribution and use in source and binary forms, with or without | |
5 | modification, are permitted provided that the following conditions are | |
6 | met: | |
7 | ||
8 | * Redistributions of source code must retain the above copyright | |
9 | notice, this list of conditions and the following disclaimer. | |
10 | * Redistributions in binary form must reproduce the above copyright | |
11 | notice, this list of conditions and the following disclaimer in | |
12 | the documentation and/or other materials provided with the | |
13 | distribution. | |
14 | * Neither the name of the copyright holder nor the names of its | |
15 | contributors may be used to endorse or promote products derived | |
16 | from this software without specific prior written permission. | |
17 | ||
18 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS "AS | |
19 | IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED | |
20 | TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A | |
21 | PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | |
22 | HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
23 | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |
24 | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |
25 | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | |
26 | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
27 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
28 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
29 | */ | |
30 | ||
31 | ||
32 | #ifndef H_QXL_DEV | |
33 | #define H_QXL_DEV | |
34 | ||
35 | #include <linux/types.h> | |
36 | ||
37 | /* | |
38 | * from spice-protocol | |
39 | * Release 0.10.0 | |
40 | */ | |
41 | ||
42 | /* enums.h */ | |
43 | ||
44 | enum SpiceImageType { | |
45 | SPICE_IMAGE_TYPE_BITMAP, | |
46 | SPICE_IMAGE_TYPE_QUIC, | |
47 | SPICE_IMAGE_TYPE_RESERVED, | |
48 | SPICE_IMAGE_TYPE_LZ_PLT = 100, | |
49 | SPICE_IMAGE_TYPE_LZ_RGB, | |
50 | SPICE_IMAGE_TYPE_GLZ_RGB, | |
51 | SPICE_IMAGE_TYPE_FROM_CACHE, | |
52 | SPICE_IMAGE_TYPE_SURFACE, | |
53 | SPICE_IMAGE_TYPE_JPEG, | |
54 | SPICE_IMAGE_TYPE_FROM_CACHE_LOSSLESS, | |
55 | SPICE_IMAGE_TYPE_ZLIB_GLZ_RGB, | |
56 | SPICE_IMAGE_TYPE_JPEG_ALPHA, | |
57 | ||
58 | SPICE_IMAGE_TYPE_ENUM_END | |
59 | }; | |
60 | ||
61 | enum SpiceBitmapFmt { | |
62 | SPICE_BITMAP_FMT_INVALID, | |
63 | SPICE_BITMAP_FMT_1BIT_LE, | |
64 | SPICE_BITMAP_FMT_1BIT_BE, | |
65 | SPICE_BITMAP_FMT_4BIT_LE, | |
66 | SPICE_BITMAP_FMT_4BIT_BE, | |
67 | SPICE_BITMAP_FMT_8BIT, | |
68 | SPICE_BITMAP_FMT_16BIT, | |
69 | SPICE_BITMAP_FMT_24BIT, | |
70 | SPICE_BITMAP_FMT_32BIT, | |
71 | SPICE_BITMAP_FMT_RGBA, | |
72 | ||
73 | SPICE_BITMAP_FMT_ENUM_END | |
74 | }; | |
75 | ||
76 | enum SpiceSurfaceFmt { | |
77 | SPICE_SURFACE_FMT_INVALID, | |
78 | SPICE_SURFACE_FMT_1_A, | |
79 | SPICE_SURFACE_FMT_8_A = 8, | |
80 | SPICE_SURFACE_FMT_16_555 = 16, | |
81 | SPICE_SURFACE_FMT_32_xRGB = 32, | |
82 | SPICE_SURFACE_FMT_16_565 = 80, | |
83 | SPICE_SURFACE_FMT_32_ARGB = 96, | |
84 | ||
85 | SPICE_SURFACE_FMT_ENUM_END | |
86 | }; | |
87 | ||
88 | enum SpiceClipType { | |
89 | SPICE_CLIP_TYPE_NONE, | |
90 | SPICE_CLIP_TYPE_RECTS, | |
91 | ||
92 | SPICE_CLIP_TYPE_ENUM_END | |
93 | }; | |
94 | ||
95 | enum SpiceRopd { | |
96 | SPICE_ROPD_INVERS_SRC = (1 << 0), | |
97 | SPICE_ROPD_INVERS_BRUSH = (1 << 1), | |
98 | SPICE_ROPD_INVERS_DEST = (1 << 2), | |
99 | SPICE_ROPD_OP_PUT = (1 << 3), | |
100 | SPICE_ROPD_OP_OR = (1 << 4), | |
101 | SPICE_ROPD_OP_AND = (1 << 5), | |
102 | SPICE_ROPD_OP_XOR = (1 << 6), | |
103 | SPICE_ROPD_OP_BLACKNESS = (1 << 7), | |
104 | SPICE_ROPD_OP_WHITENESS = (1 << 8), | |
105 | SPICE_ROPD_OP_INVERS = (1 << 9), | |
106 | SPICE_ROPD_INVERS_RES = (1 << 10), | |
107 | ||
108 | SPICE_ROPD_MASK = 0x7ff | |
109 | }; | |
110 | ||
111 | enum SpiceBrushType { | |
112 | SPICE_BRUSH_TYPE_NONE, | |
113 | SPICE_BRUSH_TYPE_SOLID, | |
114 | SPICE_BRUSH_TYPE_PATTERN, | |
115 | ||
116 | SPICE_BRUSH_TYPE_ENUM_END | |
117 | }; | |
118 | ||
119 | enum SpiceCursorType { | |
120 | SPICE_CURSOR_TYPE_ALPHA, | |
121 | SPICE_CURSOR_TYPE_MONO, | |
122 | SPICE_CURSOR_TYPE_COLOR4, | |
123 | SPICE_CURSOR_TYPE_COLOR8, | |
124 | SPICE_CURSOR_TYPE_COLOR16, | |
125 | SPICE_CURSOR_TYPE_COLOR24, | |
126 | SPICE_CURSOR_TYPE_COLOR32, | |
127 | ||
128 | SPICE_CURSOR_TYPE_ENUM_END | |
129 | }; | |
130 | ||
131 | /* qxl_dev.h */ | |
132 | ||
133 | #pragma pack(push, 1) | |
134 | ||
135 | #define REDHAT_PCI_VENDOR_ID 0x1b36 | |
136 | ||
137 | /* 0x100-0x11f reserved for spice, 0x1ff used for unstable work */ | |
138 | #define QXL_DEVICE_ID_STABLE 0x0100 | |
139 | ||
140 | enum { | |
141 | QXL_REVISION_STABLE_V04 = 0x01, | |
142 | QXL_REVISION_STABLE_V06 = 0x02, | |
143 | QXL_REVISION_STABLE_V10 = 0x03, | |
144 | QXL_REVISION_STABLE_V12 = 0x04, | |
145 | }; | |
146 | ||
147 | #define QXL_DEVICE_ID_DEVEL 0x01ff | |
148 | #define QXL_REVISION_DEVEL 0x01 | |
149 | ||
150 | #define QXL_ROM_MAGIC (*(uint32_t *)"QXRO") | |
151 | #define QXL_RAM_MAGIC (*(uint32_t *)"QXRA") | |
152 | ||
153 | enum { | |
154 | QXL_RAM_RANGE_INDEX, | |
155 | QXL_VRAM_RANGE_INDEX, | |
156 | QXL_ROM_RANGE_INDEX, | |
157 | QXL_IO_RANGE_INDEX, | |
158 | ||
159 | QXL_PCI_RANGES | |
160 | }; | |
161 | ||
162 | /* qxl-1 compat: append only */ | |
163 | enum { | |
164 | QXL_IO_NOTIFY_CMD, | |
165 | QXL_IO_NOTIFY_CURSOR, | |
166 | QXL_IO_UPDATE_AREA, | |
167 | QXL_IO_UPDATE_IRQ, | |
168 | QXL_IO_NOTIFY_OOM, | |
169 | QXL_IO_RESET, | |
170 | QXL_IO_SET_MODE, /* qxl-1 */ | |
171 | QXL_IO_LOG, | |
172 | /* appended for qxl-2 */ | |
173 | QXL_IO_MEMSLOT_ADD, | |
174 | QXL_IO_MEMSLOT_DEL, | |
175 | QXL_IO_DETACH_PRIMARY, | |
176 | QXL_IO_ATTACH_PRIMARY, | |
177 | QXL_IO_CREATE_PRIMARY, | |
178 | QXL_IO_DESTROY_PRIMARY, | |
179 | QXL_IO_DESTROY_SURFACE_WAIT, | |
180 | QXL_IO_DESTROY_ALL_SURFACES, | |
181 | /* appended for qxl-3 */ | |
182 | QXL_IO_UPDATE_AREA_ASYNC, | |
183 | QXL_IO_MEMSLOT_ADD_ASYNC, | |
184 | QXL_IO_CREATE_PRIMARY_ASYNC, | |
185 | QXL_IO_DESTROY_PRIMARY_ASYNC, | |
186 | QXL_IO_DESTROY_SURFACE_ASYNC, | |
187 | QXL_IO_DESTROY_ALL_SURFACES_ASYNC, | |
188 | QXL_IO_FLUSH_SURFACES_ASYNC, | |
189 | QXL_IO_FLUSH_RELEASE, | |
190 | /* appended for qxl-4 */ | |
191 | QXL_IO_MONITORS_CONFIG_ASYNC, | |
192 | ||
193 | QXL_IO_RANGE_SIZE | |
194 | }; | |
195 | ||
196 | typedef uint64_t QXLPHYSICAL; | |
197 | typedef int32_t QXLFIXED; /* fixed 28.4 */ | |
198 | ||
199 | struct qxl_point_fix { | |
200 | QXLFIXED x; | |
201 | QXLFIXED y; | |
202 | }; | |
203 | ||
204 | struct qxl_point { | |
205 | int32_t x; | |
206 | int32_t y; | |
207 | }; | |
208 | ||
209 | struct qxl_point_1_6 { | |
210 | int16_t x; | |
211 | int16_t y; | |
212 | }; | |
213 | ||
214 | struct qxl_rect { | |
215 | int32_t top; | |
216 | int32_t left; | |
217 | int32_t bottom; | |
218 | int32_t right; | |
219 | }; | |
220 | ||
221 | struct qxl_urect { | |
222 | uint32_t top; | |
223 | uint32_t left; | |
224 | uint32_t bottom; | |
225 | uint32_t right; | |
226 | }; | |
227 | ||
228 | /* qxl-1 compat: append only */ | |
229 | struct qxl_rom { | |
230 | uint32_t magic; | |
231 | uint32_t id; | |
232 | uint32_t update_id; | |
233 | uint32_t compression_level; | |
234 | uint32_t log_level; | |
235 | uint32_t mode; /* qxl-1 */ | |
236 | uint32_t modes_offset; | |
237 | uint32_t num_io_pages; | |
238 | uint32_t pages_offset; /* qxl-1 */ | |
239 | uint32_t draw_area_offset; /* qxl-1 */ | |
240 | uint32_t surface0_area_size; /* qxl-1 name: draw_area_size */ | |
241 | uint32_t ram_header_offset; | |
242 | uint32_t mm_clock; | |
243 | /* appended for qxl-2 */ | |
244 | uint32_t n_surfaces; | |
245 | uint64_t flags; | |
246 | uint8_t slots_start; | |
247 | uint8_t slots_end; | |
248 | uint8_t slot_gen_bits; | |
249 | uint8_t slot_id_bits; | |
250 | uint8_t slot_generation; | |
251 | /* appended for qxl-4 */ | |
252 | uint8_t client_present; | |
253 | uint8_t client_capabilities[58]; | |
254 | uint32_t client_monitors_config_crc; | |
255 | struct { | |
256 | uint16_t count; | |
257 | uint16_t padding; | |
258 | struct qxl_urect heads[64]; | |
259 | } client_monitors_config; | |
260 | }; | |
261 | ||
262 | /* qxl-1 compat: fixed */ | |
263 | struct qxl_mode { | |
264 | uint32_t id; | |
265 | uint32_t x_res; | |
266 | uint32_t y_res; | |
267 | uint32_t bits; | |
268 | uint32_t stride; | |
269 | uint32_t x_mili; | |
270 | uint32_t y_mili; | |
271 | uint32_t orientation; | |
272 | }; | |
273 | ||
274 | /* qxl-1 compat: fixed */ | |
275 | struct qxl_modes { | |
276 | uint32_t n_modes; | |
277 | struct qxl_mode modes[0]; | |
278 | }; | |
279 | ||
280 | /* qxl-1 compat: append only */ | |
281 | enum qxl_cmd_type { | |
282 | QXL_CMD_NOP, | |
283 | QXL_CMD_DRAW, | |
284 | QXL_CMD_UPDATE, | |
285 | QXL_CMD_CURSOR, | |
286 | QXL_CMD_MESSAGE, | |
287 | QXL_CMD_SURFACE, | |
288 | }; | |
289 | ||
290 | /* qxl-1 compat: fixed */ | |
291 | struct qxl_command { | |
292 | QXLPHYSICAL data; | |
293 | uint32_t type; | |
294 | uint32_t padding; | |
295 | }; | |
296 | ||
297 | #define QXL_COMMAND_FLAG_COMPAT (1<<0) | |
298 | #define QXL_COMMAND_FLAG_COMPAT_16BPP (2<<0) | |
299 | ||
300 | struct qxl_command_ext { | |
301 | struct qxl_command cmd; | |
302 | uint32_t group_id; | |
303 | uint32_t flags; | |
304 | }; | |
305 | ||
306 | struct qxl_mem_slot { | |
307 | uint64_t mem_start; | |
308 | uint64_t mem_end; | |
309 | }; | |
310 | ||
311 | #define QXL_SURF_TYPE_PRIMARY 0 | |
312 | ||
313 | #define QXL_SURF_FLAG_KEEP_DATA (1 << 0) | |
314 | ||
315 | struct qxl_surface_create { | |
316 | uint32_t width; | |
317 | uint32_t height; | |
318 | int32_t stride; | |
319 | uint32_t format; | |
320 | uint32_t position; | |
321 | uint32_t mouse_mode; | |
322 | uint32_t flags; | |
323 | uint32_t type; | |
324 | QXLPHYSICAL mem; | |
325 | }; | |
326 | ||
327 | #define QXL_COMMAND_RING_SIZE 32 | |
328 | #define QXL_CURSOR_RING_SIZE 32 | |
329 | #define QXL_RELEASE_RING_SIZE 8 | |
330 | ||
331 | #define QXL_LOG_BUF_SIZE 4096 | |
332 | ||
333 | #define QXL_INTERRUPT_DISPLAY (1 << 0) | |
334 | #define QXL_INTERRUPT_CURSOR (1 << 1) | |
335 | #define QXL_INTERRUPT_IO_CMD (1 << 2) | |
336 | #define QXL_INTERRUPT_ERROR (1 << 3) | |
337 | #define QXL_INTERRUPT_CLIENT (1 << 4) | |
338 | #define QXL_INTERRUPT_CLIENT_MONITORS_CONFIG (1 << 5) | |
339 | ||
340 | struct qxl_ring_header { | |
341 | uint32_t num_items; | |
342 | uint32_t prod; | |
343 | uint32_t notify_on_prod; | |
344 | uint32_t cons; | |
345 | uint32_t notify_on_cons; | |
346 | }; | |
347 | ||
348 | /* qxl-1 compat: append only */ | |
349 | struct qxl_ram_header { | |
350 | uint32_t magic; | |
351 | uint32_t int_pending; | |
352 | uint32_t int_mask; | |
353 | uint8_t log_buf[QXL_LOG_BUF_SIZE]; | |
354 | struct qxl_ring_header cmd_ring_hdr; | |
355 | struct qxl_command cmd_ring[QXL_COMMAND_RING_SIZE]; | |
356 | struct qxl_ring_header cursor_ring_hdr; | |
357 | struct qxl_command cursor_ring[QXL_CURSOR_RING_SIZE]; | |
358 | struct qxl_ring_header release_ring_hdr; | |
359 | uint64_t release_ring[QXL_RELEASE_RING_SIZE]; | |
360 | struct qxl_rect update_area; | |
361 | /* appended for qxl-2 */ | |
362 | uint32_t update_surface; | |
363 | struct qxl_mem_slot mem_slot; | |
364 | struct qxl_surface_create create_surface; | |
365 | uint64_t flags; | |
366 | ||
367 | /* appended for qxl-4 */ | |
368 | ||
369 | /* used by QXL_IO_MONITORS_CONFIG_ASYNC */ | |
370 | QXLPHYSICAL monitors_config; | |
371 | uint8_t guest_capabilities[64]; | |
372 | }; | |
373 | ||
374 | union qxl_release_info { | |
375 | uint64_t id; /* in */ | |
376 | uint64_t next; /* out */ | |
377 | }; | |
378 | ||
379 | struct qxl_release_info_ext { | |
380 | union qxl_release_info *info; | |
381 | uint32_t group_id; | |
382 | }; | |
383 | ||
384 | struct qxl_data_chunk { | |
385 | uint32_t data_size; | |
386 | QXLPHYSICAL prev_chunk; | |
387 | QXLPHYSICAL next_chunk; | |
388 | uint8_t data[0]; | |
389 | }; | |
390 | ||
391 | struct qxl_message { | |
392 | union qxl_release_info release_info; | |
393 | uint8_t data[0]; | |
394 | }; | |
395 | ||
396 | struct qxl_compat_update_cmd { | |
397 | union qxl_release_info release_info; | |
398 | struct qxl_rect area; | |
399 | uint32_t update_id; | |
400 | }; | |
401 | ||
402 | struct qxl_update_cmd { | |
403 | union qxl_release_info release_info; | |
404 | struct qxl_rect area; | |
405 | uint32_t update_id; | |
406 | uint32_t surface_id; | |
407 | }; | |
408 | ||
409 | struct qxl_cursor_header { | |
410 | uint64_t unique; | |
411 | uint16_t type; | |
412 | uint16_t width; | |
413 | uint16_t height; | |
414 | uint16_t hot_spot_x; | |
415 | uint16_t hot_spot_y; | |
416 | }; | |
417 | ||
418 | struct qxl_cursor { | |
419 | struct qxl_cursor_header header; | |
420 | uint32_t data_size; | |
421 | struct qxl_data_chunk chunk; | |
422 | }; | |
423 | ||
424 | enum { | |
425 | QXL_CURSOR_SET, | |
426 | QXL_CURSOR_MOVE, | |
427 | QXL_CURSOR_HIDE, | |
428 | QXL_CURSOR_TRAIL, | |
429 | }; | |
430 | ||
431 | #define QXL_CURSOR_DEVICE_DATA_SIZE 128 | |
432 | ||
433 | struct qxl_cursor_cmd { | |
434 | union qxl_release_info release_info; | |
435 | uint8_t type; | |
436 | union { | |
437 | struct { | |
438 | struct qxl_point_1_6 position; | |
439 | uint8_t visible; | |
440 | QXLPHYSICAL shape; | |
441 | } set; | |
442 | struct { | |
443 | uint16_t length; | |
444 | uint16_t frequency; | |
445 | } trail; | |
446 | struct qxl_point_1_6 position; | |
447 | } u; | |
448 | /* todo: dynamic size from rom */ | |
449 | uint8_t device_data[QXL_CURSOR_DEVICE_DATA_SIZE]; | |
450 | }; | |
451 | ||
452 | enum { | |
453 | QXL_DRAW_NOP, | |
454 | QXL_DRAW_FILL, | |
455 | QXL_DRAW_OPAQUE, | |
456 | QXL_DRAW_COPY, | |
457 | QXL_COPY_BITS, | |
458 | QXL_DRAW_BLEND, | |
459 | QXL_DRAW_BLACKNESS, | |
460 | QXL_DRAW_WHITENESS, | |
461 | QXL_DRAW_INVERS, | |
462 | QXL_DRAW_ROP3, | |
463 | QXL_DRAW_STROKE, | |
464 | QXL_DRAW_TEXT, | |
465 | QXL_DRAW_TRANSPARENT, | |
466 | QXL_DRAW_ALPHA_BLEND, | |
467 | QXL_DRAW_COMPOSITE | |
468 | }; | |
469 | ||
470 | struct qxl_raster_glyph { | |
471 | struct qxl_point render_pos; | |
472 | struct qxl_point glyph_origin; | |
473 | uint16_t width; | |
474 | uint16_t height; | |
475 | uint8_t data[0]; | |
476 | }; | |
477 | ||
478 | struct qxl_string { | |
479 | uint32_t data_size; | |
480 | uint16_t length; | |
481 | uint16_t flags; | |
482 | struct qxl_data_chunk chunk; | |
483 | }; | |
484 | ||
485 | struct qxl_copy_bits { | |
486 | struct qxl_point src_pos; | |
487 | }; | |
488 | ||
489 | enum qxl_effect_type { | |
490 | QXL_EFFECT_BLEND = 0, | |
491 | QXL_EFFECT_OPAQUE = 1, | |
492 | QXL_EFFECT_REVERT_ON_DUP = 2, | |
493 | QXL_EFFECT_BLACKNESS_ON_DUP = 3, | |
494 | QXL_EFFECT_WHITENESS_ON_DUP = 4, | |
495 | QXL_EFFECT_NOP_ON_DUP = 5, | |
496 | QXL_EFFECT_NOP = 6, | |
497 | QXL_EFFECT_OPAQUE_BRUSH = 7 | |
498 | }; | |
499 | ||
500 | struct qxl_pattern { | |
501 | QXLPHYSICAL pat; | |
502 | struct qxl_point pos; | |
503 | }; | |
504 | ||
505 | struct qxl_brush { | |
506 | uint32_t type; | |
507 | union { | |
508 | uint32_t color; | |
509 | struct qxl_pattern pattern; | |
510 | } u; | |
511 | }; | |
512 | ||
513 | struct qxl_q_mask { | |
514 | uint8_t flags; | |
515 | struct qxl_point pos; | |
516 | QXLPHYSICAL bitmap; | |
517 | }; | |
518 | ||
519 | struct qxl_fill { | |
520 | struct qxl_brush brush; | |
521 | uint16_t rop_descriptor; | |
522 | struct qxl_q_mask mask; | |
523 | }; | |
524 | ||
525 | struct qxl_opaque { | |
526 | QXLPHYSICAL src_bitmap; | |
527 | struct qxl_rect src_area; | |
528 | struct qxl_brush brush; | |
529 | uint16_t rop_descriptor; | |
530 | uint8_t scale_mode; | |
531 | struct qxl_q_mask mask; | |
532 | }; | |
533 | ||
534 | struct qxl_copy { | |
535 | QXLPHYSICAL src_bitmap; | |
536 | struct qxl_rect src_area; | |
537 | uint16_t rop_descriptor; | |
538 | uint8_t scale_mode; | |
539 | struct qxl_q_mask mask; | |
540 | }; | |
541 | ||
542 | struct qxl_transparent { | |
543 | QXLPHYSICAL src_bitmap; | |
544 | struct qxl_rect src_area; | |
545 | uint32_t src_color; | |
546 | uint32_t true_color; | |
547 | }; | |
548 | ||
549 | struct qxl_alpha_blend { | |
550 | uint16_t alpha_flags; | |
551 | uint8_t alpha; | |
552 | QXLPHYSICAL src_bitmap; | |
553 | struct qxl_rect src_area; | |
554 | }; | |
555 | ||
556 | struct qxl_compat_alpha_blend { | |
557 | uint8_t alpha; | |
558 | QXLPHYSICAL src_bitmap; | |
559 | struct qxl_rect src_area; | |
560 | }; | |
561 | ||
562 | struct qxl_rop_3 { | |
563 | QXLPHYSICAL src_bitmap; | |
564 | struct qxl_rect src_area; | |
565 | struct qxl_brush brush; | |
566 | uint8_t rop3; | |
567 | uint8_t scale_mode; | |
568 | struct qxl_q_mask mask; | |
569 | }; | |
570 | ||
571 | struct qxl_line_attr { | |
572 | uint8_t flags; | |
573 | uint8_t join_style; | |
574 | uint8_t end_style; | |
575 | uint8_t style_nseg; | |
576 | QXLFIXED width; | |
577 | QXLFIXED miter_limit; | |
578 | QXLPHYSICAL style; | |
579 | }; | |
580 | ||
581 | struct qxl_stroke { | |
582 | QXLPHYSICAL path; | |
583 | struct qxl_line_attr attr; | |
584 | struct qxl_brush brush; | |
585 | uint16_t fore_mode; | |
586 | uint16_t back_mode; | |
587 | }; | |
588 | ||
589 | struct qxl_text { | |
590 | QXLPHYSICAL str; | |
591 | struct qxl_rect back_area; | |
592 | struct qxl_brush fore_brush; | |
593 | struct qxl_brush back_brush; | |
594 | uint16_t fore_mode; | |
595 | uint16_t back_mode; | |
596 | }; | |
597 | ||
598 | struct qxl_mask { | |
599 | struct qxl_q_mask mask; | |
600 | }; | |
601 | ||
602 | struct qxl_clip { | |
603 | uint32_t type; | |
604 | QXLPHYSICAL data; | |
605 | }; | |
606 | ||
607 | enum qxl_operator { | |
608 | QXL_OP_CLEAR = 0x00, | |
609 | QXL_OP_SOURCE = 0x01, | |
610 | QXL_OP_DST = 0x02, | |
611 | QXL_OP_OVER = 0x03, | |
612 | QXL_OP_OVER_REVERSE = 0x04, | |
613 | QXL_OP_IN = 0x05, | |
614 | QXL_OP_IN_REVERSE = 0x06, | |
615 | QXL_OP_OUT = 0x07, | |
616 | QXL_OP_OUT_REVERSE = 0x08, | |
617 | QXL_OP_ATOP = 0x09, | |
618 | QXL_OP_ATOP_REVERSE = 0x0a, | |
619 | QXL_OP_XOR = 0x0b, | |
620 | QXL_OP_ADD = 0x0c, | |
621 | QXL_OP_SATURATE = 0x0d, | |
622 | /* Note the jump here from 0x0d to 0x30 */ | |
623 | QXL_OP_MULTIPLY = 0x30, | |
624 | QXL_OP_SCREEN = 0x31, | |
625 | QXL_OP_OVERLAY = 0x32, | |
626 | QXL_OP_DARKEN = 0x33, | |
627 | QXL_OP_LIGHTEN = 0x34, | |
628 | QXL_OP_COLOR_DODGE = 0x35, | |
629 | QXL_OP_COLOR_BURN = 0x36, | |
630 | QXL_OP_HARD_LIGHT = 0x37, | |
631 | QXL_OP_SOFT_LIGHT = 0x38, | |
632 | QXL_OP_DIFFERENCE = 0x39, | |
633 | QXL_OP_EXCLUSION = 0x3a, | |
634 | QXL_OP_HSL_HUE = 0x3b, | |
635 | QXL_OP_HSL_SATURATION = 0x3c, | |
636 | QXL_OP_HSL_COLOR = 0x3d, | |
637 | QXL_OP_HSL_LUMINOSITY = 0x3e | |
638 | }; | |
639 | ||
640 | struct qxl_transform { | |
641 | uint32_t t00; | |
642 | uint32_t t01; | |
643 | uint32_t t02; | |
644 | uint32_t t10; | |
645 | uint32_t t11; | |
646 | uint32_t t12; | |
647 | }; | |
648 | ||
649 | /* The flags field has the following bit fields: | |
650 | * | |
651 | * operator: [ 0 - 7 ] | |
652 | * src_filter: [ 8 - 10 ] | |
653 | * mask_filter: [ 11 - 13 ] | |
654 | * src_repeat: [ 14 - 15 ] | |
655 | * mask_repeat: [ 16 - 17 ] | |
656 | * component_alpha: [ 18 - 18 ] | |
657 | * reserved: [ 19 - 31 ] | |
658 | * | |
659 | * The repeat and filter values are those of pixman: | |
660 | * REPEAT_NONE = 0 | |
661 | * REPEAT_NORMAL = 1 | |
662 | * REPEAT_PAD = 2 | |
663 | * REPEAT_REFLECT = 3 | |
664 | * | |
665 | * The filter values are: | |
666 | * FILTER_NEAREST = 0 | |
667 | * FILTER_BILINEAR = 1 | |
668 | */ | |
669 | struct qxl_composite { | |
670 | uint32_t flags; | |
671 | ||
672 | QXLPHYSICAL src; | |
673 | QXLPHYSICAL src_transform; /* May be NULL */ | |
674 | QXLPHYSICAL mask; /* May be NULL */ | |
675 | QXLPHYSICAL mask_transform; /* May be NULL */ | |
676 | struct qxl_point_1_6 src_origin; | |
677 | struct qxl_point_1_6 mask_origin; | |
678 | }; | |
679 | ||
680 | struct qxl_compat_drawable { | |
681 | union qxl_release_info release_info; | |
682 | uint8_t effect; | |
683 | uint8_t type; | |
684 | uint16_t bitmap_offset; | |
685 | struct qxl_rect bitmap_area; | |
686 | struct qxl_rect bbox; | |
687 | struct qxl_clip clip; | |
688 | uint32_t mm_time; | |
689 | union { | |
690 | struct qxl_fill fill; | |
691 | struct qxl_opaque opaque; | |
692 | struct qxl_copy copy; | |
693 | struct qxl_transparent transparent; | |
694 | struct qxl_compat_alpha_blend alpha_blend; | |
695 | struct qxl_copy_bits copy_bits; | |
696 | struct qxl_copy blend; | |
697 | struct qxl_rop_3 rop3; | |
698 | struct qxl_stroke stroke; | |
699 | struct qxl_text text; | |
700 | struct qxl_mask blackness; | |
701 | struct qxl_mask invers; | |
702 | struct qxl_mask whiteness; | |
703 | } u; | |
704 | }; | |
705 | ||
706 | struct qxl_drawable { | |
707 | union qxl_release_info release_info; | |
708 | uint32_t surface_id; | |
709 | uint8_t effect; | |
710 | uint8_t type; | |
711 | uint8_t self_bitmap; | |
712 | struct qxl_rect self_bitmap_area; | |
713 | struct qxl_rect bbox; | |
714 | struct qxl_clip clip; | |
715 | uint32_t mm_time; | |
716 | int32_t surfaces_dest[3]; | |
717 | struct qxl_rect surfaces_rects[3]; | |
718 | union { | |
719 | struct qxl_fill fill; | |
720 | struct qxl_opaque opaque; | |
721 | struct qxl_copy copy; | |
722 | struct qxl_transparent transparent; | |
723 | struct qxl_alpha_blend alpha_blend; | |
724 | struct qxl_copy_bits copy_bits; | |
725 | struct qxl_copy blend; | |
726 | struct qxl_rop_3 rop3; | |
727 | struct qxl_stroke stroke; | |
728 | struct qxl_text text; | |
729 | struct qxl_mask blackness; | |
730 | struct qxl_mask invers; | |
731 | struct qxl_mask whiteness; | |
732 | struct qxl_composite composite; | |
733 | } u; | |
734 | }; | |
735 | ||
736 | enum qxl_surface_cmd_type { | |
737 | QXL_SURFACE_CMD_CREATE, | |
738 | QXL_SURFACE_CMD_DESTROY, | |
739 | }; | |
740 | ||
741 | struct qxl_surface { | |
742 | uint32_t format; | |
743 | uint32_t width; | |
744 | uint32_t height; | |
745 | int32_t stride; | |
746 | QXLPHYSICAL data; | |
747 | }; | |
748 | ||
749 | struct qxl_surface_cmd { | |
750 | union qxl_release_info release_info; | |
751 | uint32_t surface_id; | |
752 | uint8_t type; | |
753 | uint32_t flags; | |
754 | union { | |
755 | struct qxl_surface surface_create; | |
756 | } u; | |
757 | }; | |
758 | ||
759 | struct qxl_clip_rects { | |
760 | uint32_t num_rects; | |
761 | struct qxl_data_chunk chunk; | |
762 | }; | |
763 | ||
764 | enum { | |
765 | QXL_PATH_BEGIN = (1 << 0), | |
766 | QXL_PATH_END = (1 << 1), | |
767 | QXL_PATH_CLOSE = (1 << 3), | |
768 | QXL_PATH_BEZIER = (1 << 4), | |
769 | }; | |
770 | ||
771 | struct qxl_path_seg { | |
772 | uint32_t flags; | |
773 | uint32_t count; | |
774 | struct qxl_point_fix points[0]; | |
775 | }; | |
776 | ||
777 | struct qxl_path { | |
778 | uint32_t data_size; | |
779 | struct qxl_data_chunk chunk; | |
780 | }; | |
781 | ||
782 | enum { | |
783 | QXL_IMAGE_GROUP_DRIVER, | |
784 | QXL_IMAGE_GROUP_DEVICE, | |
785 | QXL_IMAGE_GROUP_RED, | |
786 | QXL_IMAGE_GROUP_DRIVER_DONT_CACHE, | |
787 | }; | |
788 | ||
789 | struct qxl_image_id { | |
790 | uint32_t group; | |
791 | uint32_t unique; | |
792 | }; | |
793 | ||
794 | union qxl_image_id_union { | |
795 | struct qxl_image_id id; | |
796 | uint64_t value; | |
797 | }; | |
798 | ||
799 | enum qxl_image_flags { | |
800 | QXL_IMAGE_CACHE = (1 << 0), | |
801 | QXL_IMAGE_HIGH_BITS_SET = (1 << 1), | |
802 | }; | |
803 | ||
804 | enum qxl_bitmap_flags { | |
805 | QXL_BITMAP_DIRECT = (1 << 0), | |
806 | QXL_BITMAP_UNSTABLE = (1 << 1), | |
807 | QXL_BITMAP_TOP_DOWN = (1 << 2), /* == SPICE_BITMAP_FLAGS_TOP_DOWN */ | |
808 | }; | |
809 | ||
810 | #define QXL_SET_IMAGE_ID(image, _group, _unique) { \ | |
811 | (image)->descriptor.id = (((uint64_t)_unique) << 32) | _group; \ | |
812 | } | |
813 | ||
814 | struct qxl_image_descriptor { | |
815 | uint64_t id; | |
816 | uint8_t type; | |
817 | uint8_t flags; | |
818 | uint32_t width; | |
819 | uint32_t height; | |
820 | }; | |
821 | ||
822 | struct qxl_palette { | |
823 | uint64_t unique; | |
824 | uint16_t num_ents; | |
825 | uint32_t ents[0]; | |
826 | }; | |
827 | ||
828 | struct qxl_bitmap { | |
829 | uint8_t format; | |
830 | uint8_t flags; | |
831 | uint32_t x; | |
832 | uint32_t y; | |
833 | uint32_t stride; | |
834 | QXLPHYSICAL palette; | |
835 | QXLPHYSICAL data; /* data[0] ? */ | |
836 | }; | |
837 | ||
838 | struct qxl_surface_id { | |
839 | uint32_t surface_id; | |
840 | }; | |
841 | ||
842 | struct qxl_encoder_data { | |
843 | uint32_t data_size; | |
844 | uint8_t data[0]; | |
845 | }; | |
846 | ||
847 | struct qxl_image { | |
848 | struct qxl_image_descriptor descriptor; | |
849 | union { /* variable length */ | |
850 | struct qxl_bitmap bitmap; | |
851 | struct qxl_encoder_data quic; | |
852 | struct qxl_surface_id surface_image; | |
853 | } u; | |
854 | }; | |
855 | ||
856 | /* A QXLHead is a single monitor output backed by a QXLSurface. | |
857 | * x and y offsets are unsigned since they are used in relation to | |
858 | * the given surface, not the same as the x, y coordinates in the guest | |
859 | * screen reference frame. */ | |
860 | struct qxl_head { | |
861 | uint32_t id; | |
862 | uint32_t surface_id; | |
863 | uint32_t width; | |
864 | uint32_t height; | |
865 | uint32_t x; | |
866 | uint32_t y; | |
867 | uint32_t flags; | |
868 | }; | |
869 | ||
870 | struct qxl_monitors_config { | |
871 | uint16_t count; | |
872 | uint16_t max_allowed; /* If it is 0 no fixed limit is given by the | |
873 | driver */ | |
874 | struct qxl_head heads[0]; | |
875 | }; | |
876 | ||
877 | #pragma pack(pop) | |
878 | ||
879 | #endif /* _H_QXL_DEV */ |