877 lines
18 KiB
C
877 lines
18 KiB
C
|
/*
|
||
|
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)
|
||
|
|
||
|
/* 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[];
|
||
|
};
|
||
|
|
||
|
/* 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[];
|
||
|
};
|
||
|
|
||
|
struct qxl_message {
|
||
|
union qxl_release_info release_info;
|
||
|
uint8_t data[];
|
||
|
};
|
||
|
|
||
|
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[];
|
||
|
};
|
||
|
|
||
|
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[];
|
||
|
};
|
||
|
|
||
|
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[];
|
||
|
};
|
||
|
|
||
|
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[];
|
||
|
};
|
||
|
|
||
|
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[];
|
||
|
};
|
||
|
|
||
|
#pragma pack(pop)
|
||
|
|
||
|
#endif /* _H_QXL_DEV */
|