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