[Spice-devel] [protocol RFC 1/2] qxl_dev: dynamic head support on single display channel

Alon Levy alevy at redhat.com
Sun May 6 23:29:46 PDT 2012


Adds QXLHead and QXL_RAM_FLAG_QXL_HEAD.

This is meant to support multiple heads on a single device. The scheme
is especially easy to use with randr drivers:

1. Maintain a single Primary per device, hence also a single Display
channel.
2. Guest sends a QXLHead command per head, in which it specifies the
head location relative to the primary.
3. QXLHead contains an id. To delete a head you send a QXLHead command
with width=height=0

Guest is notified of the spice server and qemu supporting the command
(qemu doesn't actually need to change at all, except to set this flag)
via QEMU_RAM_FLAG_QXL_HEAD on the QXLRam on the ram bar.

spice-server will be updated to support the new command. It doesn't
actually need to do anything with it, just read it from the command ring
and send a SpiceHead command to the client.

If a client connects that supports SpiceHead command receives it, it
shall create a window for each active head id (one that has a non zero
width and non zero height). That window reflects a part of the primary
surface of the display.

If a client connects that doesn't support SpiceHead command, then it
shall see a single window of the primary surface in the worst case. This
can be fixed by adding a new interrupt to signal to the guest the
change, either via directly letting it see the guest capabilities, or
via a change to the QXLRam flags. (TODO)
---
 spice/qxl_dev.h |   12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/spice/qxl_dev.h b/spice/qxl_dev.h
index 741a1f6..97c2926 100644
--- a/spice/qxl_dev.h
+++ b/spice/qxl_dev.h
@@ -229,6 +229,10 @@ SPICE_RING_DECLARE(QXLReleaseRing, uint64_t, QXL_RELEASE_RING_SIZE);
 #define QXL_INTERRUPT_IO_CMD (1 << 2)
 #define QXL_INTERRUPT_ERROR  (1 << 3)
 
+enum {
+    QXL_RAM_FLAG_QXL_HEAD=0x01,
+};
+
 /* qxl-1 compat: append only */
 typedef struct SPICE_ATTR_PACKED QXLRam {
     uint32_t magic;
@@ -653,6 +657,14 @@ typedef struct SPICE_ATTR_PACKED QXLImage {
     };
 } QXLImage;
 
+typedef struct SPICE_ATTR_PACKED QXLHead {
+    uint32_t id;
+    uint32_t x;
+    uint32_t y;
+    uint32_t width;
+    uint32_t height;
+} QXLHead;
+
 #include <spice/end-packed.h>
 
 #endif /* _H_QXL_DEV */
-- 
1.7.10.1



More information about the Spice-devel mailing list