Mesa (master): xorg-vmwgfx: Add vmwctrl proto

Jakob Bornecrantz wallbraker at kemper.freedesktop.org
Mon May 24 15:31:40 UTC 2010


Module: Mesa
Branch: master
Commit: 734522aceeb5120de28a081d997ef705d9137d73
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=734522aceeb5120de28a081d997ef705d9137d73

Author: Jakob Bornecrantz <jakob at vmware.com>
Date:   Thu Apr 22 21:21:24 2010 +0100

xorg-vmwgfx: Add vmwctrl proto

---

 src/gallium/targets/xorg-vmwgfx/Makefile          |    1 +
 src/gallium/targets/xorg-vmwgfx/SConscript        |    1 +
 src/gallium/targets/xorg-vmwgfx/vmw_ctrl.c        |  526 +++++++++++++++++++++
 src/gallium/targets/xorg-vmwgfx/vmw_ctrl.h        |   48 ++
 src/gallium/targets/xorg-vmwgfx/vmw_driver.h      |   16 +
 src/gallium/targets/xorg-vmwgfx/vmw_ioctl.c       |   18 +
 src/gallium/targets/xorg-vmwgfx/vmw_screen.c      |    2 +
 src/gallium/targets/xorg-vmwgfx/vmwarectrlproto.h |  122 +++++
 src/gallium/winsys/svga/drm/vmwgfx_drm.h          |   26 +
 9 files changed, 760 insertions(+), 0 deletions(-)

diff --git a/src/gallium/targets/xorg-vmwgfx/Makefile b/src/gallium/targets/xorg-vmwgfx/Makefile
index e334d88..01a10b6 100644
--- a/src/gallium/targets/xorg-vmwgfx/Makefile
+++ b/src/gallium/targets/xorg-vmwgfx/Makefile
@@ -7,6 +7,7 @@ CFILES = \
 	vmw_xorg.c \
 	vmw_video.c \
 	vmw_ioctl.c \
+	vmw_ctrl.c \
 	vmw_screen.c
 
 OBJECTS = $(patsubst %.c,%.o,$(CFILES))
