Merge branch 'x86-cleanups-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[sfrench/cifs-2.6.git] / drivers / gpu / drm / qxl / qxl_dev.h
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 #ifndef H_QXL_DEV
32 #define H_QXL_DEV
33
34 #include <linux/types.h>
35
36 /*
37  * from spice-protocol
38  * Release 0.10.0
39  */
40
41 /* enums.h */
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 /* qxl_dev.h */
131
132 #pragma pack(push, 1)
133
134 #define REDHAT_PCI_VENDOR_ID 0x1b36
135
136 /* 0x100-0x11f reserved for spice, 0x1ff used for unstable work */
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 /* qxl-1 compat: append only */
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,                  /* qxl-1 */
170         QXL_IO_LOG,
171         /* appended for qxl-2 */
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         /* appended for qxl-3 */
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         /* appended for qxl-4 */
190         QXL_IO_MONITORS_CONFIG_ASYNC,
191
192         QXL_IO_RANGE_SIZE
193 };
194
195 typedef uint64_t QXLPHYSICAL;
196 typedef int32_t QXLFIXED; /* fixed 28.4 */
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 /* qxl-1 compat: append only */
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;                    /* qxl-1 */
235         uint32_t modes_offset;
236         uint32_t num_io_pages;
237         uint32_t pages_offset;            /* qxl-1 */
238         uint32_t draw_area_offset;        /* qxl-1 */
239         uint32_t surface0_area_size;      /* qxl-1 name: draw_area_size */
240         uint32_t ram_header_offset;
241         uint32_t mm_clock;
242         /* appended for qxl-2 */
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         /* appended for qxl-4 */
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 /* qxl-1 compat: fixed */
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 /* qxl-1 compat: fixed */
274 struct qxl_modes {
275         uint32_t n_modes;
276         struct qxl_mode modes[0];
277 };
278
279 /* qxl-1 compat: append only */
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 /* qxl-1 compat: fixed */
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 /* qxl-1 compat: append only */
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         /* appended for qxl-2 */
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         /* appended for qxl-4 */
367
368         /* used by QXL_IO_MONITORS_CONFIG_ASYNC */
369         QXLPHYSICAL monitors_config;
370         uint8_t guest_capabilities[64];
371 };
372
373 union qxl_release_info {
374         uint64_t id;      /* in  */
375         uint64_t next;    /* out */
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         /* todo: dynamic size from rom */
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         /* Note the jump here from 0x0d to 0x30 */
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 /* The flags field has the following bit fields:
649  *
650  *     operator:                [  0 -  7 ]
651  *     src_filter:              [  8 - 10 ]
652  *     mask_filter:             [ 11 - 13 ]
653  *     src_repeat:              [ 14 - 15 ]
654  *     mask_repeat:             [ 16 - 17 ]
655  *     component_alpha:         [ 18 - 18 ]
656  *     reserved:                [ 19 - 31 ]
657  *
658  * The repeat and filter values are those of pixman:
659  *              REPEAT_NONE =           0
660  *              REPEAT_NORMAL =         1
661  *              REPEAT_PAD =            2
662  *              REPEAT_REFLECT =        3
663  *
664  * The filter values are:
665  *              FILTER_NEAREST =        0
666  *              FILTER_BILINEAR =       1
667  */
668 struct qxl_composite {
669         uint32_t                flags;
670
671         QXLPHYSICAL                     src;
672         QXLPHYSICAL                     src_transform;  /* May be NULL */
673         QXLPHYSICAL                     mask;           /* May be NULL */
674         QXLPHYSICAL                     mask_transform; /* May be NULL */
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), /* == SPICE_BITMAP_FLAGS_TOP_DOWN */
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; /* data[0] ? */
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 { /* variable length */
849                 struct qxl_bitmap bitmap;
850                 struct qxl_encoder_data quic;
851                 struct qxl_surface_id surface_image;
852         } u;
853 };
854
855 /* A QXLHead is a single monitor output backed by a QXLSurface.
856  * x and y offsets are unsigned since they are used in relation to
857  * the given surface, not the same as the x, y coordinates in the guest
858  * screen reference frame. */
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; /* If it is 0 no fixed limit is given by the
872                                  driver */
873         struct qxl_head heads[0];
874 };
875
876 #pragma pack(pop)
877
878 #endif /* _H_QXL_DEV */