162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci Copyright (C) 2009 Red Hat, Inc. 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci Redistribution and use in source and binary forms, with or without 562306a36Sopenharmony_ci modification, are permitted provided that the following conditions are 662306a36Sopenharmony_ci met: 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci * Redistributions of source code must retain the above copyright 962306a36Sopenharmony_ci notice, this list of conditions and the following disclaimer. 1062306a36Sopenharmony_ci * Redistributions in binary form must reproduce the above copyright 1162306a36Sopenharmony_ci notice, this list of conditions and the following disclaimer in 1262306a36Sopenharmony_ci the documentation and/or other materials provided with the 1362306a36Sopenharmony_ci distribution. 1462306a36Sopenharmony_ci * Neither the name of the copyright holder nor the names of its 1562306a36Sopenharmony_ci contributors may be used to endorse or promote products derived 1662306a36Sopenharmony_ci from this software without specific prior written permission. 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS "AS 1962306a36Sopenharmony_ci IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 2062306a36Sopenharmony_ci TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 2162306a36Sopenharmony_ci PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2262306a36Sopenharmony_ci HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2362306a36Sopenharmony_ci SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2462306a36Sopenharmony_ci LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2562306a36Sopenharmony_ci DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2662306a36Sopenharmony_ci THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2762306a36Sopenharmony_ci (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2862306a36Sopenharmony_ci OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2962306a36Sopenharmony_ci*/ 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci#ifndef H_QXL_DEV 3262306a36Sopenharmony_ci#define H_QXL_DEV 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci#include <linux/types.h> 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci/* 3762306a36Sopenharmony_ci * from spice-protocol 3862306a36Sopenharmony_ci * Release 0.10.0 3962306a36Sopenharmony_ci */ 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci/* enums.h */ 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_cienum SpiceImageType { 4462306a36Sopenharmony_ci SPICE_IMAGE_TYPE_BITMAP, 4562306a36Sopenharmony_ci SPICE_IMAGE_TYPE_QUIC, 4662306a36Sopenharmony_ci SPICE_IMAGE_TYPE_RESERVED, 4762306a36Sopenharmony_ci SPICE_IMAGE_TYPE_LZ_PLT = 100, 4862306a36Sopenharmony_ci SPICE_IMAGE_TYPE_LZ_RGB, 4962306a36Sopenharmony_ci SPICE_IMAGE_TYPE_GLZ_RGB, 5062306a36Sopenharmony_ci SPICE_IMAGE_TYPE_FROM_CACHE, 5162306a36Sopenharmony_ci SPICE_IMAGE_TYPE_SURFACE, 5262306a36Sopenharmony_ci SPICE_IMAGE_TYPE_JPEG, 5362306a36Sopenharmony_ci SPICE_IMAGE_TYPE_FROM_CACHE_LOSSLESS, 5462306a36Sopenharmony_ci SPICE_IMAGE_TYPE_ZLIB_GLZ_RGB, 5562306a36Sopenharmony_ci SPICE_IMAGE_TYPE_JPEG_ALPHA, 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci SPICE_IMAGE_TYPE_ENUM_END 5862306a36Sopenharmony_ci}; 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_cienum SpiceBitmapFmt { 6162306a36Sopenharmony_ci SPICE_BITMAP_FMT_INVALID, 6262306a36Sopenharmony_ci SPICE_BITMAP_FMT_1BIT_LE, 6362306a36Sopenharmony_ci SPICE_BITMAP_FMT_1BIT_BE, 6462306a36Sopenharmony_ci SPICE_BITMAP_FMT_4BIT_LE, 6562306a36Sopenharmony_ci SPICE_BITMAP_FMT_4BIT_BE, 6662306a36Sopenharmony_ci SPICE_BITMAP_FMT_8BIT, 6762306a36Sopenharmony_ci SPICE_BITMAP_FMT_16BIT, 6862306a36Sopenharmony_ci SPICE_BITMAP_FMT_24BIT, 6962306a36Sopenharmony_ci SPICE_BITMAP_FMT_32BIT, 7062306a36Sopenharmony_ci SPICE_BITMAP_FMT_RGBA, 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci SPICE_BITMAP_FMT_ENUM_END 7362306a36Sopenharmony_ci}; 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_cienum SpiceSurfaceFmt { 7662306a36Sopenharmony_ci SPICE_SURFACE_FMT_INVALID, 7762306a36Sopenharmony_ci SPICE_SURFACE_FMT_1_A, 7862306a36Sopenharmony_ci SPICE_SURFACE_FMT_8_A = 8, 7962306a36Sopenharmony_ci SPICE_SURFACE_FMT_16_555 = 16, 8062306a36Sopenharmony_ci SPICE_SURFACE_FMT_32_xRGB = 32, 8162306a36Sopenharmony_ci SPICE_SURFACE_FMT_16_565 = 80, 8262306a36Sopenharmony_ci SPICE_SURFACE_FMT_32_ARGB = 96, 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ci SPICE_SURFACE_FMT_ENUM_END 8562306a36Sopenharmony_ci}; 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_cienum SpiceClipType { 8862306a36Sopenharmony_ci SPICE_CLIP_TYPE_NONE, 8962306a36Sopenharmony_ci SPICE_CLIP_TYPE_RECTS, 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ci SPICE_CLIP_TYPE_ENUM_END 9262306a36Sopenharmony_ci}; 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_cienum SpiceRopd { 9562306a36Sopenharmony_ci SPICE_ROPD_INVERS_SRC = (1 << 0), 9662306a36Sopenharmony_ci SPICE_ROPD_INVERS_BRUSH = (1 << 1), 9762306a36Sopenharmony_ci SPICE_ROPD_INVERS_DEST = (1 << 2), 9862306a36Sopenharmony_ci SPICE_ROPD_OP_PUT = (1 << 3), 9962306a36Sopenharmony_ci SPICE_ROPD_OP_OR = (1 << 4), 10062306a36Sopenharmony_ci SPICE_ROPD_OP_AND = (1 << 5), 10162306a36Sopenharmony_ci SPICE_ROPD_OP_XOR = (1 << 6), 10262306a36Sopenharmony_ci SPICE_ROPD_OP_BLACKNESS = (1 << 7), 10362306a36Sopenharmony_ci SPICE_ROPD_OP_WHITENESS = (1 << 8), 10462306a36Sopenharmony_ci SPICE_ROPD_OP_INVERS = (1 << 9), 10562306a36Sopenharmony_ci SPICE_ROPD_INVERS_RES = (1 << 10), 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_ci SPICE_ROPD_MASK = 0x7ff 10862306a36Sopenharmony_ci}; 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_cienum SpiceBrushType { 11162306a36Sopenharmony_ci SPICE_BRUSH_TYPE_NONE, 11262306a36Sopenharmony_ci SPICE_BRUSH_TYPE_SOLID, 11362306a36Sopenharmony_ci SPICE_BRUSH_TYPE_PATTERN, 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_ci SPICE_BRUSH_TYPE_ENUM_END 11662306a36Sopenharmony_ci}; 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_cienum SpiceCursorType { 11962306a36Sopenharmony_ci SPICE_CURSOR_TYPE_ALPHA, 12062306a36Sopenharmony_ci SPICE_CURSOR_TYPE_MONO, 12162306a36Sopenharmony_ci SPICE_CURSOR_TYPE_COLOR4, 12262306a36Sopenharmony_ci SPICE_CURSOR_TYPE_COLOR8, 12362306a36Sopenharmony_ci SPICE_CURSOR_TYPE_COLOR16, 12462306a36Sopenharmony_ci SPICE_CURSOR_TYPE_COLOR24, 12562306a36Sopenharmony_ci SPICE_CURSOR_TYPE_COLOR32, 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_ci SPICE_CURSOR_TYPE_ENUM_END 12862306a36Sopenharmony_ci}; 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_ci/* qxl_dev.h */ 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_ci#pragma pack(push, 1) 13362306a36Sopenharmony_ci 13462306a36Sopenharmony_ci/* 0x100-0x11f reserved for spice, 0x1ff used for unstable work */ 13562306a36Sopenharmony_ci#define QXL_DEVICE_ID_STABLE 0x0100 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_cienum { 13862306a36Sopenharmony_ci QXL_REVISION_STABLE_V04 = 0x01, 13962306a36Sopenharmony_ci QXL_REVISION_STABLE_V06 = 0x02, 14062306a36Sopenharmony_ci QXL_REVISION_STABLE_V10 = 0x03, 14162306a36Sopenharmony_ci QXL_REVISION_STABLE_V12 = 0x04, 14262306a36Sopenharmony_ci}; 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_ci#define QXL_DEVICE_ID_DEVEL 0x01ff 14562306a36Sopenharmony_ci#define QXL_REVISION_DEVEL 0x01 14662306a36Sopenharmony_ci 14762306a36Sopenharmony_ci#define QXL_ROM_MAGIC (*(uint32_t *)"QXRO") 14862306a36Sopenharmony_ci#define QXL_RAM_MAGIC (*(uint32_t *)"QXRA") 14962306a36Sopenharmony_ci 15062306a36Sopenharmony_cienum { 15162306a36Sopenharmony_ci QXL_RAM_RANGE_INDEX, 15262306a36Sopenharmony_ci QXL_VRAM_RANGE_INDEX, 15362306a36Sopenharmony_ci QXL_ROM_RANGE_INDEX, 15462306a36Sopenharmony_ci QXL_IO_RANGE_INDEX, 15562306a36Sopenharmony_ci 15662306a36Sopenharmony_ci QXL_PCI_RANGES 15762306a36Sopenharmony_ci}; 15862306a36Sopenharmony_ci 15962306a36Sopenharmony_ci/* qxl-1 compat: append only */ 16062306a36Sopenharmony_cienum { 16162306a36Sopenharmony_ci QXL_IO_NOTIFY_CMD, 16262306a36Sopenharmony_ci QXL_IO_NOTIFY_CURSOR, 16362306a36Sopenharmony_ci QXL_IO_UPDATE_AREA, 16462306a36Sopenharmony_ci QXL_IO_UPDATE_IRQ, 16562306a36Sopenharmony_ci QXL_IO_NOTIFY_OOM, 16662306a36Sopenharmony_ci QXL_IO_RESET, 16762306a36Sopenharmony_ci QXL_IO_SET_MODE, /* qxl-1 */ 16862306a36Sopenharmony_ci QXL_IO_LOG, 16962306a36Sopenharmony_ci /* appended for qxl-2 */ 17062306a36Sopenharmony_ci QXL_IO_MEMSLOT_ADD, 17162306a36Sopenharmony_ci QXL_IO_MEMSLOT_DEL, 17262306a36Sopenharmony_ci QXL_IO_DETACH_PRIMARY, 17362306a36Sopenharmony_ci QXL_IO_ATTACH_PRIMARY, 17462306a36Sopenharmony_ci QXL_IO_CREATE_PRIMARY, 17562306a36Sopenharmony_ci QXL_IO_DESTROY_PRIMARY, 17662306a36Sopenharmony_ci QXL_IO_DESTROY_SURFACE_WAIT, 17762306a36Sopenharmony_ci QXL_IO_DESTROY_ALL_SURFACES, 17862306a36Sopenharmony_ci /* appended for qxl-3 */ 17962306a36Sopenharmony_ci QXL_IO_UPDATE_AREA_ASYNC, 18062306a36Sopenharmony_ci QXL_IO_MEMSLOT_ADD_ASYNC, 18162306a36Sopenharmony_ci QXL_IO_CREATE_PRIMARY_ASYNC, 18262306a36Sopenharmony_ci QXL_IO_DESTROY_PRIMARY_ASYNC, 18362306a36Sopenharmony_ci QXL_IO_DESTROY_SURFACE_ASYNC, 18462306a36Sopenharmony_ci QXL_IO_DESTROY_ALL_SURFACES_ASYNC, 18562306a36Sopenharmony_ci QXL_IO_FLUSH_SURFACES_ASYNC, 18662306a36Sopenharmony_ci QXL_IO_FLUSH_RELEASE, 18762306a36Sopenharmony_ci /* appended for qxl-4 */ 18862306a36Sopenharmony_ci QXL_IO_MONITORS_CONFIG_ASYNC, 18962306a36Sopenharmony_ci 19062306a36Sopenharmony_ci QXL_IO_RANGE_SIZE 19162306a36Sopenharmony_ci}; 19262306a36Sopenharmony_ci 19362306a36Sopenharmony_citypedef uint64_t QXLPHYSICAL; 19462306a36Sopenharmony_citypedef int32_t QXLFIXED; /* fixed 28.4 */ 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_cistruct qxl_point_fix { 19762306a36Sopenharmony_ci QXLFIXED x; 19862306a36Sopenharmony_ci QXLFIXED y; 19962306a36Sopenharmony_ci}; 20062306a36Sopenharmony_ci 20162306a36Sopenharmony_cistruct qxl_point { 20262306a36Sopenharmony_ci int32_t x; 20362306a36Sopenharmony_ci int32_t y; 20462306a36Sopenharmony_ci}; 20562306a36Sopenharmony_ci 20662306a36Sopenharmony_cistruct qxl_point_1_6 { 20762306a36Sopenharmony_ci int16_t x; 20862306a36Sopenharmony_ci int16_t y; 20962306a36Sopenharmony_ci}; 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_cistruct qxl_rect { 21262306a36Sopenharmony_ci int32_t top; 21362306a36Sopenharmony_ci int32_t left; 21462306a36Sopenharmony_ci int32_t bottom; 21562306a36Sopenharmony_ci int32_t right; 21662306a36Sopenharmony_ci}; 21762306a36Sopenharmony_ci 21862306a36Sopenharmony_cistruct qxl_urect { 21962306a36Sopenharmony_ci uint32_t top; 22062306a36Sopenharmony_ci uint32_t left; 22162306a36Sopenharmony_ci uint32_t bottom; 22262306a36Sopenharmony_ci uint32_t right; 22362306a36Sopenharmony_ci}; 22462306a36Sopenharmony_ci 22562306a36Sopenharmony_ci/* qxl-1 compat: append only */ 22662306a36Sopenharmony_cistruct qxl_rom { 22762306a36Sopenharmony_ci uint32_t magic; 22862306a36Sopenharmony_ci uint32_t id; 22962306a36Sopenharmony_ci uint32_t update_id; 23062306a36Sopenharmony_ci uint32_t compression_level; 23162306a36Sopenharmony_ci uint32_t log_level; 23262306a36Sopenharmony_ci uint32_t mode; /* qxl-1 */ 23362306a36Sopenharmony_ci uint32_t modes_offset; 23462306a36Sopenharmony_ci uint32_t num_io_pages; 23562306a36Sopenharmony_ci uint32_t pages_offset; /* qxl-1 */ 23662306a36Sopenharmony_ci uint32_t draw_area_offset; /* qxl-1 */ 23762306a36Sopenharmony_ci uint32_t surface0_area_size; /* qxl-1 name: draw_area_size */ 23862306a36Sopenharmony_ci uint32_t ram_header_offset; 23962306a36Sopenharmony_ci uint32_t mm_clock; 24062306a36Sopenharmony_ci /* appended for qxl-2 */ 24162306a36Sopenharmony_ci uint32_t n_surfaces; 24262306a36Sopenharmony_ci uint64_t flags; 24362306a36Sopenharmony_ci uint8_t slots_start; 24462306a36Sopenharmony_ci uint8_t slots_end; 24562306a36Sopenharmony_ci uint8_t slot_gen_bits; 24662306a36Sopenharmony_ci uint8_t slot_id_bits; 24762306a36Sopenharmony_ci uint8_t slot_generation; 24862306a36Sopenharmony_ci /* appended for qxl-4 */ 24962306a36Sopenharmony_ci uint8_t client_present; 25062306a36Sopenharmony_ci uint8_t client_capabilities[58]; 25162306a36Sopenharmony_ci uint32_t client_monitors_config_crc; 25262306a36Sopenharmony_ci struct { 25362306a36Sopenharmony_ci uint16_t count; 25462306a36Sopenharmony_ci uint16_t padding; 25562306a36Sopenharmony_ci struct qxl_urect heads[64]; 25662306a36Sopenharmony_ci } client_monitors_config; 25762306a36Sopenharmony_ci}; 25862306a36Sopenharmony_ci 25962306a36Sopenharmony_ci/* qxl-1 compat: fixed */ 26062306a36Sopenharmony_cistruct qxl_mode { 26162306a36Sopenharmony_ci uint32_t id; 26262306a36Sopenharmony_ci uint32_t x_res; 26362306a36Sopenharmony_ci uint32_t y_res; 26462306a36Sopenharmony_ci uint32_t bits; 26562306a36Sopenharmony_ci uint32_t stride; 26662306a36Sopenharmony_ci uint32_t x_mili; 26762306a36Sopenharmony_ci uint32_t y_mili; 26862306a36Sopenharmony_ci uint32_t orientation; 26962306a36Sopenharmony_ci}; 27062306a36Sopenharmony_ci 27162306a36Sopenharmony_ci/* qxl-1 compat: fixed */ 27262306a36Sopenharmony_cistruct qxl_modes { 27362306a36Sopenharmony_ci uint32_t n_modes; 27462306a36Sopenharmony_ci struct qxl_mode modes[]; 27562306a36Sopenharmony_ci}; 27662306a36Sopenharmony_ci 27762306a36Sopenharmony_ci/* qxl-1 compat: append only */ 27862306a36Sopenharmony_cienum qxl_cmd_type { 27962306a36Sopenharmony_ci QXL_CMD_NOP, 28062306a36Sopenharmony_ci QXL_CMD_DRAW, 28162306a36Sopenharmony_ci QXL_CMD_UPDATE, 28262306a36Sopenharmony_ci QXL_CMD_CURSOR, 28362306a36Sopenharmony_ci QXL_CMD_MESSAGE, 28462306a36Sopenharmony_ci QXL_CMD_SURFACE, 28562306a36Sopenharmony_ci}; 28662306a36Sopenharmony_ci 28762306a36Sopenharmony_ci/* qxl-1 compat: fixed */ 28862306a36Sopenharmony_cistruct qxl_command { 28962306a36Sopenharmony_ci QXLPHYSICAL data; 29062306a36Sopenharmony_ci uint32_t type; 29162306a36Sopenharmony_ci uint32_t padding; 29262306a36Sopenharmony_ci}; 29362306a36Sopenharmony_ci 29462306a36Sopenharmony_ci#define QXL_COMMAND_FLAG_COMPAT (1<<0) 29562306a36Sopenharmony_ci#define QXL_COMMAND_FLAG_COMPAT_16BPP (2<<0) 29662306a36Sopenharmony_ci 29762306a36Sopenharmony_cistruct qxl_command_ext { 29862306a36Sopenharmony_ci struct qxl_command cmd; 29962306a36Sopenharmony_ci uint32_t group_id; 30062306a36Sopenharmony_ci uint32_t flags; 30162306a36Sopenharmony_ci}; 30262306a36Sopenharmony_ci 30362306a36Sopenharmony_cistruct qxl_mem_slot { 30462306a36Sopenharmony_ci uint64_t mem_start; 30562306a36Sopenharmony_ci uint64_t mem_end; 30662306a36Sopenharmony_ci}; 30762306a36Sopenharmony_ci 30862306a36Sopenharmony_ci#define QXL_SURF_TYPE_PRIMARY 0 30962306a36Sopenharmony_ci 31062306a36Sopenharmony_ci#define QXL_SURF_FLAG_KEEP_DATA (1 << 0) 31162306a36Sopenharmony_ci 31262306a36Sopenharmony_cistruct qxl_surface_create { 31362306a36Sopenharmony_ci uint32_t width; 31462306a36Sopenharmony_ci uint32_t height; 31562306a36Sopenharmony_ci int32_t stride; 31662306a36Sopenharmony_ci uint32_t format; 31762306a36Sopenharmony_ci uint32_t position; 31862306a36Sopenharmony_ci uint32_t mouse_mode; 31962306a36Sopenharmony_ci uint32_t flags; 32062306a36Sopenharmony_ci uint32_t type; 32162306a36Sopenharmony_ci QXLPHYSICAL mem; 32262306a36Sopenharmony_ci}; 32362306a36Sopenharmony_ci 32462306a36Sopenharmony_ci#define QXL_COMMAND_RING_SIZE 32 32562306a36Sopenharmony_ci#define QXL_CURSOR_RING_SIZE 32 32662306a36Sopenharmony_ci#define QXL_RELEASE_RING_SIZE 8 32762306a36Sopenharmony_ci 32862306a36Sopenharmony_ci#define QXL_LOG_BUF_SIZE 4096 32962306a36Sopenharmony_ci 33062306a36Sopenharmony_ci#define QXL_INTERRUPT_DISPLAY (1 << 0) 33162306a36Sopenharmony_ci#define QXL_INTERRUPT_CURSOR (1 << 1) 33262306a36Sopenharmony_ci#define QXL_INTERRUPT_IO_CMD (1 << 2) 33362306a36Sopenharmony_ci#define QXL_INTERRUPT_ERROR (1 << 3) 33462306a36Sopenharmony_ci#define QXL_INTERRUPT_CLIENT (1 << 4) 33562306a36Sopenharmony_ci#define QXL_INTERRUPT_CLIENT_MONITORS_CONFIG (1 << 5) 33662306a36Sopenharmony_ci 33762306a36Sopenharmony_cistruct qxl_ring_header { 33862306a36Sopenharmony_ci uint32_t num_items; 33962306a36Sopenharmony_ci uint32_t prod; 34062306a36Sopenharmony_ci uint32_t notify_on_prod; 34162306a36Sopenharmony_ci uint32_t cons; 34262306a36Sopenharmony_ci uint32_t notify_on_cons; 34362306a36Sopenharmony_ci}; 34462306a36Sopenharmony_ci 34562306a36Sopenharmony_ci/* qxl-1 compat: append only */ 34662306a36Sopenharmony_cistruct qxl_ram_header { 34762306a36Sopenharmony_ci uint32_t magic; 34862306a36Sopenharmony_ci uint32_t int_pending; 34962306a36Sopenharmony_ci uint32_t int_mask; 35062306a36Sopenharmony_ci uint8_t log_buf[QXL_LOG_BUF_SIZE]; 35162306a36Sopenharmony_ci struct qxl_ring_header cmd_ring_hdr; 35262306a36Sopenharmony_ci struct qxl_command cmd_ring[QXL_COMMAND_RING_SIZE]; 35362306a36Sopenharmony_ci struct qxl_ring_header cursor_ring_hdr; 35462306a36Sopenharmony_ci struct qxl_command cursor_ring[QXL_CURSOR_RING_SIZE]; 35562306a36Sopenharmony_ci struct qxl_ring_header release_ring_hdr; 35662306a36Sopenharmony_ci uint64_t release_ring[QXL_RELEASE_RING_SIZE]; 35762306a36Sopenharmony_ci struct qxl_rect update_area; 35862306a36Sopenharmony_ci /* appended for qxl-2 */ 35962306a36Sopenharmony_ci uint32_t update_surface; 36062306a36Sopenharmony_ci struct qxl_mem_slot mem_slot; 36162306a36Sopenharmony_ci struct qxl_surface_create create_surface; 36262306a36Sopenharmony_ci uint64_t flags; 36362306a36Sopenharmony_ci 36462306a36Sopenharmony_ci /* appended for qxl-4 */ 36562306a36Sopenharmony_ci 36662306a36Sopenharmony_ci /* used by QXL_IO_MONITORS_CONFIG_ASYNC */ 36762306a36Sopenharmony_ci QXLPHYSICAL monitors_config; 36862306a36Sopenharmony_ci uint8_t guest_capabilities[64]; 36962306a36Sopenharmony_ci}; 37062306a36Sopenharmony_ci 37162306a36Sopenharmony_ciunion qxl_release_info { 37262306a36Sopenharmony_ci uint64_t id; /* in */ 37362306a36Sopenharmony_ci uint64_t next; /* out */ 37462306a36Sopenharmony_ci}; 37562306a36Sopenharmony_ci 37662306a36Sopenharmony_cistruct qxl_release_info_ext { 37762306a36Sopenharmony_ci union qxl_release_info *info; 37862306a36Sopenharmony_ci uint32_t group_id; 37962306a36Sopenharmony_ci}; 38062306a36Sopenharmony_ci 38162306a36Sopenharmony_cistruct qxl_data_chunk { 38262306a36Sopenharmony_ci uint32_t data_size; 38362306a36Sopenharmony_ci QXLPHYSICAL prev_chunk; 38462306a36Sopenharmony_ci QXLPHYSICAL next_chunk; 38562306a36Sopenharmony_ci uint8_t data[]; 38662306a36Sopenharmony_ci}; 38762306a36Sopenharmony_ci 38862306a36Sopenharmony_cistruct qxl_message { 38962306a36Sopenharmony_ci union qxl_release_info release_info; 39062306a36Sopenharmony_ci uint8_t data[]; 39162306a36Sopenharmony_ci}; 39262306a36Sopenharmony_ci 39362306a36Sopenharmony_cistruct qxl_compat_update_cmd { 39462306a36Sopenharmony_ci union qxl_release_info release_info; 39562306a36Sopenharmony_ci struct qxl_rect area; 39662306a36Sopenharmony_ci uint32_t update_id; 39762306a36Sopenharmony_ci}; 39862306a36Sopenharmony_ci 39962306a36Sopenharmony_cistruct qxl_update_cmd { 40062306a36Sopenharmony_ci union qxl_release_info release_info; 40162306a36Sopenharmony_ci struct qxl_rect area; 40262306a36Sopenharmony_ci uint32_t update_id; 40362306a36Sopenharmony_ci uint32_t surface_id; 40462306a36Sopenharmony_ci}; 40562306a36Sopenharmony_ci 40662306a36Sopenharmony_cistruct qxl_cursor_header { 40762306a36Sopenharmony_ci uint64_t unique; 40862306a36Sopenharmony_ci uint16_t type; 40962306a36Sopenharmony_ci uint16_t width; 41062306a36Sopenharmony_ci uint16_t height; 41162306a36Sopenharmony_ci uint16_t hot_spot_x; 41262306a36Sopenharmony_ci uint16_t hot_spot_y; 41362306a36Sopenharmony_ci}; 41462306a36Sopenharmony_ci 41562306a36Sopenharmony_cistruct qxl_cursor { 41662306a36Sopenharmony_ci struct qxl_cursor_header header; 41762306a36Sopenharmony_ci uint32_t data_size; 41862306a36Sopenharmony_ci struct qxl_data_chunk chunk; 41962306a36Sopenharmony_ci}; 42062306a36Sopenharmony_ci 42162306a36Sopenharmony_cienum { 42262306a36Sopenharmony_ci QXL_CURSOR_SET, 42362306a36Sopenharmony_ci QXL_CURSOR_MOVE, 42462306a36Sopenharmony_ci QXL_CURSOR_HIDE, 42562306a36Sopenharmony_ci QXL_CURSOR_TRAIL, 42662306a36Sopenharmony_ci}; 42762306a36Sopenharmony_ci 42862306a36Sopenharmony_ci#define QXL_CURSOR_DEVICE_DATA_SIZE 128 42962306a36Sopenharmony_ci 43062306a36Sopenharmony_cistruct qxl_cursor_cmd { 43162306a36Sopenharmony_ci union qxl_release_info release_info; 43262306a36Sopenharmony_ci uint8_t type; 43362306a36Sopenharmony_ci union { 43462306a36Sopenharmony_ci struct { 43562306a36Sopenharmony_ci struct qxl_point_1_6 position; 43662306a36Sopenharmony_ci uint8_t visible; 43762306a36Sopenharmony_ci QXLPHYSICAL shape; 43862306a36Sopenharmony_ci } set; 43962306a36Sopenharmony_ci struct { 44062306a36Sopenharmony_ci uint16_t length; 44162306a36Sopenharmony_ci uint16_t frequency; 44262306a36Sopenharmony_ci } trail; 44362306a36Sopenharmony_ci struct qxl_point_1_6 position; 44462306a36Sopenharmony_ci } u; 44562306a36Sopenharmony_ci /* todo: dynamic size from rom */ 44662306a36Sopenharmony_ci uint8_t device_data[QXL_CURSOR_DEVICE_DATA_SIZE]; 44762306a36Sopenharmony_ci}; 44862306a36Sopenharmony_ci 44962306a36Sopenharmony_cienum { 45062306a36Sopenharmony_ci QXL_DRAW_NOP, 45162306a36Sopenharmony_ci QXL_DRAW_FILL, 45262306a36Sopenharmony_ci QXL_DRAW_OPAQUE, 45362306a36Sopenharmony_ci QXL_DRAW_COPY, 45462306a36Sopenharmony_ci QXL_COPY_BITS, 45562306a36Sopenharmony_ci QXL_DRAW_BLEND, 45662306a36Sopenharmony_ci QXL_DRAW_BLACKNESS, 45762306a36Sopenharmony_ci QXL_DRAW_WHITENESS, 45862306a36Sopenharmony_ci QXL_DRAW_INVERS, 45962306a36Sopenharmony_ci QXL_DRAW_ROP3, 46062306a36Sopenharmony_ci QXL_DRAW_STROKE, 46162306a36Sopenharmony_ci QXL_DRAW_TEXT, 46262306a36Sopenharmony_ci QXL_DRAW_TRANSPARENT, 46362306a36Sopenharmony_ci QXL_DRAW_ALPHA_BLEND, 46462306a36Sopenharmony_ci QXL_DRAW_COMPOSITE 46562306a36Sopenharmony_ci}; 46662306a36Sopenharmony_ci 46762306a36Sopenharmony_cistruct qxl_raster_glyph { 46862306a36Sopenharmony_ci struct qxl_point render_pos; 46962306a36Sopenharmony_ci struct qxl_point glyph_origin; 47062306a36Sopenharmony_ci uint16_t width; 47162306a36Sopenharmony_ci uint16_t height; 47262306a36Sopenharmony_ci uint8_t data[]; 47362306a36Sopenharmony_ci}; 47462306a36Sopenharmony_ci 47562306a36Sopenharmony_cistruct qxl_string { 47662306a36Sopenharmony_ci uint32_t data_size; 47762306a36Sopenharmony_ci uint16_t length; 47862306a36Sopenharmony_ci uint16_t flags; 47962306a36Sopenharmony_ci struct qxl_data_chunk chunk; 48062306a36Sopenharmony_ci}; 48162306a36Sopenharmony_ci 48262306a36Sopenharmony_cistruct qxl_copy_bits { 48362306a36Sopenharmony_ci struct qxl_point src_pos; 48462306a36Sopenharmony_ci}; 48562306a36Sopenharmony_ci 48662306a36Sopenharmony_cienum qxl_effect_type { 48762306a36Sopenharmony_ci QXL_EFFECT_BLEND = 0, 48862306a36Sopenharmony_ci QXL_EFFECT_OPAQUE = 1, 48962306a36Sopenharmony_ci QXL_EFFECT_REVERT_ON_DUP = 2, 49062306a36Sopenharmony_ci QXL_EFFECT_BLACKNESS_ON_DUP = 3, 49162306a36Sopenharmony_ci QXL_EFFECT_WHITENESS_ON_DUP = 4, 49262306a36Sopenharmony_ci QXL_EFFECT_NOP_ON_DUP = 5, 49362306a36Sopenharmony_ci QXL_EFFECT_NOP = 6, 49462306a36Sopenharmony_ci QXL_EFFECT_OPAQUE_BRUSH = 7 49562306a36Sopenharmony_ci}; 49662306a36Sopenharmony_ci 49762306a36Sopenharmony_cistruct qxl_pattern { 49862306a36Sopenharmony_ci QXLPHYSICAL pat; 49962306a36Sopenharmony_ci struct qxl_point pos; 50062306a36Sopenharmony_ci}; 50162306a36Sopenharmony_ci 50262306a36Sopenharmony_cistruct qxl_brush { 50362306a36Sopenharmony_ci uint32_t type; 50462306a36Sopenharmony_ci union { 50562306a36Sopenharmony_ci uint32_t color; 50662306a36Sopenharmony_ci struct qxl_pattern pattern; 50762306a36Sopenharmony_ci } u; 50862306a36Sopenharmony_ci}; 50962306a36Sopenharmony_ci 51062306a36Sopenharmony_cistruct qxl_q_mask { 51162306a36Sopenharmony_ci uint8_t flags; 51262306a36Sopenharmony_ci struct qxl_point pos; 51362306a36Sopenharmony_ci QXLPHYSICAL bitmap; 51462306a36Sopenharmony_ci}; 51562306a36Sopenharmony_ci 51662306a36Sopenharmony_cistruct qxl_fill { 51762306a36Sopenharmony_ci struct qxl_brush brush; 51862306a36Sopenharmony_ci uint16_t rop_descriptor; 51962306a36Sopenharmony_ci struct qxl_q_mask mask; 52062306a36Sopenharmony_ci}; 52162306a36Sopenharmony_ci 52262306a36Sopenharmony_cistruct qxl_opaque { 52362306a36Sopenharmony_ci QXLPHYSICAL src_bitmap; 52462306a36Sopenharmony_ci struct qxl_rect src_area; 52562306a36Sopenharmony_ci struct qxl_brush brush; 52662306a36Sopenharmony_ci uint16_t rop_descriptor; 52762306a36Sopenharmony_ci uint8_t scale_mode; 52862306a36Sopenharmony_ci struct qxl_q_mask mask; 52962306a36Sopenharmony_ci}; 53062306a36Sopenharmony_ci 53162306a36Sopenharmony_cistruct qxl_copy { 53262306a36Sopenharmony_ci QXLPHYSICAL src_bitmap; 53362306a36Sopenharmony_ci struct qxl_rect src_area; 53462306a36Sopenharmony_ci uint16_t rop_descriptor; 53562306a36Sopenharmony_ci uint8_t scale_mode; 53662306a36Sopenharmony_ci struct qxl_q_mask mask; 53762306a36Sopenharmony_ci}; 53862306a36Sopenharmony_ci 53962306a36Sopenharmony_cistruct qxl_transparent { 54062306a36Sopenharmony_ci QXLPHYSICAL src_bitmap; 54162306a36Sopenharmony_ci struct qxl_rect src_area; 54262306a36Sopenharmony_ci uint32_t src_color; 54362306a36Sopenharmony_ci uint32_t true_color; 54462306a36Sopenharmony_ci}; 54562306a36Sopenharmony_ci 54662306a36Sopenharmony_cistruct qxl_alpha_blend { 54762306a36Sopenharmony_ci uint16_t alpha_flags; 54862306a36Sopenharmony_ci uint8_t alpha; 54962306a36Sopenharmony_ci QXLPHYSICAL src_bitmap; 55062306a36Sopenharmony_ci struct qxl_rect src_area; 55162306a36Sopenharmony_ci}; 55262306a36Sopenharmony_ci 55362306a36Sopenharmony_cistruct qxl_compat_alpha_blend { 55462306a36Sopenharmony_ci uint8_t alpha; 55562306a36Sopenharmony_ci QXLPHYSICAL src_bitmap; 55662306a36Sopenharmony_ci struct qxl_rect src_area; 55762306a36Sopenharmony_ci}; 55862306a36Sopenharmony_ci 55962306a36Sopenharmony_cistruct qxl_rop_3 { 56062306a36Sopenharmony_ci QXLPHYSICAL src_bitmap; 56162306a36Sopenharmony_ci struct qxl_rect src_area; 56262306a36Sopenharmony_ci struct qxl_brush brush; 56362306a36Sopenharmony_ci uint8_t rop3; 56462306a36Sopenharmony_ci uint8_t scale_mode; 56562306a36Sopenharmony_ci struct qxl_q_mask mask; 56662306a36Sopenharmony_ci}; 56762306a36Sopenharmony_ci 56862306a36Sopenharmony_cistruct qxl_line_attr { 56962306a36Sopenharmony_ci uint8_t flags; 57062306a36Sopenharmony_ci uint8_t join_style; 57162306a36Sopenharmony_ci uint8_t end_style; 57262306a36Sopenharmony_ci uint8_t style_nseg; 57362306a36Sopenharmony_ci QXLFIXED width; 57462306a36Sopenharmony_ci QXLFIXED miter_limit; 57562306a36Sopenharmony_ci QXLPHYSICAL style; 57662306a36Sopenharmony_ci}; 57762306a36Sopenharmony_ci 57862306a36Sopenharmony_cistruct qxl_stroke { 57962306a36Sopenharmony_ci QXLPHYSICAL path; 58062306a36Sopenharmony_ci struct qxl_line_attr attr; 58162306a36Sopenharmony_ci struct qxl_brush brush; 58262306a36Sopenharmony_ci uint16_t fore_mode; 58362306a36Sopenharmony_ci uint16_t back_mode; 58462306a36Sopenharmony_ci}; 58562306a36Sopenharmony_ci 58662306a36Sopenharmony_cistruct qxl_text { 58762306a36Sopenharmony_ci QXLPHYSICAL str; 58862306a36Sopenharmony_ci struct qxl_rect back_area; 58962306a36Sopenharmony_ci struct qxl_brush fore_brush; 59062306a36Sopenharmony_ci struct qxl_brush back_brush; 59162306a36Sopenharmony_ci uint16_t fore_mode; 59262306a36Sopenharmony_ci uint16_t back_mode; 59362306a36Sopenharmony_ci}; 59462306a36Sopenharmony_ci 59562306a36Sopenharmony_cistruct qxl_mask { 59662306a36Sopenharmony_ci struct qxl_q_mask mask; 59762306a36Sopenharmony_ci}; 59862306a36Sopenharmony_ci 59962306a36Sopenharmony_cistruct qxl_clip { 60062306a36Sopenharmony_ci uint32_t type; 60162306a36Sopenharmony_ci QXLPHYSICAL data; 60262306a36Sopenharmony_ci}; 60362306a36Sopenharmony_ci 60462306a36Sopenharmony_cienum qxl_operator { 60562306a36Sopenharmony_ci QXL_OP_CLEAR = 0x00, 60662306a36Sopenharmony_ci QXL_OP_SOURCE = 0x01, 60762306a36Sopenharmony_ci QXL_OP_DST = 0x02, 60862306a36Sopenharmony_ci QXL_OP_OVER = 0x03, 60962306a36Sopenharmony_ci QXL_OP_OVER_REVERSE = 0x04, 61062306a36Sopenharmony_ci QXL_OP_IN = 0x05, 61162306a36Sopenharmony_ci QXL_OP_IN_REVERSE = 0x06, 61262306a36Sopenharmony_ci QXL_OP_OUT = 0x07, 61362306a36Sopenharmony_ci QXL_OP_OUT_REVERSE = 0x08, 61462306a36Sopenharmony_ci QXL_OP_ATOP = 0x09, 61562306a36Sopenharmony_ci QXL_OP_ATOP_REVERSE = 0x0a, 61662306a36Sopenharmony_ci QXL_OP_XOR = 0x0b, 61762306a36Sopenharmony_ci QXL_OP_ADD = 0x0c, 61862306a36Sopenharmony_ci QXL_OP_SATURATE = 0x0d, 61962306a36Sopenharmony_ci /* Note the jump here from 0x0d to 0x30 */ 62062306a36Sopenharmony_ci QXL_OP_MULTIPLY = 0x30, 62162306a36Sopenharmony_ci QXL_OP_SCREEN = 0x31, 62262306a36Sopenharmony_ci QXL_OP_OVERLAY = 0x32, 62362306a36Sopenharmony_ci QXL_OP_DARKEN = 0x33, 62462306a36Sopenharmony_ci QXL_OP_LIGHTEN = 0x34, 62562306a36Sopenharmony_ci QXL_OP_COLOR_DODGE = 0x35, 62662306a36Sopenharmony_ci QXL_OP_COLOR_BURN = 0x36, 62762306a36Sopenharmony_ci QXL_OP_HARD_LIGHT = 0x37, 62862306a36Sopenharmony_ci QXL_OP_SOFT_LIGHT = 0x38, 62962306a36Sopenharmony_ci QXL_OP_DIFFERENCE = 0x39, 63062306a36Sopenharmony_ci QXL_OP_EXCLUSION = 0x3a, 63162306a36Sopenharmony_ci QXL_OP_HSL_HUE = 0x3b, 63262306a36Sopenharmony_ci QXL_OP_HSL_SATURATION = 0x3c, 63362306a36Sopenharmony_ci QXL_OP_HSL_COLOR = 0x3d, 63462306a36Sopenharmony_ci QXL_OP_HSL_LUMINOSITY = 0x3e 63562306a36Sopenharmony_ci}; 63662306a36Sopenharmony_ci 63762306a36Sopenharmony_cistruct qxl_transform { 63862306a36Sopenharmony_ci uint32_t t00; 63962306a36Sopenharmony_ci uint32_t t01; 64062306a36Sopenharmony_ci uint32_t t02; 64162306a36Sopenharmony_ci uint32_t t10; 64262306a36Sopenharmony_ci uint32_t t11; 64362306a36Sopenharmony_ci uint32_t t12; 64462306a36Sopenharmony_ci}; 64562306a36Sopenharmony_ci 64662306a36Sopenharmony_ci/* The flags field has the following bit fields: 64762306a36Sopenharmony_ci * 64862306a36Sopenharmony_ci * operator: [ 0 - 7 ] 64962306a36Sopenharmony_ci * src_filter: [ 8 - 10 ] 65062306a36Sopenharmony_ci * mask_filter: [ 11 - 13 ] 65162306a36Sopenharmony_ci * src_repeat: [ 14 - 15 ] 65262306a36Sopenharmony_ci * mask_repeat: [ 16 - 17 ] 65362306a36Sopenharmony_ci * component_alpha: [ 18 - 18 ] 65462306a36Sopenharmony_ci * reserved: [ 19 - 31 ] 65562306a36Sopenharmony_ci * 65662306a36Sopenharmony_ci * The repeat and filter values are those of pixman: 65762306a36Sopenharmony_ci * REPEAT_NONE = 0 65862306a36Sopenharmony_ci * REPEAT_NORMAL = 1 65962306a36Sopenharmony_ci * REPEAT_PAD = 2 66062306a36Sopenharmony_ci * REPEAT_REFLECT = 3 66162306a36Sopenharmony_ci * 66262306a36Sopenharmony_ci * The filter values are: 66362306a36Sopenharmony_ci * FILTER_NEAREST = 0 66462306a36Sopenharmony_ci * FILTER_BILINEAR = 1 66562306a36Sopenharmony_ci */ 66662306a36Sopenharmony_cistruct qxl_composite { 66762306a36Sopenharmony_ci uint32_t flags; 66862306a36Sopenharmony_ci 66962306a36Sopenharmony_ci QXLPHYSICAL src; 67062306a36Sopenharmony_ci QXLPHYSICAL src_transform; /* May be NULL */ 67162306a36Sopenharmony_ci QXLPHYSICAL mask; /* May be NULL */ 67262306a36Sopenharmony_ci QXLPHYSICAL mask_transform; /* May be NULL */ 67362306a36Sopenharmony_ci struct qxl_point_1_6 src_origin; 67462306a36Sopenharmony_ci struct qxl_point_1_6 mask_origin; 67562306a36Sopenharmony_ci}; 67662306a36Sopenharmony_ci 67762306a36Sopenharmony_cistruct qxl_compat_drawable { 67862306a36Sopenharmony_ci union qxl_release_info release_info; 67962306a36Sopenharmony_ci uint8_t effect; 68062306a36Sopenharmony_ci uint8_t type; 68162306a36Sopenharmony_ci uint16_t bitmap_offset; 68262306a36Sopenharmony_ci struct qxl_rect bitmap_area; 68362306a36Sopenharmony_ci struct qxl_rect bbox; 68462306a36Sopenharmony_ci struct qxl_clip clip; 68562306a36Sopenharmony_ci uint32_t mm_time; 68662306a36Sopenharmony_ci union { 68762306a36Sopenharmony_ci struct qxl_fill fill; 68862306a36Sopenharmony_ci struct qxl_opaque opaque; 68962306a36Sopenharmony_ci struct qxl_copy copy; 69062306a36Sopenharmony_ci struct qxl_transparent transparent; 69162306a36Sopenharmony_ci struct qxl_compat_alpha_blend alpha_blend; 69262306a36Sopenharmony_ci struct qxl_copy_bits copy_bits; 69362306a36Sopenharmony_ci struct qxl_copy blend; 69462306a36Sopenharmony_ci struct qxl_rop_3 rop3; 69562306a36Sopenharmony_ci struct qxl_stroke stroke; 69662306a36Sopenharmony_ci struct qxl_text text; 69762306a36Sopenharmony_ci struct qxl_mask blackness; 69862306a36Sopenharmony_ci struct qxl_mask invers; 69962306a36Sopenharmony_ci struct qxl_mask whiteness; 70062306a36Sopenharmony_ci } u; 70162306a36Sopenharmony_ci}; 70262306a36Sopenharmony_ci 70362306a36Sopenharmony_cistruct qxl_drawable { 70462306a36Sopenharmony_ci union qxl_release_info release_info; 70562306a36Sopenharmony_ci uint32_t surface_id; 70662306a36Sopenharmony_ci uint8_t effect; 70762306a36Sopenharmony_ci uint8_t type; 70862306a36Sopenharmony_ci uint8_t self_bitmap; 70962306a36Sopenharmony_ci struct qxl_rect self_bitmap_area; 71062306a36Sopenharmony_ci struct qxl_rect bbox; 71162306a36Sopenharmony_ci struct qxl_clip clip; 71262306a36Sopenharmony_ci uint32_t mm_time; 71362306a36Sopenharmony_ci int32_t surfaces_dest[3]; 71462306a36Sopenharmony_ci struct qxl_rect surfaces_rects[3]; 71562306a36Sopenharmony_ci union { 71662306a36Sopenharmony_ci struct qxl_fill fill; 71762306a36Sopenharmony_ci struct qxl_opaque opaque; 71862306a36Sopenharmony_ci struct qxl_copy copy; 71962306a36Sopenharmony_ci struct qxl_transparent transparent; 72062306a36Sopenharmony_ci struct qxl_alpha_blend alpha_blend; 72162306a36Sopenharmony_ci struct qxl_copy_bits copy_bits; 72262306a36Sopenharmony_ci struct qxl_copy blend; 72362306a36Sopenharmony_ci struct qxl_rop_3 rop3; 72462306a36Sopenharmony_ci struct qxl_stroke stroke; 72562306a36Sopenharmony_ci struct qxl_text text; 72662306a36Sopenharmony_ci struct qxl_mask blackness; 72762306a36Sopenharmony_ci struct qxl_mask invers; 72862306a36Sopenharmony_ci struct qxl_mask whiteness; 72962306a36Sopenharmony_ci struct qxl_composite composite; 73062306a36Sopenharmony_ci } u; 73162306a36Sopenharmony_ci}; 73262306a36Sopenharmony_ci 73362306a36Sopenharmony_cienum qxl_surface_cmd_type { 73462306a36Sopenharmony_ci QXL_SURFACE_CMD_CREATE, 73562306a36Sopenharmony_ci QXL_SURFACE_CMD_DESTROY, 73662306a36Sopenharmony_ci}; 73762306a36Sopenharmony_ci 73862306a36Sopenharmony_cistruct qxl_surface { 73962306a36Sopenharmony_ci uint32_t format; 74062306a36Sopenharmony_ci uint32_t width; 74162306a36Sopenharmony_ci uint32_t height; 74262306a36Sopenharmony_ci int32_t stride; 74362306a36Sopenharmony_ci QXLPHYSICAL data; 74462306a36Sopenharmony_ci}; 74562306a36Sopenharmony_ci 74662306a36Sopenharmony_cistruct qxl_surface_cmd { 74762306a36Sopenharmony_ci union qxl_release_info release_info; 74862306a36Sopenharmony_ci uint32_t surface_id; 74962306a36Sopenharmony_ci uint8_t type; 75062306a36Sopenharmony_ci uint32_t flags; 75162306a36Sopenharmony_ci union { 75262306a36Sopenharmony_ci struct qxl_surface surface_create; 75362306a36Sopenharmony_ci } u; 75462306a36Sopenharmony_ci}; 75562306a36Sopenharmony_ci 75662306a36Sopenharmony_cistruct qxl_clip_rects { 75762306a36Sopenharmony_ci uint32_t num_rects; 75862306a36Sopenharmony_ci struct qxl_data_chunk chunk; 75962306a36Sopenharmony_ci}; 76062306a36Sopenharmony_ci 76162306a36Sopenharmony_cienum { 76262306a36Sopenharmony_ci QXL_PATH_BEGIN = (1 << 0), 76362306a36Sopenharmony_ci QXL_PATH_END = (1 << 1), 76462306a36Sopenharmony_ci QXL_PATH_CLOSE = (1 << 3), 76562306a36Sopenharmony_ci QXL_PATH_BEZIER = (1 << 4), 76662306a36Sopenharmony_ci}; 76762306a36Sopenharmony_ci 76862306a36Sopenharmony_cistruct qxl_path_seg { 76962306a36Sopenharmony_ci uint32_t flags; 77062306a36Sopenharmony_ci uint32_t count; 77162306a36Sopenharmony_ci struct qxl_point_fix points[]; 77262306a36Sopenharmony_ci}; 77362306a36Sopenharmony_ci 77462306a36Sopenharmony_cistruct qxl_path { 77562306a36Sopenharmony_ci uint32_t data_size; 77662306a36Sopenharmony_ci struct qxl_data_chunk chunk; 77762306a36Sopenharmony_ci}; 77862306a36Sopenharmony_ci 77962306a36Sopenharmony_cienum { 78062306a36Sopenharmony_ci QXL_IMAGE_GROUP_DRIVER, 78162306a36Sopenharmony_ci QXL_IMAGE_GROUP_DEVICE, 78262306a36Sopenharmony_ci QXL_IMAGE_GROUP_RED, 78362306a36Sopenharmony_ci QXL_IMAGE_GROUP_DRIVER_DONT_CACHE, 78462306a36Sopenharmony_ci}; 78562306a36Sopenharmony_ci 78662306a36Sopenharmony_cistruct qxl_image_id { 78762306a36Sopenharmony_ci uint32_t group; 78862306a36Sopenharmony_ci uint32_t unique; 78962306a36Sopenharmony_ci}; 79062306a36Sopenharmony_ci 79162306a36Sopenharmony_ciunion qxl_image_id_union { 79262306a36Sopenharmony_ci struct qxl_image_id id; 79362306a36Sopenharmony_ci uint64_t value; 79462306a36Sopenharmony_ci}; 79562306a36Sopenharmony_ci 79662306a36Sopenharmony_cienum qxl_image_flags { 79762306a36Sopenharmony_ci QXL_IMAGE_CACHE = (1 << 0), 79862306a36Sopenharmony_ci QXL_IMAGE_HIGH_BITS_SET = (1 << 1), 79962306a36Sopenharmony_ci}; 80062306a36Sopenharmony_ci 80162306a36Sopenharmony_cienum qxl_bitmap_flags { 80262306a36Sopenharmony_ci QXL_BITMAP_DIRECT = (1 << 0), 80362306a36Sopenharmony_ci QXL_BITMAP_UNSTABLE = (1 << 1), 80462306a36Sopenharmony_ci QXL_BITMAP_TOP_DOWN = (1 << 2), /* == SPICE_BITMAP_FLAGS_TOP_DOWN */ 80562306a36Sopenharmony_ci}; 80662306a36Sopenharmony_ci 80762306a36Sopenharmony_ci#define QXL_SET_IMAGE_ID(image, _group, _unique) { \ 80862306a36Sopenharmony_ci (image)->descriptor.id = (((uint64_t)_unique) << 32) | _group; \ 80962306a36Sopenharmony_ci} 81062306a36Sopenharmony_ci 81162306a36Sopenharmony_cistruct qxl_image_descriptor { 81262306a36Sopenharmony_ci uint64_t id; 81362306a36Sopenharmony_ci uint8_t type; 81462306a36Sopenharmony_ci uint8_t flags; 81562306a36Sopenharmony_ci uint32_t width; 81662306a36Sopenharmony_ci uint32_t height; 81762306a36Sopenharmony_ci}; 81862306a36Sopenharmony_ci 81962306a36Sopenharmony_cistruct qxl_palette { 82062306a36Sopenharmony_ci uint64_t unique; 82162306a36Sopenharmony_ci uint16_t num_ents; 82262306a36Sopenharmony_ci uint32_t ents[]; 82362306a36Sopenharmony_ci}; 82462306a36Sopenharmony_ci 82562306a36Sopenharmony_cistruct qxl_bitmap { 82662306a36Sopenharmony_ci uint8_t format; 82762306a36Sopenharmony_ci uint8_t flags; 82862306a36Sopenharmony_ci uint32_t x; 82962306a36Sopenharmony_ci uint32_t y; 83062306a36Sopenharmony_ci uint32_t stride; 83162306a36Sopenharmony_ci QXLPHYSICAL palette; 83262306a36Sopenharmony_ci QXLPHYSICAL data; /* data[0] ? */ 83362306a36Sopenharmony_ci}; 83462306a36Sopenharmony_ci 83562306a36Sopenharmony_cistruct qxl_surface_id { 83662306a36Sopenharmony_ci uint32_t surface_id; 83762306a36Sopenharmony_ci}; 83862306a36Sopenharmony_ci 83962306a36Sopenharmony_cistruct qxl_encoder_data { 84062306a36Sopenharmony_ci uint32_t data_size; 84162306a36Sopenharmony_ci uint8_t data[]; 84262306a36Sopenharmony_ci}; 84362306a36Sopenharmony_ci 84462306a36Sopenharmony_cistruct qxl_image { 84562306a36Sopenharmony_ci struct qxl_image_descriptor descriptor; 84662306a36Sopenharmony_ci union { /* variable length */ 84762306a36Sopenharmony_ci struct qxl_bitmap bitmap; 84862306a36Sopenharmony_ci struct qxl_encoder_data quic; 84962306a36Sopenharmony_ci struct qxl_surface_id surface_image; 85062306a36Sopenharmony_ci } u; 85162306a36Sopenharmony_ci}; 85262306a36Sopenharmony_ci 85362306a36Sopenharmony_ci/* A QXLHead is a single monitor output backed by a QXLSurface. 85462306a36Sopenharmony_ci * x and y offsets are unsigned since they are used in relation to 85562306a36Sopenharmony_ci * the given surface, not the same as the x, y coordinates in the guest 85662306a36Sopenharmony_ci * screen reference frame. */ 85762306a36Sopenharmony_cistruct qxl_head { 85862306a36Sopenharmony_ci uint32_t id; 85962306a36Sopenharmony_ci uint32_t surface_id; 86062306a36Sopenharmony_ci uint32_t width; 86162306a36Sopenharmony_ci uint32_t height; 86262306a36Sopenharmony_ci uint32_t x; 86362306a36Sopenharmony_ci uint32_t y; 86462306a36Sopenharmony_ci uint32_t flags; 86562306a36Sopenharmony_ci}; 86662306a36Sopenharmony_ci 86762306a36Sopenharmony_cistruct qxl_monitors_config { 86862306a36Sopenharmony_ci uint16_t count; 86962306a36Sopenharmony_ci uint16_t max_allowed; /* If it is 0 no fixed limit is given by the 87062306a36Sopenharmony_ci driver */ 87162306a36Sopenharmony_ci struct qxl_head heads[]; 87262306a36Sopenharmony_ci}; 87362306a36Sopenharmony_ci 87462306a36Sopenharmony_ci#pragma pack(pop) 87562306a36Sopenharmony_ci 87662306a36Sopenharmony_ci#endif /* _H_QXL_DEV */ 877