diff --git a/src/gallium/targets/xorg-vmwgfx/SConscript b/src/gallium/targets/xorg-vmwgfx/SConscript
index d5edbeb..43b2c74 100644
--- a/src/gallium/targets/xorg-vmwgfx/SConscript
+++ b/src/gallium/targets/xorg-vmwgfx/SConscript
@@ -48,6 +48,7 @@ if env['platform'] == 'linux':
 
 	sources = [
 		'vmw_ioctl.c',
+		'vmw_ctrl.c',
 		'vmw_screen.c',
 		'vmw_video.c',
 		'vmw_xorg.c',
diff --git a/src/gallium/targets/xorg-vmwgfx/vmw_ctrl.c b/src/gallium/targets/xorg-vmwgfx/vmw_ctrl.c
new file mode 100644
index 0000000..1cc8dda
--- /dev/null
+++ b/src/gallium/targets/xorg-vmwgfx/vmw_ctrl.c
@@ -0,0 +1,526 @@
+/*
+ * Copyright 2006 by VMware, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of the copyright holder(s)
+ * and author(s) shall not be used in advertising or otherwise to promote
+ * the sale, use or other dealings in this Software without prior written
+ * authorization from the copyright holder(s) and author(s).
+ */
+
+/*
+ * vmwarectrl.c --
+ *
+ *      The implementation of the VMWARE_CTRL protocol extension that
+ *      allows X clients to communicate with the driver.
+ */
+
+
+#define NEED_REPLIES
+#define NEED_EVENTS
+#include "dixstruct.h"
+#include "extnsionst.h"
+#include <X11/X.h>
+#include <X11/extensions/panoramiXproto.h>
+
+#include "vmw_driver.h"
+#include "vmwarectrlproto.h"
+
+#include "xf86drm.h"
+
+
+/*
+ *----------------------------------------------------------------------------
+ *
+ * VMwareCtrlQueryVersion --
+ *
+ *      Implementation of QueryVersion command handler. Initialises and
+ *      sends a reply.
+ *
+ * Results:
+ *      Standard response codes.
+ *
+ * Side effects:
+ *      Writes reply to client
+ *
+ *----------------------------------------------------------------------------
+ */
+
+static int
+VMwareCtrlQueryVersion(ClientPtr client)
+{
+   xVMwareCtrlQueryVersionReply rep = { 0, };
+   register int n;
+
+   REQUEST_SIZE_MATCH(xVMwareCtrlQueryVersionReq);
+
+   rep.type = X_Reply;
+   rep.length = 0;
+   rep.sequenceNumber = client->sequence;
+   rep.majorVersion = VMWARE_CTRL_MAJOR_VERSION;
+   rep.minorVersion = VMWARE_CTRL_MINOR_VERSION;
+   if (client->swapped) {
+      swaps(&rep.sequenceNumber, n);
+      swapl(&rep.length, n);
+      swapl(&rep.majorVersion, n);
+      swapl(&rep.minorVersion, n);
+   }
+   WriteToClient(client, sizeof(xVMwareCtrlQueryVersionReply), (char *)&rep);
+
+   return client->noClientException;
+}
+
+
+/*
+ *----------------------------------------------------------------------------
+ *
+ * VMwareCtrlDoSetRes --
+ *
+ *      Set the custom resolution into the mode list.
+ *
+ *      This is done by alternately updating one of two dynamic modes. It is
+ *      done this way because the server gets upset if you try to switch
+ *      to a new resolution that has the same index as the current one.
+ *
+ * Results:
+ *      TRUE on success, FALSE otherwise.
+ *
+ * Side effects:
+ *      One dynamic mode will be updated if successful.
+ *
+ *----------------------------------------------------------------------------
+ */
+
+static Bool
+VMwareCtrlDoSetRes(ScrnInfoPtr pScrn,
+                   CARD32 x,
+                   CARD32 y)
+{
+   struct vmw_customizer *vmw = vmw_customizer(xorg_customizer(pScrn));
+   struct vmw_rect rect;
+   rect.x = 0;
+   rect.y = 0;
+   rect.w = x;
+   rect.h = y;
+
+   vmw_ioctl_update_layout(vmw, 1, &rect);
+
+   return TRUE;
+}
+
+
+/*
+ *----------------------------------------------------------------------------
+ *
+ * VMwareCtrlSetRes --
+ *
+ *      Implementation of SetRes command handler. Initialises and sends a
+ *      reply.
+ *
+ * Results:
+ *      Standard response codes.
+ *
+ * Side effects:
+ *      Writes reply to client
+ *
+ *----------------------------------------------------------------------------
+ */
+
+static int
+VMwareCtrlSetRes(ClientPtr client)
+{
+   REQUEST(xVMwareCtrlSetResReq);
+   xVMwareCtrlSetResReply rep = { 0, };
+   ScrnInfoPtr pScrn;
+   ExtensionEntry *ext;
+   register int n;
+
+   REQUEST_SIZE_MATCH(xVMwareCtrlSetResReq);
+
+   if (!(ext = CheckExtension(VMWARE_CTRL_PROTOCOL_NAME))) {
+      return BadMatch;
+   }
+
+   pScrn = ext->extPrivate;
+   if (pScrn->scrnIndex != stuff->screen) {
+      return BadMatch;
+   }
+
+   if (!VMwareCtrlDoSetRes(pScrn, stuff->x, stuff->y)) {
+      return BadValue;
+   }
+
+   rep.type = X_Reply;
+   rep.length = (sizeof(xVMwareCtrlSetResReply) - sizeof(xGenericReply)) >> 2;
+   rep.sequenceNumber = client->sequence;
+   rep.screen = stuff->screen;
+   rep.x = stuff->x;
+   rep.y = stuff->y;
+   if (client->swapped) {
+      swaps(&rep.sequenceNumber, n);
+      swapl(&rep.length, n);
+      swapl(&rep.screen, n);
+      swapl(&rep.x, n);
+      swapl(&rep.y, n);
+   }
+   WriteToClient(client, sizeof(xVMwareCtrlSetResReply), (char *)&rep);
+
+   return client->noClientException;
+}
+
+
+/*
+ *----------------------------------------------------------------------------
+ *
+ * VMwareCtrlDoSetTopology --
+ *
+ *      Set the custom topology and set a dynamic mode to the bounding box
+ *      of the passed topology. If a topology is already pending, then do
+ *      nothing but do not return failure.
+ *
+ * Results:
+ *      TRUE on success, FALSE otherwise.
+ *
+ * Side effects:
+ *      One dynamic mode and the pending xinerama state will be updated if
+ *      successful.
+ *
+ *----------------------------------------------------------------------------
+ */
+
+static Bool
+VMwareCtrlDoSetTopology(ScrnInfoPtr pScrn,
+                        xXineramaScreenInfo *extents,
+                        unsigned long number)
+{
+   struct vmw_rect *rects;
+   struct vmw_customizer *vmw = vmw_customizer(xorg_customizer(pScrn));
+   int i;
+
+   rects = xcalloc(number, sizeof(*rects));
+   if (!rects)
+      return FALSE;
+
+   for (i = 0; i < number; i++) {
+      rects[i].x = extents[i].x_org;
+      rects[i].y = extents[i].y_org;
+      rects[i].w = extents[i].width;
+      rects[i].h = extents[i].height;
+   }
+
+   vmw_ioctl_update_layout(vmw, number, rects);
+
+   xfree(rects);
+   return TRUE;
+}
+
+
+/*
+ *----------------------------------------------------------------------------
+ *
+ * VMwareCtrlSetTopology --
+ *
+ *      Implementation of SetTopology command handler. Initialises and sends a
+ *      reply.
+ *
+ * Results:
+ *      Standard response codes.
+ *
+ * Side effects:
+ *      Writes reply to client
+ *
+ *----------------------------------------------------------------------------
+ */
+
+static int
+VMwareCtrlSetTopology(ClientPtr client)
+{
+   REQUEST(xVMwareCtrlSetTopologyReq);
+   xVMwareCtrlSetTopologyReply rep = { 0, };
+   ScrnInfoPtr pScrn;
+   ExtensionEntry *ext;
+   register int n;
+   xXineramaScreenInfo *extents;
+
+   REQUEST_AT_LEAST_SIZE(xVMwareCtrlSetTopologyReq);
+
+   if (!(ext = CheckExtension(VMWARE_CTRL_PROTOCOL_NAME))) {
+      return BadMatch;
+   }
+
+   pScrn = ext->extPrivate;
+   if (pScrn->scrnIndex != stuff->screen) {
+      return BadMatch;
+   }
+
+   extents = (xXineramaScreenInfo *)(stuff + 1);
+   if (!VMwareCtrlDoSetTopology(pScrn, extents, stuff->number)) {
+      return BadValue;
+   }
+
+   rep.type = X_Reply;
+   rep.length = (sizeof(xVMwareCtrlSetTopologyReply) - sizeof(xGenericReply)) >> 2;
+   rep.sequenceNumber = client->sequence;
+   rep.screen = stuff->screen;
+   if (client->swapped) {
+      swaps(&rep.sequenceNumber, n);
+      swapl(&rep.length, n);
+      swapl(&rep.screen, n);
+   }
+   WriteToClient(client, sizeof(xVMwareCtrlSetTopologyReply), (char *)&rep);
+
+   return client->noClientException;
+}
+
+
+/*
+ *----------------------------------------------------------------------------
+ *
+ * VMwareCtrlDispatch --
+ *
+ *      Dispatcher for VMWARE_CTRL commands. Calls the correct handler for
+ *      each command type.
+ *
+ * Results:
+ *      Standard response codes.
+ *
+ * Side effects:
+ *      Side effects of individual command handlers.
+ *
+ *----------------------------------------------------------------------------
+ */
+
+static int
+VMwareCtrlDispatch(ClientPtr client)
+{
+   REQUEST(xReq);
+
+   switch(stuff->data) {
+   case X_VMwareCtrlQueryVersion:
+      return VMwareCtrlQueryVersion(client);
+   case X_VMwareCtrlSetRes:
+      return VMwareCtrlSetRes(client);
+   case X_VMwareCtrlSetTopology:
+      return VMwareCtrlSetTopology(client);
+   }
+   return BadRequest;
+}
+
+
+/*
+ *----------------------------------------------------------------------------
+ *
+ * SVMwareCtrlQueryVersion --
+ *
+ *      Wrapper for QueryVersion handler that handles input from other-endian
+ *      clients.
+ *
+ * Results:
+ *      Standard response codes.
+ *
+ * Side effects:
+ *      Side effects of unswapped implementation.
+ *
+ *----------------------------------------------------------------------------
+ */
+
+static int
+SVMwareCtrlQueryVersion(ClientPtr client)
+{
+   register int n;
+
+   REQUEST(xVMwareCtrlQueryVersionReq);
+   REQUEST_SIZE_MATCH(xVMwareCtrlQueryVersionReq);
+
+   swaps(&stuff->length, n);
+
+   return VMwareCtrlQueryVersion(client);
+}
+
+
+/*
+ *----------------------------------------------------------------------------
+ *
+ * SVMwareCtrlSetRes --
+ *
+ *      Wrapper for SetRes handler that handles input from other-endian
+ *      clients.
+ *
+ * Results:
+ *      Standard response codes.
+ *
+ * Side effects:
+ *      Side effects of unswapped implementation.
+ *
+ *----------------------------------------------------------------------------
+ */
+
+static int
+SVMwareCtrlSetRes(ClientPtr client)
+{
+   register int n;
+
+   REQUEST(xVMwareCtrlSetResReq);
+   REQUEST_SIZE_MATCH(xVMwareCtrlSetResReq);
+
+   swaps(&stuff->length, n);
+   swapl(&stuff->screen, n);
+   swapl(&stuff->x, n);
+   swapl(&stuff->y, n);
+
+   return VMwareCtrlSetRes(client);
+}
+
+
+/*
+ *----------------------------------------------------------------------------
+ *
+ * SVMwareCtrlSetTopology --
+ *
+ *      Wrapper for SetTopology handler that handles input from other-endian
+ *      clients.
+ *
+ * Results:
+ *      Standard response codes.
+ *
+ * Side effects:
+ *      Side effects of unswapped implementation.
+ *
+ *----------------------------------------------------------------------------
+ */
+
+static int
+SVMwareCtrlSetTopology(ClientPtr client)
+{
+   register int n;
+
+   REQUEST(xVMwareCtrlSetTopologyReq);
+   REQUEST_SIZE_MATCH(xVMwareCtrlSetTopologyReq);
+
+   swaps(&stuff->length, n);
+   swapl(&stuff->screen, n);
+   swapl(&stuff->number, n);
+   /* Each extent is a struct of shorts. */
+   SwapRestS(stuff);
+
+   return VMwareCtrlSetTopology(client);
+}
+
+
+/*
+ *----------------------------------------------------------------------------
+ *
+ * SVMwareCtrlDispatch --
+ *
+ *      Wrapper for dispatcher that handles input from other-endian clients.
+ *
+ * Results:
+ *      Standard response codes.
+ *
+ * Side effects:
+ *      Side effects of individual command handlers.
+ *
+ *----------------------------------------------------------------------------
+ */
+
+static int
+SVMwareCtrlDispatch(ClientPtr client)
+{
+   REQUEST(xReq);
+
+   switch(stuff->data) {
+   case X_VMwareCtrlQueryVersion:
+      return SVMwareCtrlQueryVersion(client);
+   case X_VMwareCtrlSetRes:
+      return SVMwareCtrlSetRes(client);
+   case X_VMwareCtrlSetTopology:
+      return SVMwareCtrlSetTopology(client);
+   }
+   return BadRequest;
+}
+
+
+/*
+ *----------------------------------------------------------------------------
+ *
+ * VMwareCtrlResetProc --
+ *
+ *      Cleanup handler called when the extension is removed.
+ *
+ * Results:
+ *      None
+ *
+ * Side effects:
+ *      None
+ *
+ *----------------------------------------------------------------------------
+ */
+
+static void
+VMwareCtrlResetProc(ExtensionEntry* extEntry)
+{
+   /* Currently, no cleanup is necessary. */
+}
+
+
+/*
+ *----------------------------------------------------------------------------
+ *
+ * VMwareCtrl_ExitInit --
+ *
+ *      Initialiser for the VMWARE_CTRL protocol extension.
+ *
+ * Results:
+ *      None.
+ *
+ * Side effects:
+ *      Protocol extension will be registered if successful.
+ *
+ *----------------------------------------------------------------------------
+ */
+
+void
+vmw_ctrl_ext_init(struct vmw_customizer *vmw)
+{
+   ExtensionEntry *myext;
+   ScrnInfoPtr pScrn = vmw->pScrn;
+
+   if (!(myext = CheckExtension(VMWARE_CTRL_PROTOCOL_NAME))) {
+      if (!(myext = AddExtension(VMWARE_CTRL_PROTOCOL_NAME, 0, 0,
+                                 VMwareCtrlDispatch,
+                                 SVMwareCtrlDispatch,
+                                 VMwareCtrlResetProc,
+                                 StandardMinorOpcode))) {
+         xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                    "Failed to add VMWARE_CTRL extension\n");
+	 return;
+      }
+
+      /*
+       * For now, only support one screen as that's all the virtual
+       * hardware supports.
+       */
+      myext->extPrivate = pScrn;
+
+      xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                 "Initialized VMWARE_CTRL extension version %d.%d\n",
+                 VMWARE_CTRL_MAJOR_VERSION, VMWARE_CTRL_MINOR_VERSION);
+   }
+}
diff --git a/src/gallium/targets/xorg-vmwgfx/vmw_ctrl.h b/src/gallium/targets/xorg-vmwgfx/vmw_ctrl.h
new file mode 100644
index 0000000..65e1cf5
--- /dev/null
+++ b/src/gallium/targets/xorg-vmwgfx/vmw_ctrl.h
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2006 by VMware, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of the copyright holder(s)
+ * and author(s) shall not be used in advertising or otherwise to promote
+ * the sale, use or other dealings in this Software without prior written
+ * authorization from the copyright holder(s) and author(s).
+ */
+
+/*
+ * vmw_ctrl.h --
+ *
+ *      The definitions used by the VMWARE_CTRL protocol extension that
+ *      allows X clients to communicate with the driver.
+ */
+
+
+#ifndef _VMW_CTRL_H_
+#define _VMW_CTRL_H_
+
+#define VMWARE_CTRL_PROTOCOL_NAME "VMWARE_CTRL"
+
+#define VMWARE_CTRL_MAJOR_VERSION 0
+#define VMWARE_CTRL_MINOR_VERSION 2
+
+#define X_VMwareCtrlQueryVersion 0
+#define X_VMwareCtrlSetRes 1
+#define X_VMwareCtrlSetTopology 2
+
+#endif /* _VMW_CTRL_H_ */
diff --git a/src/gallium/targets/xorg-vmwgfx/vmw_driver.h b/src/gallium/targets/xorg-vmwgfx/vmw_driver.h
index ba754b5..d6e3620 100644
--- a/src/gallium/targets/xorg-vmwgfx/vmw_driver.h
+++ b/src/gallium/targets/xorg-vmwgfx/vmw_driver.h
@@ -40,6 +40,14 @@
 
 struct vmw_dma_buffer;
 
