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