| /* | |
| Copyright (C) 2009 Red Hat, Inc. | |
| Redistribution and use in source and binary forms, with or without | |
| modification, are permitted provided that the following conditions are | |
| met: | |
| * Redistributions of source code must retain the above copyright | |
| notice, this list of conditions and the following disclaimer. | |
| * Redistributions in binary form must reproduce the above copyright | |
| notice, this list of conditions and the following disclaimer in | |
| the documentation and/or other materials provided with the | |
| distribution. | |
| * Neither the name of the copyright holder nor the names of its | |
| contributors may be used to endorse or promote products derived | |
| from this software without specific prior written permission. | |
| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS "AS | |
| IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED | |
| TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A | |
| PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | |
| HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
| SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |
| LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |
| DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | |
| THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
| OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
| */ | |
| #ifndef H_QXL_DEV | |
| #define H_QXL_DEV | |
| #include <linux/types.h> | |
| /* | |
| * from spice-protocol | |
| * Release 0.10.0 | |
| */ | |
| /* enums.h */ | |
| enum SpiceImageType { | |
| SPICE_IMAGE_TYPE_BITMAP, | |
| SPICE_IMAGE_TYPE_QUIC, | |
| SPICE_IMAGE_TYPE_RESERVED, | |
| SPICE_IMAGE_TYPE_LZ_PLT = 100, | |
| SPICE_IMAGE_TYPE_LZ_RGB, | |
| SPICE_IMAGE_TYPE_GLZ_RGB, | |
| SPICE_IMAGE_TYPE_FROM_CACHE, | |
| SPICE_IMAGE_TYPE_SURFACE, | |
| SPICE_IMAGE_TYPE_JPEG, | |
| SPICE_IMAGE_TYPE_FROM_CACHE_LOSSLESS, | |
| SPICE_IMAGE_TYPE_ZLIB_GLZ_RGB, | |
| SPICE_IMAGE_TYPE_JPEG_ALPHA, | |
| SPICE_IMAGE_TYPE_ENUM_END | |
| }; | |
| enum SpiceBitmapFmt { | |
| SPICE_BITMAP_FMT_INVALID, | |
| SPICE_BITMAP_FMT_1BIT_LE, | |
| SPICE_BITMAP_FMT_1BIT_BE, | |
| SPICE_BITMAP_FMT_4BIT_LE, | |
| SPICE_BITMAP_FMT_4BIT_BE, | |
| SPICE_BITMAP_FMT_8BIT, | |
| SPICE_BITMAP_FMT_16BIT, | |
| SPICE_BITMAP_FMT_24BIT, | |
| SPICE_BITMAP_FMT_32BIT, | |
| SPICE_BITMAP_FMT_RGBA, | |
| SPICE_BITMAP_FMT_ENUM_END | |
| }; | |
| enum SpiceSurfaceFmt { | |
| SPICE_SURFACE_FMT_INVALID, | |
| SPICE_SURFACE_FMT_1_A, | |
| SPICE_SURFACE_FMT_8_A = 8, | |
| SPICE_SURFACE_FMT_16_555 = 16, | |
| SPICE_SURFACE_FMT_32_xRGB = 32, | |
| SPICE_SURFACE_FMT_16_565 = 80, | |
| SPICE_SURFACE_FMT_32_ARGB = 96, | |
| SPICE_SURFACE_FMT_ENUM_END | |
| }; | |
| enum SpiceClipType { | |
| SPICE_CLIP_TYPE_NONE, | |
| SPICE_CLIP_TYPE_RECTS, | |
| SPICE_CLIP_TYPE_ENUM_END | |
| }; | |
| enum SpiceRopd { | |
| SPICE_ROPD_INVERS_SRC = (1 << 0), | |
| SPICE_ROPD_INVERS_BRUSH = (1 << 1), | |
| SPICE_ROPD_INVERS_DEST = (1 << 2), | |
| SPICE_ROPD_OP_PUT = (1 << 3), | |
| SPICE_ROPD_OP_OR = (1 << 4), | |
| SPICE_ROPD_OP_AND = (1 << 5), | |
| SPICE_ROPD_OP_XOR = (1 << 6), | |
| SPICE_ROPD_OP_BLACKNESS = (1 << 7), | |
| SPICE_ROPD_OP_WHITENESS = (1 << 8), | |
| SPICE_ROPD_OP_INVERS = (1 << 9), | |
| SPICE_ROPD_INVERS_RES = (1 << 10), | |
| SPICE_ROPD_MASK = 0x7ff | |
| }; | |
| enum SpiceBrushType { | |
| SPICE_BRUSH_TYPE_NONE, | |
| SPICE_BRUSH_TYPE_SOLID, | |
| SPICE_BRUSH_TYPE_PATTERN, | |
| SPICE_BRUSH_TYPE_ENUM_END | |
| }; | |
| enum SpiceCursorType { | |
| SPICE_CURSOR_TYPE_ALPHA, | |
| SPICE_CURSOR_TYPE_MONO, | |
| SPICE_CURSOR_TYPE_COLOR4, | |
| SPICE_CURSOR_TYPE_COLOR8, | |
| SPICE_CURSOR_TYPE_COLOR16, | |
| SPICE_CURSOR_TYPE_COLOR24, | |
| SPICE_CURSOR_TYPE_COLOR32, | |
| SPICE_CURSOR_TYPE_ENUM_END | |
| }; | |
| /* qxl_dev.h */ | |
| #pragma pack(push, 1) | |
| #define REDHAT_PCI_VENDOR_ID 0x1b36 | |
| /* 0x100-0x11f reserved for spice, 0x1ff used for unstable work */ | |
| #define QXL_DEVICE_ID_STABLE 0x0100 | |
| enum { | |
| QXL_REVISION_STABLE_V04 = 0x01, | |
| QXL_REVISION_STABLE_V06 = 0x02, | |
| QXL_REVISION_STABLE_V10 = 0x03, | |
| QXL_REVISION_STABLE_V12 = 0x04, | |
| }; | |
| #define QXL_DEVICE_ID_DEVEL 0x01ff | |
| #define QXL_REVISION_DEVEL 0x01 | |
| #define QXL_ROM_MAGIC (*(uint32_t *)"QXRO") | |
| #define QXL_RAM_MAGIC (*(uint32_t *)"QXRA") | |
| enum { | |
| QXL_RAM_RANGE_INDEX, | |
| QXL_VRAM_RANGE_INDEX, | |
| QXL_ROM_RANGE_INDEX, | |
| QXL_IO_RANGE_INDEX, | |
| QXL_PCI_RANGES | |
| }; | |
| /* qxl-1 compat: append only */ | |
| enum { | |
| QXL_IO_NOTIFY_CMD, | |
| QXL_IO_NOTIFY_CURSOR, | |
| QXL_IO_UPDATE_AREA, | |
| QXL_IO_UPDATE_IRQ, | |
| QXL_IO_NOTIFY_OOM, | |
| QXL_IO_RESET, | |
| QXL_IO_SET_MODE, /* qxl-1 */ | |
| QXL_IO_LOG, | |
| /* appended for qxl-2 */ | |
| QXL_IO_MEMSLOT_ADD, | |
| QXL_IO_MEMSLOT_DEL, | |
| QXL_IO_DETACH_PRIMARY, | |
| QXL_IO_ATTACH_PRIMARY, | |
| QXL_IO_CREATE_PRIMARY, | |
| QXL_IO_DESTROY_PRIMARY, | |
| QXL_IO_DESTROY_SURFACE_WAIT, | |
| QXL_IO_DESTROY_ALL_SURFACES, | |
| /* appended for qxl-3 */ | |
| QXL_IO_UPDATE_AREA_ASYNC, | |
| QXL_IO_MEMSLOT_ADD_ASYNC, | |
| QXL_IO_CREATE_PRIMARY_ASYNC, | |
| QXL_IO_DESTROY_PRIMARY_ASYNC, | |
| QXL_IO_DESTROY_SURFACE_ASYNC, | |
| QXL_IO_DESTROY_ALL_SURFACES_ASYNC, | |
| QXL_IO_FLUSH_SURFACES_ASYNC, | |
| QXL_IO_FLUSH_RELEASE, | |
| /* appended for qxl-4 */ | |
| QXL_IO_MONITORS_CONFIG_ASYNC, | |
| QXL_IO_RANGE_SIZE | |
| }; | |
| typedef uint64_t QXLPHYSICAL; | |
| typedef int32_t QXLFIXED; /* fixed 28.4 */ | |
| struct qxl_point_fix { | |
| QXLFIXED x; | |
| QXLFIXED y; | |
| }; | |
| struct qxl_point { | |
| int32_t x; | |
| int32_t y; | |
| }; | |
| struct qxl_point_1_6 { | |
| int16_t x; | |
| int16_t y; | |
| }; | |
| struct qxl_rect { | |
| int32_t top; | |
| int32_t left; | |
| int32_t bottom; | |
| int32_t right; | |
| }; | |
| struct qxl_urect { | |
| uint32_t top; | |
| uint32_t left; | |
| uint32_t bottom; | |
| uint32_t right; | |
| }; | |
| /* qxl-1 compat: append only */ | |
| struct qxl_rom { | |
| uint32_t magic; | |
| uint32_t id; | |
| uint32_t update_id; | |
| uint32_t compression_level; | |
| uint32_t log_level; | |
| uint32_t mode; /* qxl-1 */ | |
| uint32_t modes_offset; | |
| uint32_t num_io_pages; | |
| uint32_t pages_offset; /* qxl-1 */ | |
| uint32_t draw_area_offset; /* qxl-1 */ | |
| uint32_t surface0_area_size; /* qxl-1 name: draw_area_size */ | |
| uint32_t ram_header_offset; | |
| uint32_t mm_clock; | |
| /* appended for qxl-2 */ | |
| uint32_t n_surfaces; | |
| uint64_t flags; | |
| uint8_t slots_start; | |
| uint8_t slots_end; | |
| uint8_t slot_gen_bits; | |
| uint8_t slot_id_bits; | |
| uint8_t slot_generation; | |
| /* appended for qxl-4 */ | |
| uint8_t client_present; | |
| uint8_t client_capabilities[58]; | |
| uint32_t client_monitors_config_crc; | |
| struct { | |
| uint16_t count; | |
| uint16_t padding; | |
| struct qxl_urect heads[64]; | |
| } client_monitors_config; | |
| }; | |
| /* qxl-1 compat: fixed */ | |
| struct qxl_mode { | |
| uint32_t id; | |
| uint32_t x_res; | |
| uint32_t y_res; | |
| uint32_t bits; | |
| uint32_t stride; | |
| uint32_t x_mili; | |
| uint32_t y_mili; | |
| uint32_t orientation; | |
| }; | |
| /* qxl-1 compat: fixed */ | |
| struct qxl_modes { | |
| uint32_t n_modes; | |
| struct qxl_mode modes[0]; | |
| }; | |
| /* qxl-1 compat: append only */ | |
| enum qxl_cmd_type { | |
| QXL_CMD_NOP, | |
| QXL_CMD_DRAW, | |
| QXL_CMD_UPDATE, | |
| QXL_CMD_CURSOR, | |
| QXL_CMD_MESSAGE, | |
| QXL_CMD_SURFACE, | |
| }; | |
| /* qxl-1 compat: fixed */ | |
| struct qxl_command { | |
| QXLPHYSICAL data; | |
| uint32_t type; | |
| uint32_t padding; | |
| }; | |
| #define QXL_COMMAND_FLAG_COMPAT (1<<0) | |
| #define QXL_COMMAND_FLAG_COMPAT_16BPP (2<<0) | |
| struct qxl_command_ext { | |
| struct qxl_command cmd; | |
| uint32_t group_id; | |
| uint32_t flags; | |
| }; | |
| struct qxl_mem_slot { | |
| uint64_t mem_start; | |
| uint64_t mem_end; | |
| }; | |
| #define QXL_SURF_TYPE_PRIMARY 0 | |
| #define QXL_SURF_FLAG_KEEP_DATA (1 << 0) | |
| struct qxl_surface_create { | |
| uint32_t width; | |
| uint32_t height; | |
| int32_t stride; | |
| uint32_t format; | |
| uint32_t position; | |
| uint32_t mouse_mode; | |
| uint32_t flags; | |
| uint32_t type; | |
| QXLPHYSICAL mem; | |
| }; | |
| #define QXL_COMMAND_RING_SIZE 32 | |
| #define QXL_CURSOR_RING_SIZE 32 | |
| #define QXL_RELEASE_RING_SIZE 8 | |
| #define QXL_LOG_BUF_SIZE 4096 | |
| #define QXL_INTERRUPT_DISPLAY (1 << 0) | |
| #define QXL_INTERRUPT_CURSOR (1 << 1) | |
| #define QXL_INTERRUPT_IO_CMD (1 << 2) | |
| #define QXL_INTERRUPT_ERROR (1 << 3) | |
| #define QXL_INTERRUPT_CLIENT (1 << 4) | |
| #define QXL_INTERRUPT_CLIENT_MONITORS_CONFIG (1 << 5) | |
| struct qxl_ring_header { | |
| uint32_t num_items; | |
| uint32_t prod; | |
| uint32_t notify_on_prod; | |
| uint32_t cons; | |
| uint32_t notify_on_cons; | |
| }; | |
| /* qxl-1 compat: append only */ | |
| struct qxl_ram_header { | |
| uint32_t magic; | |
| uint32_t int_pending; | |
| uint32_t int_mask; | |
| uint8_t log_buf[QXL_LOG_BUF_SIZE]; | |
| struct qxl_ring_header cmd_ring_hdr; | |
| struct qxl_command cmd_ring[QXL_COMMAND_RING_SIZE]; | |
| struct qxl_ring_header cursor_ring_hdr; | |
| struct qxl_command cursor_ring[QXL_CURSOR_RING_SIZE]; | |
| struct qxl_ring_header release_ring_hdr; | |
| uint64_t release_ring[QXL_RELEASE_RING_SIZE]; | |
| struct qxl_rect update_area; | |
| /* appended for qxl-2 */ | |
| uint32_t update_surface; | |
| struct qxl_mem_slot mem_slot; | |
| struct qxl_surface_create create_surface; | |
| uint64_t flags; | |
| /* appended for qxl-4 */ | |
| /* used by QXL_IO_MONITORS_CONFIG_ASYNC */ | |
| QXLPHYSICAL monitors_config; | |
| uint8_t guest_capabilities[64]; | |
| }; | |
| union qxl_release_info { | |
| uint64_t id; /* in */ | |
| uint64_t next; /* out */ | |
| }; | |
| struct qxl_release_info_ext { | |
| union qxl_release_info *info; | |
| uint32_t group_id; | |
| }; | |
| struct qxl_data_chunk { | |
| uint32_t data_size; | |
| QXLPHYSICAL prev_chunk; | |
| QXLPHYSICAL next_chunk; | |
| uint8_t data[0]; | |
| }; | |
| struct qxl_message { | |
| union qxl_release_info release_info; | |
| uint8_t data[0]; | |
| }; | |
| struct qxl_compat_update_cmd { | |
| union qxl_release_info release_info; | |
| struct qxl_rect area; | |
| uint32_t update_id; | |
| }; | |
| struct qxl_update_cmd { | |
| union qxl_release_info release_info; | |
| struct qxl_rect area; | |
| uint32_t update_id; | |
| uint32_t surface_id; | |
| }; | |
| struct qxl_cursor_header { | |
| uint64_t unique; | |
| uint16_t type; | |
| uint16_t width; | |
| uint16_t height; | |
| uint16_t hot_spot_x; | |
| uint16_t hot_spot_y; | |
| }; | |
| struct qxl_cursor { | |
| struct qxl_cursor_header header; | |
| uint32_t data_size; | |
| struct qxl_data_chunk chunk; | |
| }; | |
| enum { | |
| QXL_CURSOR_SET, | |
| QXL_CURSOR_MOVE, | |
| QXL_CURSOR_HIDE, | |
| QXL_CURSOR_TRAIL, | |
| }; | |
| #define QXL_CURSOR_DEVICE_DATA_SIZE 128 | |
| struct qxl_cursor_cmd { | |
| union qxl_release_info release_info; | |
| uint8_t type; | |
| union { | |
| struct { | |
| struct qxl_point_1_6 position; | |
| uint8_t visible; | |
| QXLPHYSICAL shape; | |
| } set; | |
| struct { | |
| uint16_t length; | |
| uint16_t frequency; | |
| } trail; | |
| struct qxl_point_1_6 position; | |
| } u; | |
| /* todo: dynamic size from rom */ | |
| uint8_t device_data[QXL_CURSOR_DEVICE_DATA_SIZE]; | |
| }; | |
| enum { | |
| QXL_DRAW_NOP, | |
| QXL_DRAW_FILL, | |
| QXL_DRAW_OPAQUE, | |
| QXL_DRAW_COPY, | |
| QXL_COPY_BITS, | |
| QXL_DRAW_BLEND, | |
| QXL_DRAW_BLACKNESS, | |
| QXL_DRAW_WHITENESS, | |
| QXL_DRAW_INVERS, | |
| QXL_DRAW_ROP3, | |
| QXL_DRAW_STROKE, | |
| QXL_DRAW_TEXT, | |
| QXL_DRAW_TRANSPARENT, | |
| QXL_DRAW_ALPHA_BLEND, | |
| QXL_DRAW_COMPOSITE | |
| }; | |
| struct qxl_raster_glyph { | |
| struct qxl_point render_pos; | |
| struct qxl_point glyph_origin; | |
| uint16_t width; | |
| uint16_t height; | |
| uint8_t data[0]; | |
| }; | |
| struct qxl_string { | |
| uint32_t data_size; | |
| uint16_t length; | |
| uint16_t flags; | |
| struct qxl_data_chunk chunk; | |
| }; | |
| struct qxl_copy_bits { | |
| struct qxl_point src_pos; | |
| }; | |
| enum qxl_effect_type { | |
| QXL_EFFECT_BLEND = 0, | |
| QXL_EFFECT_OPAQUE = 1, | |
| QXL_EFFECT_REVERT_ON_DUP = 2, | |
| QXL_EFFECT_BLACKNESS_ON_DUP = 3, | |
| QXL_EFFECT_WHITENESS_ON_DUP = 4, | |
| QXL_EFFECT_NOP_ON_DUP = 5, | |
| QXL_EFFECT_NOP = 6, | |
| QXL_EFFECT_OPAQUE_BRUSH = 7 | |
| }; | |
| struct qxl_pattern { | |
| QXLPHYSICAL pat; | |
| struct qxl_point pos; | |
| }; | |
| struct qxl_brush { | |
| uint32_t type; | |
| union { | |
| uint32_t color; | |
| struct qxl_pattern pattern; | |
| } u; | |
| }; | |
| struct qxl_q_mask { | |
| uint8_t flags; | |
| struct qxl_point pos; | |
| QXLPHYSICAL bitmap; | |
| }; | |
| struct qxl_fill { | |
| struct qxl_brush brush; | |
| uint16_t rop_descriptor; | |
| struct qxl_q_mask mask; | |
| }; | |
| struct qxl_opaque { | |
| QXLPHYSICAL src_bitmap; | |
| struct qxl_rect src_area; | |
| struct qxl_brush brush; | |
| uint16_t rop_descriptor; | |
| uint8_t scale_mode; | |
| struct qxl_q_mask mask; | |
| }; | |
| struct qxl_copy { | |
| QXLPHYSICAL src_bitmap; | |
| struct qxl_rect src_area; | |
| uint16_t rop_descriptor; | |
| uint8_t scale_mode; | |
| struct qxl_q_mask mask; | |
| }; | |
| struct qxl_transparent { | |
| QXLPHYSICAL src_bitmap; | |
| struct qxl_rect src_area; | |
| uint32_t src_color; | |
| uint32_t true_color; | |
| }; | |
| struct qxl_alpha_blend { | |
| uint16_t alpha_flags; | |
| uint8_t alpha; | |
| QXLPHYSICAL src_bitmap; | |
| struct qxl_rect src_area; | |
| }; | |
| struct qxl_compat_alpha_blend { | |
| uint8_t alpha; | |
| QXLPHYSICAL src_bitmap; | |
| struct qxl_rect src_area; | |
| }; | |
| struct qxl_rop_3 { | |
| QXLPHYSICAL src_bitmap; | |
| struct qxl_rect src_area; | |
| struct qxl_brush brush; | |
| uint8_t rop3; | |
| uint8_t scale_mode; | |
| struct qxl_q_mask mask; | |
| }; | |
| struct qxl_line_attr { | |
| uint8_t flags; | |
| uint8_t join_style; | |
| uint8_t end_style; | |
| uint8_t style_nseg; | |
| QXLFIXED width; | |
| QXLFIXED miter_limit; | |
| QXLPHYSICAL style; | |
| }; | |
| struct qxl_stroke { | |
| QXLPHYSICAL path; | |
| struct qxl_line_attr attr; | |
| struct qxl_brush brush; | |
| uint16_t fore_mode; | |
| uint16_t back_mode; | |
| }; | |
| struct qxl_text { | |
| QXLPHYSICAL str; | |
| struct qxl_rect back_area; | |
| struct qxl_brush fore_brush; | |
| struct qxl_brush back_brush; | |
| uint16_t fore_mode; | |
| uint16_t back_mode; | |
| }; | |
| struct qxl_mask { | |
| struct qxl_q_mask mask; | |
| }; | |
| struct qxl_clip { | |
| uint32_t type; | |
| QXLPHYSICAL data; | |
| }; | |
| enum qxl_operator { | |
| QXL_OP_CLEAR = 0x00, | |
| QXL_OP_SOURCE = 0x01, | |
| QXL_OP_DST = 0x02, | |
| QXL_OP_OVER = 0x03, | |
| QXL_OP_OVER_REVERSE = 0x04, | |
| QXL_OP_IN = 0x05, | |
| QXL_OP_IN_REVERSE = 0x06, | |
| QXL_OP_OUT = 0x07, | |
| QXL_OP_OUT_REVERSE = 0x08, | |
| QXL_OP_ATOP = 0x09, | |
| QXL_OP_ATOP_REVERSE = 0x0a, | |
| QXL_OP_XOR = 0x0b, | |
| QXL_OP_ADD = 0x0c, | |
| QXL_OP_SATURATE = 0x0d, | |
| /* Note the jump here from 0x0d to 0x30 */ | |
| QXL_OP_MULTIPLY = 0x30, | |
| QXL_OP_SCREEN = 0x31, | |
| QXL_OP_OVERLAY = 0x32, | |
| QXL_OP_DARKEN = 0x33, | |
| QXL_OP_LIGHTEN = 0x34, | |
| QXL_OP_COLOR_DODGE = 0x35, | |
| QXL_OP_COLOR_BURN = 0x36, | |
| QXL_OP_HARD_LIGHT = 0x37, | |
| QXL_OP_SOFT_LIGHT = 0x38, | |
| QXL_OP_DIFFERENCE = 0x39, | |
| QXL_OP_EXCLUSION = 0x3a, | |
| QXL_OP_HSL_HUE = 0x3b, | |
| QXL_OP_HSL_SATURATION = 0x3c, | |
| QXL_OP_HSL_COLOR = 0x3d, | |
| QXL_OP_HSL_LUMINOSITY = 0x3e | |
| }; | |
| struct qxl_transform { | |
| uint32_t t00; | |
| uint32_t t01; | |
| uint32_t t02; | |
| uint32_t t10; | |
| uint32_t t11; | |
| uint32_t t12; | |
| }; | |
| /* The flags field has the following bit fields: | |
| * | |
| * operator: [ 0 - 7 ] | |
| * src_filter: [ 8 - 10 ] | |
| * mask_filter: [ 11 - 13 ] | |
| * src_repeat: [ 14 - 15 ] | |
| * mask_repeat: [ 16 - 17 ] | |
| * component_alpha: [ 18 - 18 ] | |
| * reserved: [ 19 - 31 ] | |
| * | |
| * The repeat and filter values are those of pixman: | |
| * REPEAT_NONE = 0 | |
| * REPEAT_NORMAL = 1 | |
| * REPEAT_PAD = 2 | |
| * REPEAT_REFLECT = 3 | |
| * | |
| * The filter values are: | |
| * FILTER_NEAREST = 0 | |
| * FILTER_BILINEAR = 1 | |
| */ | |
| struct qxl_composite { | |
| uint32_t flags; | |
| QXLPHYSICAL src; | |
| QXLPHYSICAL src_transform; /* May be NULL */ | |
| QXLPHYSICAL mask; /* May be NULL */ | |
| QXLPHYSICAL mask_transform; /* May be NULL */ | |
| struct qxl_point_1_6 src_origin; | |
| struct qxl_point_1_6 mask_origin; | |
| }; | |
| struct qxl_compat_drawable { | |
| union qxl_release_info release_info; | |
| uint8_t effect; | |
| uint8_t type; | |
| uint16_t bitmap_offset; | |
| struct qxl_rect bitmap_area; | |
| struct qxl_rect bbox; | |
| struct qxl_clip clip; | |
| uint32_t mm_time; | |
| union { | |
| struct qxl_fill fill; | |
| struct qxl_opaque opaque; | |
| struct qxl_copy copy; | |
| struct qxl_transparent transparent; | |
| struct qxl_compat_alpha_blend alpha_blend; | |
| struct qxl_copy_bits copy_bits; | |
| struct qxl_copy blend; | |
| struct qxl_rop_3 rop3; | |
| struct qxl_stroke stroke; | |
| struct qxl_text text; | |
| struct qxl_mask blackness; | |
| struct qxl_mask invers; | |
| struct qxl_mask whiteness; | |
| } u; | |
| }; | |
| struct qxl_drawable { | |
| union qxl_release_info release_info; | |
| uint32_t surface_id; | |
| uint8_t effect; | |
| uint8_t type; | |
| uint8_t self_bitmap; | |
| struct qxl_rect self_bitmap_area; | |
| struct qxl_rect bbox; | |
| struct qxl_clip clip; | |
| uint32_t mm_time; | |
| int32_t surfaces_dest[3]; | |
| struct qxl_rect surfaces_rects[3]; | |
| union { | |
| struct qxl_fill fill; | |
| struct qxl_opaque opaque; | |
| struct qxl_copy copy; | |
| struct qxl_transparent transparent; | |
| struct qxl_alpha_blend alpha_blend; | |
| struct qxl_copy_bits copy_bits; | |
| struct qxl_copy blend; | |
| struct qxl_rop_3 rop3; | |
| struct qxl_stroke stroke; | |
| struct qxl_text text; | |
| struct qxl_mask blackness; | |
| struct qxl_mask invers; | |
| struct qxl_mask whiteness; | |
| struct qxl_composite composite; | |
| } u; | |
| }; | |
| enum qxl_surface_cmd_type { | |
| QXL_SURFACE_CMD_CREATE, | |
| QXL_SURFACE_CMD_DESTROY, | |
| }; | |
| struct qxl_surface { | |
| uint32_t format; | |
| uint32_t width; | |
| uint32_t height; | |
| int32_t stride; | |
| QXLPHYSICAL data; | |
| }; | |
| struct qxl_surface_cmd { | |
| union qxl_release_info release_info; | |
| uint32_t surface_id; | |
| uint8_t type; | |
| uint32_t flags; | |
| union { | |
| struct qxl_surface surface_create; | |
| } u; | |
| }; | |
| struct qxl_clip_rects { | |
| uint32_t num_rects; | |
| struct qxl_data_chunk chunk; | |
| }; | |
| enum { | |
| QXL_PATH_BEGIN = (1 << 0), | |
| QXL_PATH_END = (1 << 1), | |
| QXL_PATH_CLOSE = (1 << 3), | |
| QXL_PATH_BEZIER = (1 << 4), | |
| }; | |
| struct qxl_path_seg { | |
| uint32_t flags; | |
| uint32_t count; | |
| struct qxl_point_fix points[0]; | |
| }; | |
| struct qxl_path { | |
| uint32_t data_size; | |
| struct qxl_data_chunk chunk; | |
| }; | |
| enum { | |
| QXL_IMAGE_GROUP_DRIVER, | |
| QXL_IMAGE_GROUP_DEVICE, | |
| QXL_IMAGE_GROUP_RED, | |
| QXL_IMAGE_GROUP_DRIVER_DONT_CACHE, | |
| }; | |
| struct qxl_image_id { | |
| uint32_t group; | |
| uint32_t unique; | |
| }; | |
| union qxl_image_id_union { | |
| struct qxl_image_id id; | |
| uint64_t value; | |
| }; | |
| enum qxl_image_flags { | |
| QXL_IMAGE_CACHE = (1 << 0), | |
| QXL_IMAGE_HIGH_BITS_SET = (1 << 1), | |
| }; | |
| enum qxl_bitmap_flags { | |
| QXL_BITMAP_DIRECT = (1 << 0), | |
| QXL_BITMAP_UNSTABLE = (1 << 1), | |
| QXL_BITMAP_TOP_DOWN = (1 << 2), /* == SPICE_BITMAP_FLAGS_TOP_DOWN */ | |
| }; | |
| #define QXL_SET_IMAGE_ID(image, _group, _unique) { \ | |
| (image)->descriptor.id = (((uint64_t)_unique) << 32) | _group; \ | |
| } | |
| struct qxl_image_descriptor { | |
| uint64_t id; | |
| uint8_t type; | |
| uint8_t flags; | |
| uint32_t width; | |
| uint32_t height; | |
| }; | |
| struct qxl_palette { | |
| uint64_t unique; | |
| uint16_t num_ents; | |
| uint32_t ents[0]; | |
| }; | |
| struct qxl_bitmap { | |
| uint8_t format; | |
| uint8_t flags; | |
| uint32_t x; | |
| uint32_t y; | |
| uint32_t stride; | |
| QXLPHYSICAL palette; | |
| QXLPHYSICAL data; /* data[0] ? */ | |
| }; | |
| struct qxl_surface_id { | |
| uint32_t surface_id; | |
| }; | |
| struct qxl_encoder_data { | |
| uint32_t data_size; | |
| uint8_t data[0]; | |
| }; | |
| struct qxl_image { | |
| struct qxl_image_descriptor descriptor; | |
| union { /* variable length */ | |
| struct qxl_bitmap bitmap; | |
| struct qxl_encoder_data quic; | |
| struct qxl_surface_id surface_image; | |
| } u; | |
| }; | |
| /* A QXLHead is a single monitor output backed by a QXLSurface. | |
| * x and y offsets are unsigned since they are used in relation to | |
| * the given surface, not the same as the x, y coordinates in the guest | |
| * screen reference frame. */ | |
| struct qxl_head { | |
| uint32_t id; | |
| uint32_t surface_id; | |
| uint32_t width; | |
| uint32_t height; | |
| uint32_t x; | |
| uint32_t y; | |
| uint32_t flags; | |
| }; | |
| struct qxl_monitors_config { | |
| uint16_t count; | |
| uint16_t max_allowed; /* If it is 0 no fixed limit is given by the | |
| driver */ | |
| struct qxl_head heads[0]; | |
| }; | |
| #pragma pack(pop) | |
| #endif /* _H_QXL_DEV */ |