+struct vmw_rect
+{
+    int32_t x;
+    int32_t y;
+    uint32_t w;
+    uint32_t h;
+};
+
 struct vmw_customizer
 {
     CustomizerRec base;
@@ -59,6 +67,12 @@ vmw_customizer(CustomizerPtr cust)
     return cust ? (struct vmw_customizer *) cust : NULL;
 }
 
+/***********************************************************************
+ * vmw_ctrl.c
+ */
+
+void vmw_ctrl_ext_init(struct vmw_customizer *vmw);
+
 
 /***********************************************************************
  * vmw_video.c
@@ -99,5 +113,7 @@ int vmw_ioctl_unref_stream(struct vmw_customizer *vmw, uint32_t stream_id);
 
 int vmw_ioctl_claim_stream(struct vmw_customizer *vmw, uint32_t *out);
 
+int vmw_ioctl_update_layout(struct vmw_customizer *vmw, uint32_t num, struct vmw_rect *rects);
+
 
 #endif
diff --git a/src/gallium/targets/xorg-vmwgfx/vmw_ioctl.c b/src/gallium/targets/xorg-vmwgfx/vmw_ioctl.c
index 96ee4ff..7c799b5 100644
--- a/src/gallium/targets/xorg-vmwgfx/vmw_ioctl.c
+++ b/src/gallium/targets/xorg-vmwgfx/vmw_ioctl.c
@@ -240,3 +240,21 @@ vmw_ioctl_buffer_unmap(struct vmw_customizer *vmw, struct vmw_dma_buffer *buf)
 {
     --buf->map_count;
 }
+
+int
+vmw_ioctl_update_layout(struct vmw_customizer *vmw, uint32_t num, struct vmw_rect *rects)
+{
+    struct drm_vmw_update_layout_arg ul_arg;
+    int ret;
+
+    assert(sizeof(struct vmw_rect) == sizeof(struct drm_vmw_rect));
+
+    memset(&ul_arg, 0, sizeof(ul_arg));
+    ul_arg.num_outputs = num;
+    ul_arg.rects = (uint64_t)(uintptr_t)rects;
+
+    ret = drmCommandWriteRead(vmw->fd, DRM_VMW_UPDATE_LAYOUT,
+			      &ul_arg, sizeof(ul_arg));
+
+    return ret;
+}
diff --git a/src/gallium/targets/xorg-vmwgfx/vmw_screen.c b/src/gallium/targets/xorg-vmwgfx/vmw_screen.c
index f43f91e..5e4ef41 100644
--- a/src/gallium/targets/xorg-vmwgfx/vmw_screen.c
+++ b/src/gallium/targets/xorg-vmwgfx/vmw_screen.c
@@ -91,6 +91,8 @@ vmw_screen_init(CustomizerPtr cust, int fd)
     vmw->fd = fd;
     vmw_screen_cursor_init(vmw);
 
+    vmw_ctrl_ext_init(vmw);
+
     /* if gallium is used then we don't need to do anything more. */
     if (xorg_has_gallium(vmw->pScrn))
 	return TRUE;
