1f64122c1SDave Airlie /* 2f64122c1SDave Airlie Copyright (C) 2009 Red Hat, Inc. 3f64122c1SDave Airlie 4f64122c1SDave Airlie Redistribution and use in source and binary forms, with or without 5f64122c1SDave Airlie modification, are permitted provided that the following conditions are 6f64122c1SDave Airlie met: 7f64122c1SDave Airlie 8f64122c1SDave Airlie * Redistributions of source code must retain the above copyright 9f64122c1SDave Airlie notice, this list of conditions and the following disclaimer. 10f64122c1SDave Airlie * Redistributions in binary form must reproduce the above copyright 11f64122c1SDave Airlie notice, this list of conditions and the following disclaimer in 12f64122c1SDave Airlie the documentation and/or other materials provided with the 13f64122c1SDave Airlie distribution. 14f64122c1SDave Airlie * Neither the name of the copyright holder nor the names of its 15f64122c1SDave Airlie contributors may be used to endorse or promote products derived 16f64122c1SDave Airlie from this software without specific prior written permission. 17f64122c1SDave Airlie 18f64122c1SDave Airlie THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS "AS 19f64122c1SDave Airlie IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 20f64122c1SDave Airlie TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 21f64122c1SDave Airlie PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22f64122c1SDave Airlie HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23f64122c1SDave Airlie SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24f64122c1SDave Airlie LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25f64122c1SDave Airlie DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26f64122c1SDave Airlie THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27f64122c1SDave Airlie (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28f64122c1SDave Airlie OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29f64122c1SDave Airlie */ 30f64122c1SDave Airlie 31f64122c1SDave Airlie #ifndef H_QXL_DEV 32f64122c1SDave Airlie #define H_QXL_DEV 33f64122c1SDave Airlie 34f64122c1SDave Airlie #include <linux/types.h> 35f64122c1SDave Airlie 36f64122c1SDave Airlie /* 37f64122c1SDave Airlie * from spice-protocol 38f64122c1SDave Airlie * Release 0.10.0 39f64122c1SDave Airlie */ 40f64122c1SDave Airlie 41f64122c1SDave Airlie /* enums.h */ 42f64122c1SDave Airlie 43f64122c1SDave Airlie enum SpiceImageType { 44f64122c1SDave Airlie SPICE_IMAGE_TYPE_BITMAP, 45f64122c1SDave Airlie SPICE_IMAGE_TYPE_QUIC, 46f64122c1SDave Airlie SPICE_IMAGE_TYPE_RESERVED, 47f64122c1SDave Airlie SPICE_IMAGE_TYPE_LZ_PLT = 100, 48f64122c1SDave Airlie SPICE_IMAGE_TYPE_LZ_RGB, 49f64122c1SDave Airlie SPICE_IMAGE_TYPE_GLZ_RGB, 50f64122c1SDave Airlie SPICE_IMAGE_TYPE_FROM_CACHE, 51f64122c1SDave Airlie SPICE_IMAGE_TYPE_SURFACE, 52f64122c1SDave Airlie SPICE_IMAGE_TYPE_JPEG, 53f64122c1SDave Airlie SPICE_IMAGE_TYPE_FROM_CACHE_LOSSLESS, 54f64122c1SDave Airlie SPICE_IMAGE_TYPE_ZLIB_GLZ_RGB, 55f64122c1SDave Airlie SPICE_IMAGE_TYPE_JPEG_ALPHA, 56f64122c1SDave Airlie 57f64122c1SDave Airlie SPICE_IMAGE_TYPE_ENUM_END 58f64122c1SDave Airlie }; 59f64122c1SDave Airlie 60f64122c1SDave Airlie enum SpiceBitmapFmt { 61f64122c1SDave Airlie SPICE_BITMAP_FMT_INVALID, 62f64122c1SDave Airlie SPICE_BITMAP_FMT_1BIT_LE, 63f64122c1SDave Airlie SPICE_BITMAP_FMT_1BIT_BE, 64f64122c1SDave Airlie SPICE_BITMAP_FMT_4BIT_LE, 65f64122c1SDave Airlie SPICE_BITMAP_FMT_4BIT_BE, 66f64122c1SDave Airlie SPICE_BITMAP_FMT_8BIT, 67f64122c1SDave Airlie SPICE_BITMAP_FMT_16BIT, 68f64122c1SDave Airlie SPICE_BITMAP_FMT_24BIT, 69f64122c1SDave Airlie SPICE_BITMAP_FMT_32BIT, 70f64122c1SDave Airlie SPICE_BITMAP_FMT_RGBA, 71f64122c1SDave Airlie 72f64122c1SDave Airlie SPICE_BITMAP_FMT_ENUM_END 73f64122c1SDave Airlie }; 74f64122c1SDave Airlie 75f64122c1SDave Airlie enum SpiceSurfaceFmt { 76f64122c1SDave Airlie SPICE_SURFACE_FMT_INVALID, 77f64122c1SDave Airlie SPICE_SURFACE_FMT_1_A, 78f64122c1SDave Airlie SPICE_SURFACE_FMT_8_A = 8, 79f64122c1SDave Airlie SPICE_SURFACE_FMT_16_555 = 16, 80f64122c1SDave Airlie SPICE_SURFACE_FMT_32_xRGB = 32, 81f64122c1SDave Airlie SPICE_SURFACE_FMT_16_565 = 80, 82f64122c1SDave Airlie SPICE_SURFACE_FMT_32_ARGB = 96, 83f64122c1SDave Airlie 84f64122c1SDave Airlie SPICE_SURFACE_FMT_ENUM_END 85f64122c1SDave Airlie }; 86f64122c1SDave Airlie 87f64122c1SDave Airlie enum SpiceClipType { 88f64122c1SDave Airlie SPICE_CLIP_TYPE_NONE, 89f64122c1SDave Airlie SPICE_CLIP_TYPE_RECTS, 90f64122c1SDave Airlie 91f64122c1SDave Airlie SPICE_CLIP_TYPE_ENUM_END 92f64122c1SDave Airlie }; 93f64122c1SDave Airlie 94f64122c1SDave Airlie enum SpiceRopd { 95f64122c1SDave Airlie SPICE_ROPD_INVERS_SRC = (1 << 0), 96f64122c1SDave Airlie SPICE_ROPD_INVERS_BRUSH = (1 << 1), 97f64122c1SDave Airlie SPICE_ROPD_INVERS_DEST = (1 << 2), 98f64122c1SDave Airlie SPICE_ROPD_OP_PUT = (1 << 3), 99f64122c1SDave Airlie SPICE_ROPD_OP_OR = (1 << 4), 100f64122c1SDave Airlie SPICE_ROPD_OP_AND = (1 << 5), 101f64122c1SDave Airlie SPICE_ROPD_OP_XOR = (1 << 6), 102f64122c1SDave Airlie SPICE_ROPD_OP_BLACKNESS = (1 << 7), 103f64122c1SDave Airlie SPICE_ROPD_OP_WHITENESS = (1 << 8), 104f64122c1SDave Airlie SPICE_ROPD_OP_INVERS = (1 << 9), 105f64122c1SDave Airlie SPICE_ROPD_INVERS_RES = (1 << 10), 106f64122c1SDave Airlie 107f64122c1SDave Airlie SPICE_ROPD_MASK = 0x7ff 108f64122c1SDave Airlie }; 109f64122c1SDave Airlie 110f64122c1SDave Airlie enum SpiceBrushType { 111f64122c1SDave Airlie SPICE_BRUSH_TYPE_NONE, 112f64122c1SDave Airlie SPICE_BRUSH_TYPE_SOLID, 113f64122c1SDave Airlie SPICE_BRUSH_TYPE_PATTERN, 114f64122c1SDave Airlie 115f64122c1SDave Airlie SPICE_BRUSH_TYPE_ENUM_END 116f64122c1SDave Airlie }; 117f64122c1SDave Airlie 118f64122c1SDave Airlie enum SpiceCursorType { 119f64122c1SDave Airlie SPICE_CURSOR_TYPE_ALPHA, 120f64122c1SDave Airlie SPICE_CURSOR_TYPE_MONO, 121f64122c1SDave Airlie SPICE_CURSOR_TYPE_COLOR4, 122f64122c1SDave Airlie SPICE_CURSOR_TYPE_COLOR8, 123f64122c1SDave Airlie SPICE_CURSOR_TYPE_COLOR16, 124f64122c1SDave Airlie SPICE_CURSOR_TYPE_COLOR24, 125f64122c1SDave Airlie SPICE_CURSOR_TYPE_COLOR32, 126f64122c1SDave Airlie 127f64122c1SDave Airlie SPICE_CURSOR_TYPE_ENUM_END 128f64122c1SDave Airlie }; 129f64122c1SDave Airlie 130f64122c1SDave Airlie /* qxl_dev.h */ 131f64122c1SDave Airlie 132f64122c1SDave Airlie #pragma pack(push, 1) 133f64122c1SDave Airlie 134f64122c1SDave Airlie /* 0x100-0x11f reserved for spice, 0x1ff used for unstable work */ 135f64122c1SDave Airlie #define QXL_DEVICE_ID_STABLE 0x0100 136f64122c1SDave Airlie 137f64122c1SDave Airlie enum { 138f64122c1SDave Airlie QXL_REVISION_STABLE_V04 = 0x01, 139f64122c1SDave Airlie QXL_REVISION_STABLE_V06 = 0x02, 140f64122c1SDave Airlie QXL_REVISION_STABLE_V10 = 0x03, 141f64122c1SDave Airlie QXL_REVISION_STABLE_V12 = 0x04, 142f64122c1SDave Airlie }; 143f64122c1SDave Airlie 144f64122c1SDave Airlie #define QXL_DEVICE_ID_DEVEL 0x01ff 145f64122c1SDave Airlie #define QXL_REVISION_DEVEL 0x01 146f64122c1SDave Airlie 147f64122c1SDave Airlie #define QXL_ROM_MAGIC (*(uint32_t *)"QXRO") 148f64122c1SDave Airlie #define QXL_RAM_MAGIC (*(uint32_t *)"QXRA") 149f64122c1SDave Airlie 150f64122c1SDave Airlie enum { 151f64122c1SDave Airlie QXL_RAM_RANGE_INDEX, 152f64122c1SDave Airlie QXL_VRAM_RANGE_INDEX, 153f64122c1SDave Airlie QXL_ROM_RANGE_INDEX, 154f64122c1SDave Airlie QXL_IO_RANGE_INDEX, 155f64122c1SDave Airlie 156f64122c1SDave Airlie QXL_PCI_RANGES 157f64122c1SDave Airlie }; 158f64122c1SDave Airlie 159f64122c1SDave Airlie /* qxl-1 compat: append only */ 160f64122c1SDave Airlie enum { 161f64122c1SDave Airlie QXL_IO_NOTIFY_CMD, 162f64122c1SDave Airlie QXL_IO_NOTIFY_CURSOR, 163f64122c1SDave Airlie QXL_IO_UPDATE_AREA, 164f64122c1SDave Airlie QXL_IO_UPDATE_IRQ, 165f64122c1SDave Airlie QXL_IO_NOTIFY_OOM, 166f64122c1SDave Airlie QXL_IO_RESET, 167f64122c1SDave Airlie QXL_IO_SET_MODE, /* qxl-1 */ 168f64122c1SDave Airlie QXL_IO_LOG, 169f64122c1SDave Airlie /* appended for qxl-2 */ 170f64122c1SDave Airlie QXL_IO_MEMSLOT_ADD, 171f64122c1SDave Airlie QXL_IO_MEMSLOT_DEL, 172f64122c1SDave Airlie QXL_IO_DETACH_PRIMARY, 173f64122c1SDave Airlie QXL_IO_ATTACH_PRIMARY, 174f64122c1SDave Airlie QXL_IO_CREATE_PRIMARY, 175f64122c1SDave Airlie QXL_IO_DESTROY_PRIMARY, 176f64122c1SDave Airlie QXL_IO_DESTROY_SURFACE_WAIT, 177f64122c1SDave Airlie QXL_IO_DESTROY_ALL_SURFACES, 178f64122c1SDave Airlie /* appended for qxl-3 */ 179f64122c1SDave Airlie QXL_IO_UPDATE_AREA_ASYNC, 180f64122c1SDave Airlie QXL_IO_MEMSLOT_ADD_ASYNC, 181f64122c1SDave Airlie QXL_IO_CREATE_PRIMARY_ASYNC, 182f64122c1SDave Airlie QXL_IO_DESTROY_PRIMARY_ASYNC, 183f64122c1SDave Airlie QXL_IO_DESTROY_SURFACE_ASYNC, 184f64122c1SDave Airlie QXL_IO_DESTROY_ALL_SURFACES_ASYNC, 185f64122c1SDave Airlie QXL_IO_FLUSH_SURFACES_ASYNC, 186f64122c1SDave Airlie QXL_IO_FLUSH_RELEASE, 187f64122c1SDave Airlie /* appended for qxl-4 */ 188f64122c1SDave Airlie QXL_IO_MONITORS_CONFIG_ASYNC, 189f64122c1SDave Airlie 190f64122c1SDave Airlie QXL_IO_RANGE_SIZE 191f64122c1SDave Airlie }; 192f64122c1SDave Airlie 193f64122c1SDave Airlie typedef uint64_t QXLPHYSICAL; 194f64122c1SDave Airlie typedef int32_t QXLFIXED; /* fixed 28.4 */ 195f64122c1SDave Airlie 196f64122c1SDave Airlie struct qxl_point_fix { 197f64122c1SDave Airlie QXLFIXED x; 198f64122c1SDave Airlie QXLFIXED y; 199f64122c1SDave Airlie }; 200f64122c1SDave Airlie 201f64122c1SDave Airlie struct qxl_point { 202f64122c1SDave Airlie int32_t x; 203f64122c1SDave Airlie int32_t y; 204f64122c1SDave Airlie }; 205f64122c1SDave Airlie 206f64122c1SDave Airlie struct qxl_point_1_6 { 207f64122c1SDave Airlie int16_t x; 208f64122c1SDave Airlie int16_t y; 209f64122c1SDave Airlie }; 210f64122c1SDave Airlie 211f64122c1SDave Airlie struct qxl_rect { 212f64122c1SDave Airlie int32_t top; 213f64122c1SDave Airlie int32_t left; 214f64122c1SDave Airlie int32_t bottom; 215f64122c1SDave Airlie int32_t right; 216f64122c1SDave Airlie }; 217f64122c1SDave Airlie 218f64122c1SDave Airlie struct qxl_urect { 219f64122c1SDave Airlie uint32_t top; 220f64122c1SDave Airlie uint32_t left; 221f64122c1SDave Airlie uint32_t bottom; 222f64122c1SDave Airlie uint32_t right; 223f64122c1SDave Airlie }; 224f64122c1SDave Airlie 225f64122c1SDave Airlie /* qxl-1 compat: append only */ 226f64122c1SDave Airlie struct qxl_rom { 227f64122c1SDave Airlie uint32_t magic; 228f64122c1SDave Airlie uint32_t id; 229f64122c1SDave Airlie uint32_t update_id; 230f64122c1SDave Airlie uint32_t compression_level; 231f64122c1SDave Airlie uint32_t log_level; 232f64122c1SDave Airlie uint32_t mode; /* qxl-1 */ 233f64122c1SDave Airlie uint32_t modes_offset; 234f64122c1SDave Airlie uint32_t num_io_pages; 235f64122c1SDave Airlie uint32_t pages_offset; /* qxl-1 */ 236f64122c1SDave Airlie uint32_t draw_area_offset; /* qxl-1 */ 237f64122c1SDave Airlie uint32_t surface0_area_size; /* qxl-1 name: draw_area_size */ 238f64122c1SDave Airlie uint32_t ram_header_offset; 239f64122c1SDave Airlie uint32_t mm_clock; 240f64122c1SDave Airlie /* appended for qxl-2 */ 241f64122c1SDave Airlie uint32_t n_surfaces; 242f64122c1SDave Airlie uint64_t flags; 243f64122c1SDave Airlie uint8_t slots_start; 244f64122c1SDave Airlie uint8_t slots_end; 245f64122c1SDave Airlie uint8_t slot_gen_bits; 246f64122c1SDave Airlie uint8_t slot_id_bits; 247f64122c1SDave Airlie uint8_t slot_generation; 248f64122c1SDave Airlie /* appended for qxl-4 */ 249f64122c1SDave Airlie uint8_t client_present; 250f64122c1SDave Airlie uint8_t client_capabilities[58]; 251f64122c1SDave Airlie uint32_t client_monitors_config_crc; 252f64122c1SDave Airlie struct { 253f64122c1SDave Airlie uint16_t count; 254f64122c1SDave Airlie uint16_t padding; 255f64122c1SDave Airlie struct qxl_urect heads[64]; 256f64122c1SDave Airlie } client_monitors_config; 257f64122c1SDave Airlie }; 258f64122c1SDave Airlie 259f64122c1SDave Airlie /* qxl-1 compat: fixed */ 260f64122c1SDave Airlie struct qxl_mode { 261f64122c1SDave Airlie uint32_t id; 262f64122c1SDave Airlie uint32_t x_res; 263f64122c1SDave Airlie uint32_t y_res; 264f64122c1SDave Airlie uint32_t bits; 265f64122c1SDave Airlie uint32_t stride; 266f64122c1SDave Airlie uint32_t x_mili; 267f64122c1SDave Airlie uint32_t y_mili; 268f64122c1SDave Airlie uint32_t orientation; 269f64122c1SDave Airlie }; 270f64122c1SDave Airlie 271f64122c1SDave Airlie /* qxl-1 compat: fixed */ 272f64122c1SDave Airlie struct qxl_modes { 273f64122c1SDave Airlie uint32_t n_modes; 274*d1f66f05STian Tao struct qxl_mode modes[]; 275f64122c1SDave Airlie }; 276f64122c1SDave Airlie 277f64122c1SDave Airlie /* qxl-1 compat: append only */ 278f64122c1SDave Airlie enum qxl_cmd_type { 279f64122c1SDave Airlie QXL_CMD_NOP, 280f64122c1SDave Airlie QXL_CMD_DRAW, 281f64122c1SDave Airlie QXL_CMD_UPDATE, 282f64122c1SDave Airlie QXL_CMD_CURSOR, 283f64122c1SDave Airlie QXL_CMD_MESSAGE, 284f64122c1SDave Airlie QXL_CMD_SURFACE, 285f64122c1SDave Airlie }; 286f64122c1SDave Airlie 287f64122c1SDave Airlie /* qxl-1 compat: fixed */ 288f64122c1SDave Airlie struct qxl_command { 289f64122c1SDave Airlie QXLPHYSICAL data; 290f64122c1SDave Airlie uint32_t type; 291f64122c1SDave Airlie uint32_t padding; 292f64122c1SDave Airlie }; 293f64122c1SDave Airlie 294f64122c1SDave Airlie #define QXL_COMMAND_FLAG_COMPAT (1<<0) 295f64122c1SDave Airlie #define QXL_COMMAND_FLAG_COMPAT_16BPP (2<<0) 296f64122c1SDave Airlie 297f64122c1SDave Airlie struct qxl_command_ext { 298f64122c1SDave Airlie struct qxl_command cmd; 299f64122c1SDave Airlie uint32_t group_id; 300f64122c1SDave Airlie uint32_t flags; 301f64122c1SDave Airlie }; 302f64122c1SDave Airlie 303f64122c1SDave Airlie struct qxl_mem_slot { 304f64122c1SDave Airlie uint64_t mem_start; 305f64122c1SDave Airlie uint64_t mem_end; 306f64122c1SDave Airlie }; 307f64122c1SDave Airlie 308f64122c1SDave Airlie #define QXL_SURF_TYPE_PRIMARY 0 309f64122c1SDave Airlie 310f64122c1SDave Airlie #define QXL_SURF_FLAG_KEEP_DATA (1 << 0) 311f64122c1SDave Airlie 312f64122c1SDave Airlie struct qxl_surface_create { 313f64122c1SDave Airlie uint32_t width; 314f64122c1SDave Airlie uint32_t height; 315f64122c1SDave Airlie int32_t stride; 316f64122c1SDave Airlie uint32_t format; 317f64122c1SDave Airlie uint32_t position; 318f64122c1SDave Airlie uint32_t mouse_mode; 319f64122c1SDave Airlie uint32_t flags; 320f64122c1SDave Airlie uint32_t type; 321f64122c1SDave Airlie QXLPHYSICAL mem; 322f64122c1SDave Airlie }; 323f64122c1SDave Airlie 324f64122c1SDave Airlie #define QXL_COMMAND_RING_SIZE 32 325f64122c1SDave Airlie #define QXL_CURSOR_RING_SIZE 32 326f64122c1SDave Airlie #define QXL_RELEASE_RING_SIZE 8 327f64122c1SDave Airlie 328f64122c1SDave Airlie #define QXL_LOG_BUF_SIZE 4096 329f64122c1SDave Airlie 330f64122c1SDave Airlie #define QXL_INTERRUPT_DISPLAY (1 << 0) 331f64122c1SDave Airlie #define QXL_INTERRUPT_CURSOR (1 << 1) 332f64122c1SDave Airlie #define QXL_INTERRUPT_IO_CMD (1 << 2) 333f64122c1SDave Airlie #define QXL_INTERRUPT_ERROR (1 << 3) 334f64122c1SDave Airlie #define QXL_INTERRUPT_CLIENT (1 << 4) 335f64122c1SDave Airlie #define QXL_INTERRUPT_CLIENT_MONITORS_CONFIG (1 << 5) 336f64122c1SDave Airlie 337f64122c1SDave Airlie struct qxl_ring_header { 338f64122c1SDave Airlie uint32_t num_items; 339f64122c1SDave Airlie uint32_t prod; 340f64122c1SDave Airlie uint32_t notify_on_prod; 341f64122c1SDave Airlie uint32_t cons; 342f64122c1SDave Airlie uint32_t notify_on_cons; 343f64122c1SDave Airlie }; 344f64122c1SDave Airlie 345f64122c1SDave Airlie /* qxl-1 compat: append only */ 346f64122c1SDave Airlie struct qxl_ram_header { 347f64122c1SDave Airlie uint32_t magic; 348f64122c1SDave Airlie uint32_t int_pending; 349f64122c1SDave Airlie uint32_t int_mask; 350f64122c1SDave Airlie uint8_t log_buf[QXL_LOG_BUF_SIZE]; 351f64122c1SDave Airlie struct qxl_ring_header cmd_ring_hdr; 352f64122c1SDave Airlie struct qxl_command cmd_ring[QXL_COMMAND_RING_SIZE]; 353f64122c1SDave Airlie struct qxl_ring_header cursor_ring_hdr; 354f64122c1SDave Airlie struct qxl_command cursor_ring[QXL_CURSOR_RING_SIZE]; 355f64122c1SDave Airlie struct qxl_ring_header release_ring_hdr; 356f64122c1SDave Airlie uint64_t release_ring[QXL_RELEASE_RING_SIZE]; 357f64122c1SDave Airlie struct qxl_rect update_area; 358f64122c1SDave Airlie /* appended for qxl-2 */ 359f64122c1SDave Airlie uint32_t update_surface; 360f64122c1SDave Airlie struct qxl_mem_slot mem_slot; 361f64122c1SDave Airlie struct qxl_surface_create create_surface; 362f64122c1SDave Airlie uint64_t flags; 363f64122c1SDave Airlie 364f64122c1SDave Airlie /* appended for qxl-4 */ 365f64122c1SDave Airlie 366f64122c1SDave Airlie /* used by QXL_IO_MONITORS_CONFIG_ASYNC */ 367f64122c1SDave Airlie QXLPHYSICAL monitors_config; 368f64122c1SDave Airlie uint8_t guest_capabilities[64]; 369f64122c1SDave Airlie }; 370f64122c1SDave Airlie 371f64122c1SDave Airlie union qxl_release_info { 372f64122c1SDave Airlie uint64_t id; /* in */ 373f64122c1SDave Airlie uint64_t next; /* out */ 374f64122c1SDave Airlie }; 375f64122c1SDave Airlie 376f64122c1SDave Airlie struct qxl_release_info_ext { 377f64122c1SDave Airlie union qxl_release_info *info; 378f64122c1SDave Airlie uint32_t group_id; 379f64122c1SDave Airlie }; 380f64122c1SDave Airlie 381f64122c1SDave Airlie struct qxl_data_chunk { 382f64122c1SDave Airlie uint32_t data_size; 383f64122c1SDave Airlie QXLPHYSICAL prev_chunk; 384f64122c1SDave Airlie QXLPHYSICAL next_chunk; 385*d1f66f05STian Tao uint8_t data[]; 386f64122c1SDave Airlie }; 387f64122c1SDave Airlie 388f64122c1SDave Airlie struct qxl_message { 389f64122c1SDave Airlie union qxl_release_info release_info; 390*d1f66f05STian Tao uint8_t data[]; 391f64122c1SDave Airlie }; 392f64122c1SDave Airlie 393f64122c1SDave Airlie struct qxl_compat_update_cmd { 394f64122c1SDave Airlie union qxl_release_info release_info; 395f64122c1SDave Airlie struct qxl_rect area; 396f64122c1SDave Airlie uint32_t update_id; 397f64122c1SDave Airlie }; 398f64122c1SDave Airlie 399f64122c1SDave Airlie struct qxl_update_cmd { 400f64122c1SDave Airlie union qxl_release_info release_info; 401f64122c1SDave Airlie struct qxl_rect area; 402f64122c1SDave Airlie uint32_t update_id; 403f64122c1SDave Airlie uint32_t surface_id; 404f64122c1SDave Airlie }; 405f64122c1SDave Airlie 406f64122c1SDave Airlie struct qxl_cursor_header { 407f64122c1SDave Airlie uint64_t unique; 408f64122c1SDave Airlie uint16_t type; 409f64122c1SDave Airlie uint16_t width; 410f64122c1SDave Airlie uint16_t height; 411f64122c1SDave Airlie uint16_t hot_spot_x; 412f64122c1SDave Airlie uint16_t hot_spot_y; 413f64122c1SDave Airlie }; 414f64122c1SDave Airlie 415f64122c1SDave Airlie struct qxl_cursor { 416f64122c1SDave Airlie struct qxl_cursor_header header; 417f64122c1SDave Airlie uint32_t data_size; 418f64122c1SDave Airlie struct qxl_data_chunk chunk; 419f64122c1SDave Airlie }; 420f64122c1SDave Airlie 421f64122c1SDave Airlie enum { 422f64122c1SDave Airlie QXL_CURSOR_SET, 423f64122c1SDave Airlie QXL_CURSOR_MOVE, 424f64122c1SDave Airlie QXL_CURSOR_HIDE, 425f64122c1SDave Airlie QXL_CURSOR_TRAIL, 426f64122c1SDave Airlie }; 427f64122c1SDave Airlie 428f64122c1SDave Airlie #define QXL_CURSOR_DEVICE_DATA_SIZE 128 429f64122c1SDave Airlie 430f64122c1SDave Airlie struct qxl_cursor_cmd { 431f64122c1SDave Airlie union qxl_release_info release_info; 432f64122c1SDave Airlie uint8_t type; 433f64122c1SDave Airlie union { 434f64122c1SDave Airlie struct { 435f64122c1SDave Airlie struct qxl_point_1_6 position; 436f64122c1SDave Airlie uint8_t visible; 437f64122c1SDave Airlie QXLPHYSICAL shape; 438f64122c1SDave Airlie } set; 439f64122c1SDave Airlie struct { 440f64122c1SDave Airlie uint16_t length; 441f64122c1SDave Airlie uint16_t frequency; 442f64122c1SDave Airlie } trail; 443f64122c1SDave Airlie struct qxl_point_1_6 position; 444f64122c1SDave Airlie } u; 445f64122c1SDave Airlie /* todo: dynamic size from rom */ 446f64122c1SDave Airlie uint8_t device_data[QXL_CURSOR_DEVICE_DATA_SIZE]; 447f64122c1SDave Airlie }; 448f64122c1SDave Airlie 449f64122c1SDave Airlie enum { 450f64122c1SDave Airlie QXL_DRAW_NOP, 451f64122c1SDave Airlie QXL_DRAW_FILL, 452f64122c1SDave Airlie QXL_DRAW_OPAQUE, 453f64122c1SDave Airlie QXL_DRAW_COPY, 454f64122c1SDave Airlie QXL_COPY_BITS, 455f64122c1SDave Airlie QXL_DRAW_BLEND, 456f64122c1SDave Airlie QXL_DRAW_BLACKNESS, 457f64122c1SDave Airlie QXL_DRAW_WHITENESS, 458f64122c1SDave Airlie QXL_DRAW_INVERS, 459f64122c1SDave Airlie QXL_DRAW_ROP3, 460f64122c1SDave Airlie QXL_DRAW_STROKE, 461f64122c1SDave Airlie QXL_DRAW_TEXT, 462f64122c1SDave Airlie QXL_DRAW_TRANSPARENT, 463f64122c1SDave Airlie QXL_DRAW_ALPHA_BLEND, 464f64122c1SDave Airlie QXL_DRAW_COMPOSITE 465f64122c1SDave Airlie }; 466f64122c1SDave Airlie 467f64122c1SDave Airlie struct qxl_raster_glyph { 468f64122c1SDave Airlie struct qxl_point render_pos; 469f64122c1SDave Airlie struct qxl_point glyph_origin; 470f64122c1SDave Airlie uint16_t width; 471f64122c1SDave Airlie uint16_t height; 472*d1f66f05STian Tao uint8_t data[]; 473f64122c1SDave Airlie }; 474f64122c1SDave Airlie 475f64122c1SDave Airlie struct qxl_string { 476f64122c1SDave Airlie uint32_t data_size; 477f64122c1SDave Airlie uint16_t length; 478f64122c1SDave Airlie uint16_t flags; 479f64122c1SDave Airlie struct qxl_data_chunk chunk; 480f64122c1SDave Airlie }; 481f64122c1SDave Airlie 482f64122c1SDave Airlie struct qxl_copy_bits { 483f64122c1SDave Airlie struct qxl_point src_pos; 484f64122c1SDave Airlie }; 485f64122c1SDave Airlie 486f64122c1SDave Airlie enum qxl_effect_type { 487f64122c1SDave Airlie QXL_EFFECT_BLEND = 0, 488f64122c1SDave Airlie QXL_EFFECT_OPAQUE = 1, 489f64122c1SDave Airlie QXL_EFFECT_REVERT_ON_DUP = 2, 490f64122c1SDave Airlie QXL_EFFECT_BLACKNESS_ON_DUP = 3, 491f64122c1SDave Airlie QXL_EFFECT_WHITENESS_ON_DUP = 4, 492f64122c1SDave Airlie QXL_EFFECT_NOP_ON_DUP = 5, 493f64122c1SDave Airlie QXL_EFFECT_NOP = 6, 494f64122c1SDave Airlie QXL_EFFECT_OPAQUE_BRUSH = 7 495f64122c1SDave Airlie }; 496f64122c1SDave Airlie 497f64122c1SDave Airlie struct qxl_pattern { 498f64122c1SDave Airlie QXLPHYSICAL pat; 499f64122c1SDave Airlie struct qxl_point pos; 500f64122c1SDave Airlie }; 501f64122c1SDave Airlie 502f64122c1SDave Airlie struct qxl_brush { 503f64122c1SDave Airlie uint32_t type; 504f64122c1SDave Airlie union { 505f64122c1SDave Airlie uint32_t color; 506f64122c1SDave Airlie struct qxl_pattern pattern; 507f64122c1SDave Airlie } u; 508f64122c1SDave Airlie }; 509f64122c1SDave Airlie 510f64122c1SDave Airlie struct qxl_q_mask { 511f64122c1SDave Airlie uint8_t flags; 512f64122c1SDave Airlie struct qxl_point pos; 513f64122c1SDave Airlie QXLPHYSICAL bitmap; 514f64122c1SDave Airlie }; 515f64122c1SDave Airlie 516f64122c1SDave Airlie struct qxl_fill { 517f64122c1SDave Airlie struct qxl_brush brush; 518f64122c1SDave Airlie uint16_t rop_descriptor; 519f64122c1SDave Airlie struct qxl_q_mask mask; 520f64122c1SDave Airlie }; 521f64122c1SDave Airlie 522f64122c1SDave Airlie struct qxl_opaque { 523f64122c1SDave Airlie QXLPHYSICAL src_bitmap; 524f64122c1SDave Airlie struct qxl_rect src_area; 525f64122c1SDave Airlie struct qxl_brush brush; 526f64122c1SDave Airlie uint16_t rop_descriptor; 527f64122c1SDave Airlie uint8_t scale_mode; 528f64122c1SDave Airlie struct qxl_q_mask mask; 529f64122c1SDave Airlie }; 530f64122c1SDave Airlie 531f64122c1SDave Airlie struct qxl_copy { 532f64122c1SDave Airlie QXLPHYSICAL src_bitmap; 533f64122c1SDave Airlie struct qxl_rect src_area; 534f64122c1SDave Airlie uint16_t rop_descriptor; 535f64122c1SDave Airlie uint8_t scale_mode; 536f64122c1SDave Airlie struct qxl_q_mask mask; 537f64122c1SDave Airlie }; 538f64122c1SDave Airlie 539f64122c1SDave Airlie struct qxl_transparent { 540f64122c1SDave Airlie QXLPHYSICAL src_bitmap; 541f64122c1SDave Airlie struct qxl_rect src_area; 542f64122c1SDave Airlie uint32_t src_color; 543f64122c1SDave Airlie uint32_t true_color; 544f64122c1SDave Airlie }; 545f64122c1SDave Airlie 546f64122c1SDave Airlie struct qxl_alpha_blend { 547f64122c1SDave Airlie uint16_t alpha_flags; 548f64122c1SDave Airlie uint8_t alpha; 549f64122c1SDave Airlie QXLPHYSICAL src_bitmap; 550f64122c1SDave Airlie struct qxl_rect src_area; 551f64122c1SDave Airlie }; 552f64122c1SDave Airlie 553f64122c1SDave Airlie struct qxl_compat_alpha_blend { 554f64122c1SDave Airlie uint8_t alpha; 555f64122c1SDave Airlie QXLPHYSICAL src_bitmap; 556f64122c1SDave Airlie struct qxl_rect src_area; 557f64122c1SDave Airlie }; 558f64122c1SDave Airlie 559f64122c1SDave Airlie struct qxl_rop_3 { 560f64122c1SDave Airlie QXLPHYSICAL src_bitmap; 561f64122c1SDave Airlie struct qxl_rect src_area; 562f64122c1SDave Airlie struct qxl_brush brush; 563f64122c1SDave Airlie uint8_t rop3; 564f64122c1SDave Airlie uint8_t scale_mode; 565f64122c1SDave Airlie struct qxl_q_mask mask; 566f64122c1SDave Airlie }; 567f64122c1SDave Airlie 568f64122c1SDave Airlie struct qxl_line_attr { 569f64122c1SDave Airlie uint8_t flags; 570f64122c1SDave Airlie uint8_t join_style; 571f64122c1SDave Airlie uint8_t end_style; 572f64122c1SDave Airlie uint8_t style_nseg; 573f64122c1SDave Airlie QXLFIXED width; 574f64122c1SDave Airlie QXLFIXED miter_limit; 575f64122c1SDave Airlie QXLPHYSICAL style; 576f64122c1SDave Airlie }; 577f64122c1SDave Airlie 578f64122c1SDave Airlie struct qxl_stroke { 579f64122c1SDave Airlie QXLPHYSICAL path; 580f64122c1SDave Airlie struct qxl_line_attr attr; 581f64122c1SDave Airlie struct qxl_brush brush; 582f64122c1SDave Airlie uint16_t fore_mode; 583f64122c1SDave Airlie uint16_t back_mode; 584f64122c1SDave Airlie }; 585f64122c1SDave Airlie 586f64122c1SDave Airlie struct qxl_text { 587f64122c1SDave Airlie QXLPHYSICAL str; 588f64122c1SDave Airlie struct qxl_rect back_area; 589f64122c1SDave Airlie struct qxl_brush fore_brush; 590f64122c1SDave Airlie struct qxl_brush back_brush; 591f64122c1SDave Airlie uint16_t fore_mode; 592f64122c1SDave Airlie uint16_t back_mode; 593f64122c1SDave Airlie }; 594f64122c1SDave Airlie 595f64122c1SDave Airlie struct qxl_mask { 596f64122c1SDave Airlie struct qxl_q_mask mask; 597f64122c1SDave Airlie }; 598f64122c1SDave Airlie 599f64122c1SDave Airlie struct qxl_clip { 600f64122c1SDave Airlie uint32_t type; 601f64122c1SDave Airlie QXLPHYSICAL data; 602f64122c1SDave Airlie }; 603f64122c1SDave Airlie 604f64122c1SDave Airlie enum qxl_operator { 605f64122c1SDave Airlie QXL_OP_CLEAR = 0x00, 606f64122c1SDave Airlie QXL_OP_SOURCE = 0x01, 607f64122c1SDave Airlie QXL_OP_DST = 0x02, 608f64122c1SDave Airlie QXL_OP_OVER = 0x03, 609f64122c1SDave Airlie QXL_OP_OVER_REVERSE = 0x04, 610f64122c1SDave Airlie QXL_OP_IN = 0x05, 611f64122c1SDave Airlie QXL_OP_IN_REVERSE = 0x06, 612f64122c1SDave Airlie QXL_OP_OUT = 0x07, 613f64122c1SDave Airlie QXL_OP_OUT_REVERSE = 0x08, 614f64122c1SDave Airlie QXL_OP_ATOP = 0x09, 615f64122c1SDave Airlie QXL_OP_ATOP_REVERSE = 0x0a, 616f64122c1SDave Airlie QXL_OP_XOR = 0x0b, 617f64122c1SDave Airlie QXL_OP_ADD = 0x0c, 618f64122c1SDave Airlie QXL_OP_SATURATE = 0x0d, 619f64122c1SDave Airlie /* Note the jump here from 0x0d to 0x30 */ 620f64122c1SDave Airlie QXL_OP_MULTIPLY = 0x30, 621f64122c1SDave Airlie QXL_OP_SCREEN = 0x31, 622f64122c1SDave Airlie QXL_OP_OVERLAY = 0x32, 623f64122c1SDave Airlie QXL_OP_DARKEN = 0x33, 624f64122c1SDave Airlie QXL_OP_LIGHTEN = 0x34, 625f64122c1SDave Airlie QXL_OP_COLOR_DODGE = 0x35, 626f64122c1SDave Airlie QXL_OP_COLOR_BURN = 0x36, 627f64122c1SDave Airlie QXL_OP_HARD_LIGHT = 0x37, 628f64122c1SDave Airlie QXL_OP_SOFT_LIGHT = 0x38, 629f64122c1SDave Airlie QXL_OP_DIFFERENCE = 0x39, 630f64122c1SDave Airlie QXL_OP_EXCLUSION = 0x3a, 631f64122c1SDave Airlie QXL_OP_HSL_HUE = 0x3b, 632f64122c1SDave Airlie QXL_OP_HSL_SATURATION = 0x3c, 633f64122c1SDave Airlie QXL_OP_HSL_COLOR = 0x3d, 634f64122c1SDave Airlie QXL_OP_HSL_LUMINOSITY = 0x3e 635f64122c1SDave Airlie }; 636f64122c1SDave Airlie 637f64122c1SDave Airlie struct qxl_transform { 638f64122c1SDave Airlie uint32_t t00; 639f64122c1SDave Airlie uint32_t t01; 640f64122c1SDave Airlie uint32_t t02; 641f64122c1SDave Airlie uint32_t t10; 642f64122c1SDave Airlie uint32_t t11; 643f64122c1SDave Airlie uint32_t t12; 644f64122c1SDave Airlie }; 645f64122c1SDave Airlie 646f64122c1SDave Airlie /* The flags field has the following bit fields: 647f64122c1SDave Airlie * 648f64122c1SDave Airlie * operator: [ 0 - 7 ] 649f64122c1SDave Airlie * src_filter: [ 8 - 10 ] 650f64122c1SDave Airlie * mask_filter: [ 11 - 13 ] 651f64122c1SDave Airlie * src_repeat: [ 14 - 15 ] 652f64122c1SDave Airlie * mask_repeat: [ 16 - 17 ] 653f64122c1SDave Airlie * component_alpha: [ 18 - 18 ] 654f64122c1SDave Airlie * reserved: [ 19 - 31 ] 655f64122c1SDave Airlie * 656f64122c1SDave Airlie * The repeat and filter values are those of pixman: 657f64122c1SDave Airlie * REPEAT_NONE = 0 658f64122c1SDave Airlie * REPEAT_NORMAL = 1 659f64122c1SDave Airlie * REPEAT_PAD = 2 660f64122c1SDave Airlie * REPEAT_REFLECT = 3 661f64122c1SDave Airlie * 662f64122c1SDave Airlie * The filter values are: 663f64122c1SDave Airlie * FILTER_NEAREST = 0 664f64122c1SDave Airlie * FILTER_BILINEAR = 1 665f64122c1SDave Airlie */ 666f64122c1SDave Airlie struct qxl_composite { 667f64122c1SDave Airlie uint32_t flags; 668f64122c1SDave Airlie 669f64122c1SDave Airlie QXLPHYSICAL src; 670f64122c1SDave Airlie QXLPHYSICAL src_transform; /* May be NULL */ 671f64122c1SDave Airlie QXLPHYSICAL mask; /* May be NULL */ 672f64122c1SDave Airlie QXLPHYSICAL mask_transform; /* May be NULL */ 673f64122c1SDave Airlie struct qxl_point_1_6 src_origin; 674f64122c1SDave Airlie struct qxl_point_1_6 mask_origin; 675f64122c1SDave Airlie }; 676f64122c1SDave Airlie 677f64122c1SDave Airlie struct qxl_compat_drawable { 678f64122c1SDave Airlie union qxl_release_info release_info; 679f64122c1SDave Airlie uint8_t effect; 680f64122c1SDave Airlie uint8_t type; 681f64122c1SDave Airlie uint16_t bitmap_offset; 682f64122c1SDave Airlie struct qxl_rect bitmap_area; 683f64122c1SDave Airlie struct qxl_rect bbox; 684f64122c1SDave Airlie struct qxl_clip clip; 685f64122c1SDave Airlie uint32_t mm_time; 686f64122c1SDave Airlie union { 687f64122c1SDave Airlie struct qxl_fill fill; 688f64122c1SDave Airlie struct qxl_opaque opaque; 689f64122c1SDave Airlie struct qxl_copy copy; 690f64122c1SDave Airlie struct qxl_transparent transparent; 691f64122c1SDave Airlie struct qxl_compat_alpha_blend alpha_blend; 692f64122c1SDave Airlie struct qxl_copy_bits copy_bits; 693f64122c1SDave Airlie struct qxl_copy blend; 694f64122c1SDave Airlie struct qxl_rop_3 rop3; 695f64122c1SDave Airlie struct qxl_stroke stroke; 696f64122c1SDave Airlie struct qxl_text text; 697f64122c1SDave Airlie struct qxl_mask blackness; 698f64122c1SDave Airlie struct qxl_mask invers; 699f64122c1SDave Airlie struct qxl_mask whiteness; 700f64122c1SDave Airlie } u; 701f64122c1SDave Airlie }; 702f64122c1SDave Airlie 703f64122c1SDave Airlie struct qxl_drawable { 704f64122c1SDave Airlie union qxl_release_info release_info; 705f64122c1SDave Airlie uint32_t surface_id; 706f64122c1SDave Airlie uint8_t effect; 707f64122c1SDave Airlie uint8_t type; 708f64122c1SDave Airlie uint8_t self_bitmap; 709f64122c1SDave Airlie struct qxl_rect self_bitmap_area; 710f64122c1SDave Airlie struct qxl_rect bbox; 711f64122c1SDave Airlie struct qxl_clip clip; 712f64122c1SDave Airlie uint32_t mm_time; 713f64122c1SDave Airlie int32_t surfaces_dest[3]; 714f64122c1SDave Airlie struct qxl_rect surfaces_rects[3]; 715f64122c1SDave Airlie union { 716f64122c1SDave Airlie struct qxl_fill fill; 717f64122c1SDave Airlie struct qxl_opaque opaque; 718f64122c1SDave Airlie struct qxl_copy copy; 719f64122c1SDave Airlie struct qxl_transparent transparent; 720f64122c1SDave Airlie struct qxl_alpha_blend alpha_blend; 721f64122c1SDave Airlie struct qxl_copy_bits copy_bits; 722f64122c1SDave Airlie struct qxl_copy blend; 723f64122c1SDave Airlie struct qxl_rop_3 rop3; 724f64122c1SDave Airlie struct qxl_stroke stroke; 725f64122c1SDave Airlie struct qxl_text text; 726f64122c1SDave Airlie struct qxl_mask blackness; 727f64122c1SDave Airlie struct qxl_mask invers; 728f64122c1SDave Airlie struct qxl_mask whiteness; 729f64122c1SDave Airlie struct qxl_composite composite; 730f64122c1SDave Airlie } u; 731f64122c1SDave Airlie }; 732f64122c1SDave Airlie 733f64122c1SDave Airlie enum qxl_surface_cmd_type { 734f64122c1SDave Airlie QXL_SURFACE_CMD_CREATE, 735f64122c1SDave Airlie QXL_SURFACE_CMD_DESTROY, 736f64122c1SDave Airlie }; 737f64122c1SDave Airlie 738f64122c1SDave Airlie struct qxl_surface { 739f64122c1SDave Airlie uint32_t format; 740f64122c1SDave Airlie uint32_t width; 741f64122c1SDave Airlie uint32_t height; 742f64122c1SDave Airlie int32_t stride; 743f64122c1SDave Airlie QXLPHYSICAL data; 744f64122c1SDave Airlie }; 745f64122c1SDave Airlie 746f64122c1SDave Airlie struct qxl_surface_cmd { 747f64122c1SDave Airlie union qxl_release_info release_info; 748f64122c1SDave Airlie uint32_t surface_id; 749f64122c1SDave Airlie uint8_t type; 750f64122c1SDave Airlie uint32_t flags; 751f64122c1SDave Airlie union { 752f64122c1SDave Airlie struct qxl_surface surface_create; 753f64122c1SDave Airlie } u; 754f64122c1SDave Airlie }; 755f64122c1SDave Airlie 756f64122c1SDave Airlie struct qxl_clip_rects { 757f64122c1SDave Airlie uint32_t num_rects; 758f64122c1SDave Airlie struct qxl_data_chunk chunk; 759f64122c1SDave Airlie }; 760f64122c1SDave Airlie 761f64122c1SDave Airlie enum { 762f64122c1SDave Airlie QXL_PATH_BEGIN = (1 << 0), 763f64122c1SDave Airlie QXL_PATH_END = (1 << 1), 764f64122c1SDave Airlie QXL_PATH_CLOSE = (1 << 3), 765f64122c1SDave Airlie QXL_PATH_BEZIER = (1 << 4), 766f64122c1SDave Airlie }; 767f64122c1SDave Airlie 768f64122c1SDave Airlie struct qxl_path_seg { 769f64122c1SDave Airlie uint32_t flags; 770f64122c1SDave Airlie uint32_t count; 771*d1f66f05STian Tao struct qxl_point_fix points[]; 772f64122c1SDave Airlie }; 773f64122c1SDave Airlie 774f64122c1SDave Airlie struct qxl_path { 775f64122c1SDave Airlie uint32_t data_size; 776f64122c1SDave Airlie struct qxl_data_chunk chunk; 777f64122c1SDave Airlie }; 778f64122c1SDave Airlie 779f64122c1SDave Airlie enum { 780f64122c1SDave Airlie QXL_IMAGE_GROUP_DRIVER, 781f64122c1SDave Airlie QXL_IMAGE_GROUP_DEVICE, 782f64122c1SDave Airlie QXL_IMAGE_GROUP_RED, 783f64122c1SDave Airlie QXL_IMAGE_GROUP_DRIVER_DONT_CACHE, 784f64122c1SDave Airlie }; 785f64122c1SDave Airlie 786f64122c1SDave Airlie struct qxl_image_id { 787f64122c1SDave Airlie uint32_t group; 788f64122c1SDave Airlie uint32_t unique; 789f64122c1SDave Airlie }; 790f64122c1SDave Airlie 791f64122c1SDave Airlie union qxl_image_id_union { 792f64122c1SDave Airlie struct qxl_image_id id; 793f64122c1SDave Airlie uint64_t value; 794f64122c1SDave Airlie }; 795f64122c1SDave Airlie 796f64122c1SDave Airlie enum qxl_image_flags { 797f64122c1SDave Airlie QXL_IMAGE_CACHE = (1 << 0), 798f64122c1SDave Airlie QXL_IMAGE_HIGH_BITS_SET = (1 << 1), 799f64122c1SDave Airlie }; 800f64122c1SDave Airlie 801f64122c1SDave Airlie enum qxl_bitmap_flags { 802f64122c1SDave Airlie QXL_BITMAP_DIRECT = (1 << 0), 803f64122c1SDave Airlie QXL_BITMAP_UNSTABLE = (1 << 1), 804f64122c1SDave Airlie QXL_BITMAP_TOP_DOWN = (1 << 2), /* == SPICE_BITMAP_FLAGS_TOP_DOWN */ 805f64122c1SDave Airlie }; 806f64122c1SDave Airlie 807f64122c1SDave Airlie #define QXL_SET_IMAGE_ID(image, _group, _unique) { \ 808f64122c1SDave Airlie (image)->descriptor.id = (((uint64_t)_unique) << 32) | _group; \ 809f64122c1SDave Airlie } 810f64122c1SDave Airlie 811f64122c1SDave Airlie struct qxl_image_descriptor { 812f64122c1SDave Airlie uint64_t id; 813f64122c1SDave Airlie uint8_t type; 814f64122c1SDave Airlie uint8_t flags; 815f64122c1SDave Airlie uint32_t width; 816f64122c1SDave Airlie uint32_t height; 817f64122c1SDave Airlie }; 818f64122c1SDave Airlie 819f64122c1SDave Airlie struct qxl_palette { 820f64122c1SDave Airlie uint64_t unique; 821f64122c1SDave Airlie uint16_t num_ents; 822*d1f66f05STian Tao uint32_t ents[]; 823f64122c1SDave Airlie }; 824f64122c1SDave Airlie 825f64122c1SDave Airlie struct qxl_bitmap { 826f64122c1SDave Airlie uint8_t format; 827f64122c1SDave Airlie uint8_t flags; 828f64122c1SDave Airlie uint32_t x; 829f64122c1SDave Airlie uint32_t y; 830f64122c1SDave Airlie uint32_t stride; 831f64122c1SDave Airlie QXLPHYSICAL palette; 832f64122c1SDave Airlie QXLPHYSICAL data; /* data[0] ? */ 833f64122c1SDave Airlie }; 834f64122c1SDave Airlie 835f64122c1SDave Airlie struct qxl_surface_id { 836f64122c1SDave Airlie uint32_t surface_id; 837f64122c1SDave Airlie }; 838f64122c1SDave Airlie 839f64122c1SDave Airlie struct qxl_encoder_data { 840f64122c1SDave Airlie uint32_t data_size; 841*d1f66f05STian Tao uint8_t data[]; 842f64122c1SDave Airlie }; 843f64122c1SDave Airlie 844f64122c1SDave Airlie struct qxl_image { 845f64122c1SDave Airlie struct qxl_image_descriptor descriptor; 846f64122c1SDave Airlie union { /* variable length */ 847f64122c1SDave Airlie struct qxl_bitmap bitmap; 848f64122c1SDave Airlie struct qxl_encoder_data quic; 849f64122c1SDave Airlie struct qxl_surface_id surface_image; 850f64122c1SDave Airlie } u; 851f64122c1SDave Airlie }; 852f64122c1SDave Airlie 853f64122c1SDave Airlie /* A QXLHead is a single monitor output backed by a QXLSurface. 854f64122c1SDave Airlie * x and y offsets are unsigned since they are used in relation to 855f64122c1SDave Airlie * the given surface, not the same as the x, y coordinates in the guest 856f64122c1SDave Airlie * screen reference frame. */ 857f64122c1SDave Airlie struct qxl_head { 858f64122c1SDave Airlie uint32_t id; 859f64122c1SDave Airlie uint32_t surface_id; 860f64122c1SDave Airlie uint32_t width; 861f64122c1SDave Airlie uint32_t height; 862f64122c1SDave Airlie uint32_t x; 863f64122c1SDave Airlie uint32_t y; 864f64122c1SDave Airlie uint32_t flags; 865f64122c1SDave Airlie }; 866f64122c1SDave Airlie 867f64122c1SDave Airlie struct qxl_monitors_config { 868f64122c1SDave Airlie uint16_t count; 869f64122c1SDave Airlie uint16_t max_allowed; /* If it is 0 no fixed limit is given by the 870f64122c1SDave Airlie driver */ 871*d1f66f05STian Tao struct qxl_head heads[]; 872f64122c1SDave Airlie }; 873f64122c1SDave Airlie 874f64122c1SDave Airlie #pragma pack(pop) 875f64122c1SDave Airlie 876f64122c1SDave Airlie #endif /* _H_QXL_DEV */ 877