2 Copyright (C) 2009 Red Hat, Inc.
4 Redistribution and use in source and binary forms, with or without
5 modification, are permitted provided that the following conditions are
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
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.
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.
34 #include <linux/types.h>
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
,
57 SPICE_IMAGE_TYPE_ENUM_END
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
,
72 SPICE_BITMAP_FMT_ENUM_END
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,
84 SPICE_SURFACE_FMT_ENUM_END
89 SPICE_CLIP_TYPE_RECTS
,
91 SPICE_CLIP_TYPE_ENUM_END
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),
107 SPICE_ROPD_MASK
= 0x7ff
110 enum SpiceBrushType
{
111 SPICE_BRUSH_TYPE_NONE
,
112 SPICE_BRUSH_TYPE_SOLID
,
113 SPICE_BRUSH_TYPE_PATTERN
,
115 SPICE_BRUSH_TYPE_ENUM_END
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
,
127 SPICE_CURSOR_TYPE_ENUM_END
132 #pragma pack(push, 1)
134 /* 0x100-0x11f reserved for spice, 0x1ff used for unstable work */
135 #define QXL_DEVICE_ID_STABLE 0x0100
138 QXL_REVISION_STABLE_V04
= 0x01,
139 QXL_REVISION_STABLE_V06
= 0x02,
140 QXL_REVISION_STABLE_V10
= 0x03,
141 QXL_REVISION_STABLE_V12
= 0x04,
144 #define QXL_DEVICE_ID_DEVEL 0x01ff
145 #define QXL_REVISION_DEVEL 0x01
147 #define QXL_ROM_MAGIC (*(uint32_t *)"QXRO")
148 #define QXL_RAM_MAGIC (*(uint32_t *)"QXRA")
152 QXL_VRAM_RANGE_INDEX
,
159 /* qxl-1 compat: append only */
162 QXL_IO_NOTIFY_CURSOR
,
167 QXL_IO_SET_MODE
, /* qxl-1 */
169 /* appended for qxl-2 */
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 /* appended for qxl-3 */
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 /* appended for qxl-4 */
188 QXL_IO_MONITORS_CONFIG_ASYNC
,
193 typedef uint64_t QXLPHYSICAL
;
194 typedef int32_t QXLFIXED
; /* fixed 28.4 */
196 struct qxl_point_fix
{
206 struct qxl_point_1_6
{
225 /* qxl-1 compat: append only */
230 uint32_t compression_level
;
232 uint32_t mode
; /* qxl-1 */
233 uint32_t modes_offset
;
234 uint32_t num_io_pages
;
235 uint32_t pages_offset
; /* qxl-1 */
236 uint32_t draw_area_offset
; /* qxl-1 */
237 uint32_t surface0_area_size
; /* qxl-1 name: draw_area_size */
238 uint32_t ram_header_offset
;
240 /* appended for qxl-2 */
245 uint8_t slot_gen_bits
;
246 uint8_t slot_id_bits
;
247 uint8_t slot_generation
;
248 /* appended for qxl-4 */
249 uint8_t client_present
;
250 uint8_t client_capabilities
[58];
251 uint32_t client_monitors_config_crc
;
255 struct qxl_urect heads
[64];
256 } client_monitors_config
;
259 /* qxl-1 compat: fixed */
268 uint32_t orientation
;
271 /* qxl-1 compat: fixed */
274 struct qxl_mode modes
[0];
277 /* qxl-1 compat: append only */
287 /* qxl-1 compat: fixed */
294 #define QXL_COMMAND_FLAG_COMPAT (1<<0)
295 #define QXL_COMMAND_FLAG_COMPAT_16BPP (2<<0)
297 struct qxl_command_ext
{
298 struct qxl_command cmd
;
303 struct qxl_mem_slot
{
308 #define QXL_SURF_TYPE_PRIMARY 0
310 #define QXL_SURF_FLAG_KEEP_DATA (1 << 0)
312 struct qxl_surface_create
{
324 #define QXL_COMMAND_RING_SIZE 32
325 #define QXL_CURSOR_RING_SIZE 32
326 #define QXL_RELEASE_RING_SIZE 8
328 #define QXL_LOG_BUF_SIZE 4096
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)
337 struct qxl_ring_header
{
340 uint32_t notify_on_prod
;
342 uint32_t notify_on_cons
;
345 /* qxl-1 compat: append only */
346 struct qxl_ram_header
{
348 uint32_t int_pending
;
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 /* appended for qxl-2 */
359 uint32_t update_surface
;
360 struct qxl_mem_slot mem_slot
;
361 struct qxl_surface_create create_surface
;
364 /* appended for qxl-4 */
366 /* used by QXL_IO_MONITORS_CONFIG_ASYNC */
367 QXLPHYSICAL monitors_config
;
368 uint8_t guest_capabilities
[64];
371 union qxl_release_info
{
372 uint64_t id
; /* in */
373 uint64_t next
; /* out */
376 struct qxl_release_info_ext
{
377 union qxl_release_info
*info
;
381 struct qxl_data_chunk
{
383 QXLPHYSICAL prev_chunk
;
384 QXLPHYSICAL next_chunk
;
389 union qxl_release_info release_info
;
393 struct qxl_compat_update_cmd
{
394 union qxl_release_info release_info
;
395 struct qxl_rect area
;
399 struct qxl_update_cmd
{
400 union qxl_release_info release_info
;
401 struct qxl_rect area
;
406 struct qxl_cursor_header
{
416 struct qxl_cursor_header header
;
418 struct qxl_data_chunk chunk
;
428 #define QXL_CURSOR_DEVICE_DATA_SIZE 128
430 struct qxl_cursor_cmd
{
431 union qxl_release_info release_info
;
435 struct qxl_point_1_6 position
;
443 struct qxl_point_1_6 position
;
445 /* todo: dynamic size from rom */
446 uint8_t device_data
[QXL_CURSOR_DEVICE_DATA_SIZE
];
462 QXL_DRAW_TRANSPARENT
,
463 QXL_DRAW_ALPHA_BLEND
,
467 struct qxl_raster_glyph
{
468 struct qxl_point render_pos
;
469 struct qxl_point glyph_origin
;
479 struct qxl_data_chunk chunk
;
482 struct qxl_copy_bits
{
483 struct qxl_point src_pos
;
486 enum 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,
494 QXL_EFFECT_OPAQUE_BRUSH
= 7
499 struct qxl_point pos
;
506 struct qxl_pattern pattern
;
512 struct qxl_point pos
;
517 struct qxl_brush brush
;
518 uint16_t rop_descriptor
;
519 struct qxl_q_mask mask
;
523 QXLPHYSICAL src_bitmap
;
524 struct qxl_rect src_area
;
525 struct qxl_brush brush
;
526 uint16_t rop_descriptor
;
528 struct qxl_q_mask mask
;
532 QXLPHYSICAL src_bitmap
;
533 struct qxl_rect src_area
;
534 uint16_t rop_descriptor
;
536 struct qxl_q_mask mask
;
539 struct qxl_transparent
{
540 QXLPHYSICAL src_bitmap
;
541 struct qxl_rect src_area
;
546 struct qxl_alpha_blend
{
547 uint16_t alpha_flags
;
549 QXLPHYSICAL src_bitmap
;
550 struct qxl_rect src_area
;
553 struct qxl_compat_alpha_blend
{
555 QXLPHYSICAL src_bitmap
;
556 struct qxl_rect src_area
;
560 QXLPHYSICAL src_bitmap
;
561 struct qxl_rect src_area
;
562 struct qxl_brush brush
;
565 struct qxl_q_mask mask
;
568 struct qxl_line_attr
{
574 QXLFIXED miter_limit
;
580 struct qxl_line_attr attr
;
581 struct qxl_brush brush
;
588 struct qxl_rect back_area
;
589 struct qxl_brush fore_brush
;
590 struct qxl_brush back_brush
;
596 struct qxl_q_mask mask
;
606 QXL_OP_SOURCE
= 0x01,
609 QXL_OP_OVER_REVERSE
= 0x04,
611 QXL_OP_IN_REVERSE
= 0x06,
613 QXL_OP_OUT_REVERSE
= 0x08,
615 QXL_OP_ATOP_REVERSE
= 0x0a,
618 QXL_OP_SATURATE
= 0x0d,
619 /* Note the jump here from 0x0d to 0x30 */
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
637 struct qxl_transform
{
646 /* The flags field has the following bit fields:
648 * operator: [ 0 - 7 ]
649 * src_filter: [ 8 - 10 ]
650 * mask_filter: [ 11 - 13 ]
651 * src_repeat: [ 14 - 15 ]
652 * mask_repeat: [ 16 - 17 ]
653 * component_alpha: [ 18 - 18 ]
654 * reserved: [ 19 - 31 ]
656 * The repeat and filter values are those of pixman:
662 * The filter values are:
664 * FILTER_BILINEAR = 1
666 struct qxl_composite
{
670 QXLPHYSICAL src_transform
; /* May be NULL */
671 QXLPHYSICAL mask
; /* May be NULL */
672 QXLPHYSICAL mask_transform
; /* May be NULL */
673 struct qxl_point_1_6 src_origin
;
674 struct qxl_point_1_6 mask_origin
;
677 struct qxl_compat_drawable
{
678 union qxl_release_info release_info
;
681 uint16_t bitmap_offset
;
682 struct qxl_rect bitmap_area
;
683 struct qxl_rect bbox
;
684 struct qxl_clip clip
;
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
;
703 struct qxl_drawable
{
704 union qxl_release_info release_info
;
709 struct qxl_rect self_bitmap_area
;
710 struct qxl_rect bbox
;
711 struct qxl_clip clip
;
713 int32_t surfaces_dest
[3];
714 struct qxl_rect surfaces_rects
[3];
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
;
733 enum qxl_surface_cmd_type
{
734 QXL_SURFACE_CMD_CREATE
,
735 QXL_SURFACE_CMD_DESTROY
,
746 struct qxl_surface_cmd
{
747 union qxl_release_info release_info
;
752 struct qxl_surface surface_create
;
756 struct qxl_clip_rects
{
758 struct qxl_data_chunk chunk
;
762 QXL_PATH_BEGIN
= (1 << 0),
763 QXL_PATH_END
= (1 << 1),
764 QXL_PATH_CLOSE
= (1 << 3),
765 QXL_PATH_BEZIER
= (1 << 4),
768 struct qxl_path_seg
{
771 struct qxl_point_fix points
[0];
776 struct qxl_data_chunk chunk
;
780 QXL_IMAGE_GROUP_DRIVER
,
781 QXL_IMAGE_GROUP_DEVICE
,
783 QXL_IMAGE_GROUP_DRIVER_DONT_CACHE
,
786 struct qxl_image_id
{
791 union qxl_image_id_union
{
792 struct qxl_image_id id
;
796 enum qxl_image_flags
{
797 QXL_IMAGE_CACHE
= (1 << 0),
798 QXL_IMAGE_HIGH_BITS_SET
= (1 << 1),
801 enum qxl_bitmap_flags
{
802 QXL_BITMAP_DIRECT
= (1 << 0),
803 QXL_BITMAP_UNSTABLE
= (1 << 1),
804 QXL_BITMAP_TOP_DOWN
= (1 << 2), /* == SPICE_BITMAP_FLAGS_TOP_DOWN */
807 #define QXL_SET_IMAGE_ID(image, _group, _unique) { \
808 (image)->descriptor.id = (((uint64_t)_unique) << 32) | _group; \
811 struct qxl_image_descriptor
{
832 QXLPHYSICAL data
; /* data[0] ? */
835 struct qxl_surface_id
{
839 struct qxl_encoder_data
{
845 struct qxl_image_descriptor descriptor
;
846 union { /* variable length */
847 struct qxl_bitmap bitmap
;
848 struct qxl_encoder_data quic
;
849 struct qxl_surface_id surface_image
;
853 /* A QXLHead is a single monitor output backed by a QXLSurface.
854 * x and y offsets are unsigned since they are used in relation to
855 * the given surface, not the same as the x, y coordinates in the guest
856 * screen reference frame. */
867 struct qxl_monitors_config
{
869 uint16_t max_allowed
; /* If it is 0 no fixed limit is given by the
871 struct qxl_head heads
[0];
876 #endif /* _H_QXL_DEV */