diff --git a/src/gallium/targets/xorg-vmwgfx/vmwarectrlproto.h b/src/gallium/targets/xorg-vmwgfx/vmwarectrlproto.h
new file mode 100644
index 0000000..269e10b
--- /dev/null
+++ b/src/gallium/targets/xorg-vmwgfx/vmwarectrlproto.h
@@ -0,0 +1,122 @@
+/*
+ * Copyright 2006 by VMware, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of the copyright holder(s)
+ * and author(s) shall not be used in advertising or otherwise to promote
+ * the sale, use or other dealings in this Software without prior written
+ * authorization from the copyright holder(s) and author(s).
+ */
+
+/*
+ * vmwarectrlproto.h --
+ *
+ *      The description of the VMWARE_CTRL protocol extension that
+ *      allows X clients to communicate with the driver.
+ */
+
+#ifndef _VMWARE_CTRL_PROTO_H_
+#define _VMWARE_CTRL_PROTO_H_
+
+
+#include <X11/X.h>
+#include "vmw_ctrl.h"
+
+
+/*
+ * Requests and Replies
+ */
+
+/* Version 0.1 definitions. */
+
+typedef struct {
+   CARD8  reqType;           /* always X_VMwareCtrlReqCode */
+   CARD8  VMwareCtrlReqType; /* always X_VMwareCtrlQueryVersion */
+   CARD16 length B16;
+   CARD32 majorVersion B32;
+   CARD32 minorVersion B32;
+} xVMwareCtrlQueryVersionReq;
+#define sz_xVMwareCtrlQueryVersionReq 12
+
+typedef struct {
+   BYTE    type; /* X_Reply */
+   BYTE    pad1;
+   CARD16  sequenceNumber B16;
+   CARD32  length B32;
+   CARD32  majorVersion B32;
+   CARD32  minorVersion B32;
+   CARD32  pad2 B32;
+   CARD32  pad3 B32;
+   CARD32  pad4 B32;
+   CARD32  pad5 B32;
+} xVMwareCtrlQueryVersionReply;
+#define sz_xVMwareCtrlQueryVersionReply 32
+
+typedef struct {
+   CARD8  reqType;           /* always X_VMwareCtrlReqCode */
+   CARD8  VMwareCtrlReqType; /* always X_VMwareCtrlSetRes */
+   CARD16 length B16;
+   CARD32 screen B32;
+   CARD32 x B32;
+   CARD32 y B32;
+} xVMwareCtrlSetResReq;
+#define sz_xVMwareCtrlSetResReq 16
+
+typedef struct {
+   BYTE   type; /* X_Reply */
+   BYTE   pad1;
+   CARD16 sequenceNumber B16;
+   CARD32 length B32;
+   CARD32 screen B32;
+   CARD32 x B32;
+   CARD32 y B32;
+   CARD32 pad2 B32;
+   CARD32 pad3 B32;
+   CARD32 pad4 B32;
+} xVMwareCtrlSetResReply;
+#define sz_xVMwareCtrlSetResReply 32
+
+/* Version 0.2 definitions. */
+
+typedef struct {
+   CARD8  reqType;           /* always X_VMwareCtrlReqCode */
+   CARD8  VMwareCtrlReqType; /* always X_VMwareCtrlSetTopology */
+   CARD16 length B16;
+   CARD32 screen B32;
+   CARD32 number B32;
+   CARD32 pad1   B32;
+} xVMwareCtrlSetTopologyReq;
+#define sz_xVMwareCtrlSetTopologyReq 16
+
+typedef struct {
+   BYTE   type; /* X_Reply */
+   BYTE   pad1;
+   CARD16 sequenceNumber B16;
+   CARD32 length B32;
+   CARD32 screen B32;
+   CARD32 pad2   B32;
+   CARD32 pad3   B32;
+   CARD32 pad4   B32;
+   CARD32 pad5   B32;
+   CARD32 pad6   B32;
+} xVMwareCtrlSetTopologyReply;
+#define sz_xVMwareCtrlSetTopologyReply 32
+
+#endif /* _VMWARE_CTRL_PROTO_H_ */
diff --git a/src/gallium/winsys/svga/drm/vmwgfx_drm.h b/src/gallium/winsys/svga/drm/vmwgfx_drm.h
index 47914bd..fbb1a8f 100644
--- a/src/gallium/winsys/svga/drm/vmwgfx_drm.h
+++ b/src/gallium/winsys/svga/drm/vmwgfx_drm.h
@@ -50,6 +50,8 @@
 #define DRM_VMW_EXECBUF              12
 #define DRM_VMW_FIFO_DEBUG           13
 #define DRM_VMW_FENCE_WAIT           14
+/* guarded by minor version >= 2 */
+#define DRM_VMW_UPDATE_LAYOUT        15
 
 
 /*************************************************************************/
@@ -542,4 +544,28 @@ struct drm_vmw_stream_arg {
  * sure that the stream has been stopped.
  */
 
+/*************************************************************************/
+/**
+ * DRM_VMW_UPDATE_LAYOUT - Update layout
+ *
+ * Updates the prefered modes and connection status for connectors. The
+ * command conisits of one drm_vmw_update_layout_arg pointing out a array
+ * of num_outputs drm_vmw_rect's.
+ */
+
+/**
+ * struct drm_vmw_update_layout_arg
+ *
+ * @num_outputs: number of active
+ * @rects: pointer to array of drm_vmw_rect
+ *
+ * Input argument to the DRM_VMW_UPDATE_LAYOUT Ioctl.
+ */
+
+struct drm_vmw_update_layout_arg {
+	uint32_t num_outputs;
+	uint32_t pad64;
+	uint64_t rects;
+};
+
 #endif




More information about the mesa-commit mailing list