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