/*
   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 */
