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