[Spice-devel] RFC: Render support in the protocol

Soeren Sandmann sandmann at cs.au.dk
Wed Jul 6 06:38:19 PDT 2011


RENDER is a very commonly used X extension that currently is not
supported very well in SPICE. This leads to the QXL X driver having to
read back pixels from the device, render in software, then transmit an
image. This is currently the biggest performance issue with SPICE for X.

The specification for this extension can be found here:

    http://cgit.freedesktop.org/xorg/proto/renderproto/tree/renderproto.txt

Pixman is essentially a software implementation of Render, so there
should be no issues getting the client to draw it. The issue is how to
add support to the SPICE protocol

A straightforward way to is to add a new draw command, "Composite"
containing all of the required attributes for render pictures:

           RED_DISPLAY_DRAW_COMPOSITE:

           OPERATOR     op

           ADDRESS      source_image
           POINT        src_x, src_y
           TRANSFORM    src_transform
           REPEAT       src_repeat
           FILTER       src_filter

           ADDRESS      mask_iamge
           POINT        mask_x, mask_y,
           TRANSFORM    mask_transform,
           REPEAT       mask_repeat
           FILTER       mask_filter

where:

        TRANSFORM is 6 fixpoint numbers describing an affine transform

        REPEAT is one of { NONE, NORMAL, REFLECT, PAD }

        FILTER is one of { NEAREST, BILINEAR }

This is quite a lot of data to send for each request though. There are
some way to reduce the amount of data:

- REPEAT, FILTER could be stored in the same field since they have to
  few possible values

- If transform is identity, it could be represented as a NULL address
  instead of as six numbers.

- The fields for op, source and mask could be combined

The result would be this new command:

    RED_DISPLAY_DRAW_COMPOSITE:

    UINT32_T    info
    ADDRESS     source_image
    ADDRESS     source_transform        [ may be NULL ]
    POINT16     src_origin
    ADDRESS     mask_image              [ may be NULL ]
    ADDRESS     mask_transform          [ may be NULL ]
    POINT16     mask_origin

where info is a bitfield:

    [ operator : 8
      src_filter : 2
      mask_filter : 2
      src_repeat : 2
      mask_repeat : 2
      component_alpha : 1
      padding : 15                      // must be zero
    ]

Comments appreciated.


Soren


More information about the Spice-devel mailing list