df08191
From 1dd898dc07dadbb2f115bbb177bb52d05bea2df3 Mon Sep 17 00:00:00 2001
cdde67c
From: Dave Airlie <airlied@redhat.com>
cdde67c
Date: Mon, 3 Aug 2009 14:09:32 +1000
df08191
Subject: [PATCH 03/15] X server: VGA arbitration.
cdde67c
cdde67c
This patch adds the VGA arb paths to the X server.
cdde67c
cdde67c
TODO:
cdde67c
test with lots more sigio mouse movement type stuff - RAC used to disable it
cdde67c
---
cdde67c
 configure.ac                           |    1 +
cdde67c
 hw/xfree86/common/Makefile.am          |    6 +-
cdde67c
 hw/xfree86/common/xf86Bus.c            |   15 +
cdde67c
 hw/xfree86/common/xf86DPMS.c           |    4 +-
cdde67c
 hw/xfree86/common/xf86Init.c           |   11 +-
cdde67c
 hw/xfree86/common/xf86PM.c             |    6 +-
df08191
 hw/xfree86/common/xf86VGAarbiter.c     | 1151 ++++++++++++++++++++++++++++++++
cdde67c
 hw/xfree86/common/xf86VGAarbiter.h     |   48 ++
cdde67c
 hw/xfree86/common/xf86VGAarbiterPriv.h |  266 ++++++++
cdde67c
 hw/xfree86/common/xf86str.h            |    4 +-
cdde67c
 hw/xfree86/dri/dri.c                   |    7 +
cdde67c
 hw/xfree86/dri2/dri2.c                 |    7 +
cdde67c
 hw/xfree86/int10/generic.c             |    2 +
cdde67c
 hw/xfree86/loader/sdksyms.sh           |    1 +
cdde67c
 include/xorg-config.h.in               |    3 +
df08191
 15 files changed, 1522 insertions(+), 10 deletions(-)
cdde67c
 create mode 100644 hw/xfree86/common/xf86VGAarbiter.c
cdde67c
 create mode 100644 hw/xfree86/common/xf86VGAarbiter.h
cdde67c
 create mode 100644 hw/xfree86/common/xf86VGAarbiterPriv.h
cdde67c
cdde67c
diff --git a/configure.ac b/configure.ac
cdde67c
index 1e3438e..a1219d6 100644
cdde67c
--- a/configure.ac
cdde67c
+++ b/configure.ac
cdde67c
@@ -1388,6 +1388,7 @@ if test "x$XORG" = xyes; then
cdde67c
 	AC_CHECK_FUNCS([pci_system_init_dev_mem])
cdde67c
 	AC_CHECK_FUNCS([pci_device_enable])
cdde67c
 	AC_CHECK_FUNCS([pci_device_is_boot_vga])
cdde67c
+	AC_CHECK_FUNCS([pci_device_vgaarb_init])
cdde67c
 	LIBS=$SAVE_LIBS
cdde67c
 	CFLAGS=$SAVE_CFLAGS
cdde67c
 	XORG_SYS_LIBS="$XORG_SYS_LIBS $PCIACCESS_LIBS $DLOPEN_LIBS $GLX_SYS_LIBS"
cdde67c
diff --git a/hw/xfree86/common/Makefile.am b/hw/xfree86/common/Makefile.am
cdde67c
index f3e201b..ad27210 100644
cdde67c
--- a/hw/xfree86/common/Makefile.am
cdde67c
+++ b/hw/xfree86/common/Makefile.am
cdde67c
@@ -35,7 +35,7 @@ AM_LDFLAGS = -r
cdde67c
 libcommon_la_SOURCES = xf86Configure.c xf86ShowOpts.c xf86Bus.c xf86Config.c \
cdde67c
                       xf86Cursor.c $(DGASOURCES) xf86DPMS.c \
cdde67c
                       xf86Events.c xf86Globals.c xf86AutoConfig.c \
cdde67c
-                      xf86Option.c xf86Init.c \
cdde67c
+                      xf86Option.c xf86Init.c xf86VGAarbiter.c \
cdde67c
                       xf86VidMode.c xf86fbman.c xf86cmap.c \
cdde67c
                       xf86Helper.c xf86PM.c xf86Xinput.c xisb.c \
cdde67c
                       xf86Mode.c xorgHelper.c \
cdde67c
@@ -52,7 +52,7 @@ sdk_HEADERS = compiler.h fourcc.h xf86.h xf86Module.h xf86Opt.h \
cdde67c
               xf86PciInfo.h xf86Priv.h xf86Privstr.h \
cdde67c
               xf86cmap.h xf86fbman.h xf86str.h xf86Xinput.h xisb.h \
cdde67c
               $(XVSDKINCS) $(XF86VMODE_SDK) xorgVersion.h \
cdde67c
-              xf86sbusBus.h
cdde67c
+              xf86sbusBus.h xf86VGAarbiter.h
cdde67c
 
cdde67c
 DISTCLEANFILES = xf86Build.h
cdde67c
 CLEANFILES = $(BUILT_SOURCES)
cdde67c
@@ -83,6 +83,8 @@ EXTRA_DIST = \
cdde67c
 	xorgVersion.h \
cdde67c
 	$(MODEDEFSOURCES) \
cdde67c
 	modeline2c.awk \
cdde67c
+	xf86VGAarbiter.h \
cdde67c
+	xf86VGAarbiterPriv.h \
cdde67c
         $(DISTKBDSOURCES)
cdde67c
 
cdde67c
 if LNXACPI
cdde67c
diff --git a/hw/xfree86/common/xf86Bus.c b/hw/xfree86/common/xf86Bus.c
cdde67c
index 01716ed..bf6a6f8 100644
cdde67c
--- a/hw/xfree86/common/xf86Bus.c
cdde67c
+++ b/hw/xfree86/common/xf86Bus.c
cdde67c
@@ -48,6 +48,7 @@
cdde67c
 #define XF86_OS_PRIVS
cdde67c
 #define NEED_OS_RAC_PROTOS
cdde67c
 #include "xf86_OSproc.h"
cdde67c
+#include "xf86VGAarbiter.h"
cdde67c
 
cdde67c
 #include "Pci.h"
cdde67c
 
cdde67c
@@ -545,11 +546,25 @@ xf86PostPreInit(void)
cdde67c
 void
cdde67c
 xf86PostScreenInit(void)
cdde67c
 {
cdde67c
+    int i;
cdde67c
+    int vga_count;
cdde67c
     if (doFramebufferMode) {
cdde67c
 	SetSIGIOForState(OPERATING);
cdde67c
 	return;
cdde67c
     }
cdde67c
 
cdde67c
+    /*
cdde67c
+     * we need to wrap the arbiter if we have more than
cdde67c
+     * one VGA card - hotplug cries.
cdde67c
+     */
cdde67c
+#ifdef HAVE_PCI_DEVICE_VGAARB_INIT
cdde67c
+    pci_device_vgaarb_get_info(NULL, &vga_count, NULL);
cdde67c
+    if (vga_count > 1 && xf86Screens) {
cdde67c
+	xf86Msg(X_INFO,"Number of VGA devices: %d: arbiter wrapping enabled\n", vga_count);
cdde67c
+        for (i = 0; i < xf86NumScreens; i++)
cdde67c
+	    xf86VGAarbiterWrapFunctions(xf86Screens[i]->pScreen);
cdde67c
+    }
cdde67c
+#endif
cdde67c
     DebugF("PostScreenInit  generation: %i\n",serverGeneration);
cdde67c
     xf86EnterServerState(OPERATING);
cdde67c
     
cdde67c
diff --git a/hw/xfree86/common/xf86DPMS.c b/hw/xfree86/common/xf86DPMS.c
cdde67c
index f78267d..22174c7 100644
cdde67c
--- a/hw/xfree86/common/xf86DPMS.c
cdde67c
+++ b/hw/xfree86/common/xf86DPMS.c
cdde67c
@@ -42,6 +42,7 @@
cdde67c
 #include <X11/extensions/dpmsconst.h>
cdde67c
 #include "dpmsproc.h"
cdde67c
 #endif
cdde67c
+#include "xf86VGAarbiter.h"
cdde67c
 
cdde67c
 
cdde67c
 #ifdef DPMSExtension
cdde67c
@@ -162,8 +163,9 @@ DPMSSet(ClientPtr client, int level)
cdde67c
     	pScrn = xf86Screens[i];
cdde67c
 	pDPMS = dixLookupPrivate(&screenInfo.screens[i]->devPrivates, DPMSKey);
cdde67c
 	if (pDPMS && pScrn->DPMSSet && pDPMS->Enabled && pScrn->vtSema) { 
cdde67c
-	    xf86EnableAccess(pScrn);
cdde67c
+	    xf86VGAarbiterLock(pScrn);
cdde67c
 	    pScrn->DPMSSet(pScrn, level, 0);
cdde67c
+	    xf86VGAarbiterUnlock(pScrn);
cdde67c
 	}
cdde67c
     }
cdde67c
     return Success;
cdde67c
diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c
cdde67c
index 44eed4d..e84da4e 100644
cdde67c
--- a/hw/xfree86/common/xf86Init.c
cdde67c
+++ b/hw/xfree86/common/xf86Init.c
cdde67c
@@ -78,6 +78,7 @@
cdde67c
 #include "picturestr.h"
cdde67c
 #endif
cdde67c
 
cdde67c
+#include "xf86VGAarbiter.h"
cdde67c
 #include "globals.h"
cdde67c
 
cdde67c
 #ifdef DPMSExtension
cdde67c
@@ -714,6 +715,8 @@ InitOutput(ScreenInfo *pScreenInfo, int argc, char **argv)
cdde67c
       return;
cdde67c
     }
cdde67c
 
cdde67c
+    xf86VGAarbiterInit();
cdde67c
+
cdde67c
     /*
cdde67c
      * Match up the screens found by the probes against those specified
cdde67c
      * in the config file.  Remove the ones that won't be used.  Sort
cdde67c
@@ -794,10 +797,12 @@ InitOutput(ScreenInfo *pScreenInfo, int argc, char **argv)
cdde67c
      */
cdde67c
 
cdde67c
     for (i = 0; i < xf86NumScreens; i++) {
cdde67c
-	xf86EnableAccess(xf86Screens[i]);
cdde67c
+	xf86VGAarbiterScrnInit(xf86Screens[i]);
cdde67c
+	xf86VGAarbiterLock(xf86Screens[i]);
cdde67c
 	if (xf86Screens[i]->PreInit &&
cdde67c
 	    xf86Screens[i]->PreInit(xf86Screens[i], 0))
cdde67c
 	    xf86Screens[i]->configured = TRUE;
cdde67c
+	xf86VGAarbiterUnlock(xf86Screens[i]);
cdde67c
     }
cdde67c
     for (i = 0; i < xf86NumScreens; i++)
cdde67c
 	if (!xf86Screens[i]->configured)
cdde67c
@@ -1010,7 +1015,7 @@ InitOutput(ScreenInfo *pScreenInfo, int argc, char **argv)
cdde67c
 #endif /* SCO325 */
cdde67c
 
cdde67c
   for (i = 0; i < xf86NumScreens; i++) {
cdde67c
-	xf86EnableAccess(xf86Screens[i]);
cdde67c
+	xf86VGAarbiterLock(xf86Screens[i]);
cdde67c
 	/*
cdde67c
 	 * Almost everything uses these defaults, and many of those that
cdde67c
 	 * don't, will wrap them.
cdde67c
@@ -1025,6 +1030,7 @@ InitOutput(ScreenInfo *pScreenInfo, int argc, char **argv)
cdde67c
 	xf86Screens[i]->DriverFunc = NULL;
cdde67c
 	xf86Screens[i]->pScreen = NULL;
cdde67c
 	scr_index = AddScreen(xf86Screens[i]->ScreenInit, argc, argv);
cdde67c
+	xf86VGAarbiterUnlock(xf86Screens[i]);
cdde67c
       if (scr_index == i) {
cdde67c
 	/*
cdde67c
 	 * Hook in our ScrnInfoRec, and initialise some other pScreen
cdde67c
@@ -1222,7 +1228,6 @@ AbortDDX(void)
cdde67c
 	       * we might not have been wrapped yet. Therefore enable
cdde67c
 	       * screen explicitely.
cdde67c
 	       */
cdde67c
-	      xf86EnableAccess(xf86Screens[i]);
cdde67c
 	      (xf86Screens[i]->LeaveVT)(i, 0);
cdde67c
 	  }
cdde67c
   }
cdde67c
diff --git a/hw/xfree86/common/xf86PM.c b/hw/xfree86/common/xf86PM.c
cdde67c
index f6138c3..fa24813 100644
cdde67c
--- a/hw/xfree86/common/xf86PM.c
cdde67c
+++ b/hw/xfree86/common/xf86PM.c
cdde67c
@@ -100,7 +100,7 @@ resume(pmEvent event, Bool undo)
cdde67c
     xf86AccessEnter();
cdde67c
     xf86EnterServerState(SETUP);
cdde67c
     for (i = 0; i < xf86NumScreens; i++) {
cdde67c
-        xf86EnableAccess(xf86Screens[i]);
cdde67c
+     //   xf86EnableAccess(xf86Screens[i]);
cdde67c
 	if (xf86Screens[i]->PMEvent)
cdde67c
 	    xf86Screens[i]->PMEvent(i,event,undo);
cdde67c
 	else {
cdde67c
@@ -110,7 +110,7 @@ resume(pmEvent event, Bool undo)
cdde67c
     }
cdde67c
     xf86EnterServerState(OPERATING);
cdde67c
     for (i = 0; i < xf86NumScreens; i++) {
cdde67c
-        xf86EnableAccess(xf86Screens[i]);
cdde67c
+        //xf86EnableAccess(xf86Screens[i]);
cdde67c
 	if (xf86Screens[i]->EnableDisableFBAccess)
cdde67c
 	    (*xf86Screens[i]->EnableDisableFBAccess) (i, TRUE);
cdde67c
     }
cdde67c
@@ -165,7 +165,7 @@ DoApmEvent(pmEvent event, Bool undo)
cdde67c
 	    if (xf86Screens[i]->PMEvent) {
cdde67c
 		if (!setup) xf86EnterServerState(SETUP);
cdde67c
 		setup = 1;
cdde67c
-		xf86EnableAccess(xf86Screens[i]);
cdde67c
+//		xf86EnableAccess(xf86Screens[i]);
cdde67c
 		xf86Screens[i]->PMEvent(i,event,undo);
cdde67c
 	    }
cdde67c
 	}
cdde67c
diff --git a/hw/xfree86/common/xf86VGAarbiter.c b/hw/xfree86/common/xf86VGAarbiter.c
cdde67c
new file mode 100644
df08191
index 0000000..13802cd
cdde67c
--- /dev/null
cdde67c
+++ b/hw/xfree86/common/xf86VGAarbiter.c
df08191
@@ -0,0 +1,1151 @@
cdde67c
+/*
cdde67c
+ * This code was stolen from RAC and adapted to control the legacy vga
cdde67c
+ * interface.
cdde67c
+ *
cdde67c
+ *
cdde67c
+ * Copyright (c) 2007 Paulo R. Zanoni, Tiago Vignatti
cdde67c
+ *
cdde67c
+ * Permission is hereby granted, free of charge, to any person
cdde67c
+ * obtaining a copy of this software and associated documentation
cdde67c
+ * files (the "Software"), to deal in the Software without
cdde67c
+ * restriction, including without limitation the rights to use,
cdde67c
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell
cdde67c
+ * copies of the Software, and to permit persons to whom the
cdde67c
+ * Software is furnished to do so, subject to the following
cdde67c
+ * conditions:
cdde67c
+ *
cdde67c
+ * The above copyright notice and this permission notice shall be
cdde67c
+ * included in all copies or substantial portions of the Software.
cdde67c
+ *
cdde67c
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
cdde67c
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
cdde67c
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
cdde67c
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
cdde67c
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
cdde67c
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
cdde67c
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
cdde67c
+ * OTHER DEALINGS IN THE SOFTWARE.
cdde67c
+ *
cdde67c
+ */
cdde67c
+
df08191
+#include "xorg-config.h"
df08191
+
cdde67c
+#include "xf86VGAarbiter.h"
cdde67c
+#include "xf86VGAarbiterPriv.h"
e8d0e4f
+#include "xf86Bus.h"
cdde67c
+#include "pciaccess.h"
cdde67c
+
cdde67c
+#ifdef DEBUG
df08191
+#error no, really, you don't want to do this
cdde67c
+#define DPRINT_S(x,y) ErrorF(x ": %i\n",y);
cdde67c
+#define DPRINT(x) ErrorF(x "\n");
cdde67c
+#else
cdde67c
+#define DPRINT_S(x,y)
cdde67c
+#define DPRINT(x)
cdde67c
+#endif
cdde67c
+
cdde67c
+#ifdef HAVE_PCI_DEVICE_VGAARB_INIT
cdde67c
+
cdde67c
+static GCFuncs VGAarbiterGCFuncs = {
cdde67c
+    VGAarbiterValidateGC, VGAarbiterChangeGC, VGAarbiterCopyGC,
cdde67c
+    VGAarbiterDestroyGC, VGAarbiterChangeClip, VGAarbiterDestroyClip,
cdde67c
+    VGAarbiterCopyClip
cdde67c
+};
cdde67c
+
cdde67c
+static GCOps VGAarbiterGCOps = {
cdde67c
+    VGAarbiterFillSpans, VGAarbiterSetSpans, VGAarbiterPutImage,
cdde67c
+    VGAarbiterCopyArea, VGAarbiterCopyPlane, VGAarbiterPolyPoint,
cdde67c
+    VGAarbiterPolylines, VGAarbiterPolySegment, VGAarbiterPolyRectangle,
cdde67c
+    VGAarbiterPolyArc, VGAarbiterFillPolygon, VGAarbiterPolyFillRect,
cdde67c
+    VGAarbiterPolyFillArc, VGAarbiterPolyText8, VGAarbiterPolyText16,
cdde67c
+    VGAarbiterImageText8, VGAarbiterImageText16, VGAarbiterImageGlyphBlt,
cdde67c
+    VGAarbiterPolyGlyphBlt, VGAarbiterPushPixels,
cdde67c
+    {NULL}      /* devPrivate */
cdde67c
+};
cdde67c
+
cdde67c
+static miPointerSpriteFuncRec VGAarbiterSpriteFuncs = {
cdde67c
+    VGAarbiterSpriteRealizeCursor, VGAarbiterSpriteUnrealizeCursor,
cdde67c
+    VGAarbiterSpriteSetCursor, VGAarbiterSpriteMoveCursor,
cdde67c
+    VGAarbiterDeviceCursorInitialize, VGAarbiterDeviceCursorCleanup
cdde67c
+};
cdde67c
+
cdde67c
+static int VGAarbiterKeyIndex;
cdde67c
+static DevPrivateKey VGAarbiterScreenKey = &VGAarbiterKeyIndex;
cdde67c
+static int VGAarbiterGCIndex;
cdde67c
+static DevPrivateKey VGAarbiterGCKey = &VGAarbiterGCIndex;
cdde67c
+
c165c81
+static int vga_no_arb = 0;
cdde67c
+void
cdde67c
+xf86VGAarbiterInit(void)
cdde67c
+{
c165c81
+    if (pci_device_vgaarb_init() != 0) {
c165c81
+	vga_no_arb = 1;
c165c81
+        Error("VGA Arbiter: cannot open vga arbiter fd. Exiting\n");
c165c81
+    }
cdde67c
+}
cdde67c
+
cdde67c
+void
cdde67c
+xf86VGAarbiterFini(void)
cdde67c
+{
cdde67c
+    pci_device_vgaarb_fini();
cdde67c
+}
cdde67c
+
cdde67c
+void
cdde67c
+xf86VGAarbiterLock(ScrnInfoPtr pScrn)
cdde67c
+{
cdde67c
+    pci_device_vgaarb_set_target(pScrn->vgaDev);
cdde67c
+    pci_device_vgaarb_lock();
cdde67c
+}
cdde67c
+
cdde67c
+void
cdde67c
+xf86VGAarbiterUnlock(ScrnInfoPtr pScrn)
cdde67c
+{
cdde67c
+    pci_device_vgaarb_unlock();
cdde67c
+}
cdde67c
+
cdde67c
+Bool xf86VGAarbiterAllowDRI(ScreenPtr pScreen)
cdde67c
+{
cdde67c
+    int vga_count;
c165c81
+    int rsrc_decodes;
cdde67c
+    ScrnInfoPtr         pScrn = xf86Screens[pScreen->myNum];
cdde67c
+
c165c81
+    if (vga_no_arb)
c165c81
+	return TRUE;
c165c81
+
cdde67c
+    pci_device_vgaarb_get_info(pScrn->vgaDev, &vga_count, &rsrc_decodes);
cdde67c
+    if (vga_count > 1) {
cdde67c
+        if (rsrc_decodes) {
cdde67c
+            return FALSE;
cdde67c
+        }
cdde67c
+    }
cdde67c
+    return TRUE;
cdde67c
+}
cdde67c
+
cdde67c
+void
cdde67c
+xf86VGAarbiterScrnInit(ScrnInfoPtr pScrn)
cdde67c
+{
cdde67c
+    struct pci_device *dev;
e8d0e4f
+    EntityPtr pEnt;
cdde67c
+
c165c81
+    if (vga_no_arb)
c165c81
+	return;
c165c81
+
e8d0e4f
+    pEnt = xf86Entities[pScrn->entityList[0]];
e8d0e4f
+    if (pEnt->bus.type != BUS_PCI)
ae50c42
+	return;
cdde67c
+
e8d0e4f
+    dev = pEnt->bus.id.pci;
cdde67c
+    pScrn->vgaDev = dev;
cdde67c
+}
cdde67c
+
cdde67c
+void
cdde67c
+xf86VGAarbiterDeviceDecodes(ScrnInfoPtr pScrn)
cdde67c
+{
c165c81
+    if (vga_no_arb)
c165c81
+	return;
cdde67c
+    pci_device_vgaarb_decodes(VGA_ARB_RSRC_LEGACY_MEM | VGA_ARB_RSRC_LEGACY_IO);
cdde67c
+}
cdde67c
+
cdde67c
+Bool
cdde67c
+xf86VGAarbiterWrapFunctions(ScreenPtr pScreen)
cdde67c
+{
cdde67c
+    ScrnInfoPtr pScrn;
cdde67c
+    VGAarbiterScreenPtr pScreenPriv;
cdde67c
+    miPointerScreenPtr PointPriv;
cdde67c
+#ifdef RENDER
cdde67c
+    PictureScreenPtr    ps = GetPictureScreenIfSet(pScreen);
cdde67c
+#endif
cdde67c
+
c165c81
+    if (vga_no_arb)
c165c81
+	return FALSE;
c165c81
+
cdde67c
+    pScrn = xf86Screens[pScreen->myNum];
cdde67c
+    PointPriv = dixLookupPrivate(&pScreen->devPrivates, miPointerScreenKey);
cdde67c
+
cdde67c
+    DPRINT_S("VGAarbiterWrapFunctions",pScreen->myNum);
cdde67c
+
cdde67c
+    if (!dixRequestPrivate(VGAarbiterGCKey, sizeof(VGAarbiterGCRec)))
cdde67c
+    	return FALSE;
cdde67c
+
cdde67c
+    if (!(pScreenPriv = xalloc(sizeof(VGAarbiterScreenRec))))
cdde67c
+    	return FALSE;
cdde67c
+
cdde67c
+    dixSetPrivate(&pScreen->devPrivates, VGAarbiterScreenKey, pScreenPriv);
cdde67c
+
cdde67c
+    WRAP_SCREEN(CloseScreen, VGAarbiterCloseScreen);
cdde67c
+    WRAP_SCREEN(SaveScreen, VGAarbiterSaveScreen);
cdde67c
+    WRAP_SCREEN(WakeupHandler, VGAarbiterWakeupHandler);
cdde67c
+    WRAP_SCREEN(BlockHandler, VGAarbiterBlockHandler);
cdde67c
+    WRAP_SCREEN(CreateGC, VGAarbiterCreateGC);
cdde67c
+    WRAP_SCREEN(GetImage, VGAarbiterGetImage);
cdde67c
+    WRAP_SCREEN(GetSpans, VGAarbiterGetSpans);
cdde67c
+    WRAP_SCREEN(SourceValidate, VGAarbiterSourceValidate);
cdde67c
+    WRAP_SCREEN(CopyWindow, VGAarbiterCopyWindow);
cdde67c
+    WRAP_SCREEN(ClearToBackground, VGAarbiterClearToBackground);
cdde67c
+    WRAP_SCREEN(CreatePixmap, VGAarbiterCreatePixmap);
cdde67c
+    WRAP_SCREEN(StoreColors, VGAarbiterStoreColors);
cdde67c
+    WRAP_SCREEN(DisplayCursor, VGAarbiterDisplayCursor);
cdde67c
+    WRAP_SCREEN(RealizeCursor, VGAarbiterRealizeCursor);
cdde67c
+    WRAP_SCREEN(UnrealizeCursor, VGAarbiterUnrealizeCursor);
cdde67c
+    WRAP_SCREEN(RecolorCursor, VGAarbiterRecolorCursor);
cdde67c
+    WRAP_SCREEN(SetCursorPosition, VGAarbiterSetCursorPosition);
cdde67c
+#ifdef RENDER
cdde67c
+    WRAP_PICT(Composite,VGAarbiterComposite);
cdde67c
+    WRAP_PICT(Glyphs,VGAarbiterGlyphs);
cdde67c
+    WRAP_PICT(CompositeRects,VGAarbiterCompositeRects);
cdde67c
+#endif
cdde67c
+    WRAP_SCREEN_INFO(AdjustFrame, VGAarbiterAdjustFrame);
cdde67c
+    WRAP_SCREEN_INFO(SwitchMode, VGAarbiterSwitchMode);
cdde67c
+    WRAP_SCREEN_INFO(EnterVT, VGAarbiterEnterVT);
cdde67c
+    WRAP_SCREEN_INFO(LeaveVT, VGAarbiterLeaveVT);
cdde67c
+    WRAP_SCREEN_INFO(FreeScreen, VGAarbiterFreeScreen);
cdde67c
+    WRAP_SPRITE;
cdde67c
+    return TRUE;
cdde67c
+}
cdde67c
+
cdde67c
+/* Screen funcs */
cdde67c
+static Bool
cdde67c
+VGAarbiterCloseScreen (int i, ScreenPtr pScreen)
cdde67c
+{
cdde67c
+    Bool val;
cdde67c
+    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
cdde67c
+    VGAarbiterScreenPtr pScreenPriv = (VGAarbiterScreenPtr)dixLookupPrivate(
cdde67c
+        &pScreen->devPrivates, VGAarbiterScreenKey);
cdde67c
+    miPointerScreenPtr PointPriv = (miPointerScreenPtr)dixLookupPrivate(
cdde67c
+        &pScreen->devPrivates, miPointerScreenKey);
cdde67c
+#ifdef RENDER
cdde67c
+    PictureScreenPtr    ps = GetPictureScreenIfSet(pScreen);
cdde67c
+#endif
cdde67c
+
cdde67c
+    DPRINT_S("VGAarbiterCloseScreen",pScreen->myNum);
cdde67c
+    UNWRAP_SCREEN(CreateGC);
cdde67c
+    UNWRAP_SCREEN(CloseScreen);
cdde67c
+    UNWRAP_SCREEN(GetImage);
cdde67c
+    UNWRAP_SCREEN(GetSpans);
cdde67c
+    UNWRAP_SCREEN(SourceValidate);
cdde67c
+    UNWRAP_SCREEN(CopyWindow);
cdde67c
+    UNWRAP_SCREEN(ClearToBackground);
cdde67c
+    UNWRAP_SCREEN(SaveScreen);
cdde67c
+    UNWRAP_SCREEN(StoreColors);
cdde67c
+    UNWRAP_SCREEN(DisplayCursor);
cdde67c
+    UNWRAP_SCREEN(RealizeCursor);
cdde67c
+    UNWRAP_SCREEN(UnrealizeCursor);
cdde67c
+    UNWRAP_SCREEN(RecolorCursor);
cdde67c
+    UNWRAP_SCREEN(SetCursorPosition);
cdde67c
+#ifdef RENDER
cdde67c
+    UNWRAP_PICT(Composite);
cdde67c
+    UNWRAP_PICT(Glyphs);
cdde67c
+    UNWRAP_PICT(CompositeRects);
cdde67c
+#endif
cdde67c
+    UNWRAP_SCREEN_INFO(AdjustFrame);
cdde67c
+    UNWRAP_SCREEN_INFO(SwitchMode);
cdde67c
+    UNWRAP_SCREEN_INFO(EnterVT);
cdde67c
+    UNWRAP_SCREEN_INFO(LeaveVT);
cdde67c
+    UNWRAP_SCREEN_INFO(FreeScreen);
cdde67c
+    UNWRAP_SPRITE;
cdde67c
+
cdde67c
+    xfree ((pointer) pScreenPriv);
cdde67c
+    xf86VGAarbiterLock(xf86Screens[i]);
cdde67c
+    val = (*pScreen->CloseScreen) (i, pScreen);
cdde67c
+    xf86VGAarbiterUnlock(xf86Screens[i]);
cdde67c
+    return val;
cdde67c
+}
cdde67c
+
cdde67c
+static void
cdde67c
+VGAarbiterBlockHandler(int i,
cdde67c
+                       pointer blockData, pointer pTimeout, pointer pReadmask)
cdde67c
+{
cdde67c
+    ScreenPtr pScreen = screenInfo.screens[i];
cdde67c
+    SCREEN_PROLOG(BlockHandler);
cdde67c
+    VGAGet();
cdde67c
+    pScreen->BlockHandler(i, blockData, pTimeout, pReadmask);
cdde67c
+    VGAPut();
cdde67c
+    SCREEN_EPILOG(BlockHandler, VGAarbiterBlockHandler);
cdde67c
+}
cdde67c
+
cdde67c
+static void
cdde67c
+VGAarbiterWakeupHandler(int i, pointer blockData, unsigned long result, pointer pReadmask)
cdde67c
+{
cdde67c
+    ScreenPtr pScreen = screenInfo.screens[i];
cdde67c
+    SCREEN_PROLOG(WakeupHandler);
cdde67c
+    VGAGet();
cdde67c
+    pScreen->WakeupHandler(i, blockData, result, pReadmask);
cdde67c
+    VGAPut();
cdde67c
+    SCREEN_EPILOG(WakeupHandler, VGAarbiterWakeupHandler);
cdde67c
+}
cdde67c
+
cdde67c
+static void
cdde67c
+VGAarbiterGetImage (
cdde67c
+    DrawablePtr pDrawable,
cdde67c
+    int sx, int sy, int w, int h,
cdde67c
+    unsigned int    format,
cdde67c
+    unsigned long   planemask,
cdde67c
+    char        *pdstLine
cdde67c
+    )
cdde67c
+{
cdde67c
+    ScreenPtr pScreen = pDrawable->pScreen;
cdde67c
+    DPRINT_S("VGAarbiterGetImage",pScreen->myNum);
cdde67c
+    SCREEN_PROLOG(GetImage);
cdde67c
+//    if (xf86Screens[pScreen->myNum]->vtSema) {
cdde67c
+    VGAGet();
cdde67c
+//    }
cdde67c
+    (*pScreen->GetImage) (pDrawable, sx, sy, w, h,
cdde67c
+              format, planemask, pdstLine);
cdde67c
+    VGAPut();
cdde67c
+    SCREEN_EPILOG (GetImage, VGAarbiterGetImage);
cdde67c
+}
cdde67c
+
cdde67c
+static void
cdde67c
+VGAarbiterGetSpans (
cdde67c
+    DrawablePtr pDrawable,
cdde67c
+    int     wMax,
cdde67c
+    DDXPointPtr ppt,
cdde67c
+    int     *pwidth,
cdde67c
+    int     nspans,
cdde67c
+    char    *pdstStart
cdde67c
+    )
cdde67c
+{
cdde67c
+    ScreenPtr       pScreen = pDrawable->pScreen;
cdde67c
+
cdde67c
+    DPRINT_S("VGAarbiterGetSpans",pScreen->myNum);
cdde67c
+    SCREEN_PROLOG (GetSpans);
cdde67c
+    VGAGet();
cdde67c
+    (*pScreen->GetSpans) (pDrawable, wMax, ppt, pwidth, nspans, pdstStart);
cdde67c
+    VGAPut();
cdde67c
+    SCREEN_EPILOG (GetSpans, VGAarbiterGetSpans);
cdde67c
+}
cdde67c
+
cdde67c
+static void
cdde67c
+VGAarbiterSourceValidate (
cdde67c
+    DrawablePtr pDrawable,
cdde67c
+    int x, int y, int width, int height )
cdde67c
+{
cdde67c
+    ScreenPtr   pScreen = pDrawable->pScreen;
cdde67c
+    DPRINT_S("VGAarbiterSourceValidate",pScreen->myNum);
cdde67c
+    SCREEN_PROLOG (SourceValidate);
cdde67c
+    VGAGet();
cdde67c
+    if (pScreen->SourceValidate)
cdde67c
+    (*pScreen->SourceValidate) (pDrawable, x, y, width, height);
cdde67c
+    VGAPut();
cdde67c
+    SCREEN_EPILOG (SourceValidate, VGAarbiterSourceValidate);
cdde67c
+}
cdde67c
+
cdde67c
+static void
cdde67c
+VGAarbiterCopyWindow(
cdde67c
+    WindowPtr pWin,
cdde67c
+    DDXPointRec ptOldOrg,
cdde67c
+    RegionPtr prgnSrc )
cdde67c
+{
cdde67c
+    ScreenPtr pScreen = pWin->drawable.pScreen;
cdde67c
+
cdde67c
+    DPRINT_S("VGAarbiterCopyWindow",pScreen->myNum);
cdde67c
+    SCREEN_PROLOG (CopyWindow);
cdde67c
+    VGAGet();
cdde67c
+    (*pScreen->CopyWindow) (pWin, ptOldOrg, prgnSrc);
cdde67c
+    VGAPut();
cdde67c
+    SCREEN_EPILOG (CopyWindow, VGAarbiterCopyWindow);
cdde67c
+}
cdde67c
+
cdde67c
+static void
cdde67c
+VGAarbiterClearToBackground (
cdde67c
+    WindowPtr pWin,
cdde67c
+    int x, int y,
cdde67c
+    int w, int h,
cdde67c
+    Bool generateExposures )
cdde67c
+{
cdde67c
+    ScreenPtr pScreen = pWin->drawable.pScreen;
cdde67c
+
cdde67c
+    DPRINT_S("VGAarbiterClearToBackground",pScreen->myNum);
cdde67c
+    SCREEN_PROLOG ( ClearToBackground);
cdde67c
+    VGAGet();
cdde67c
+    (*pScreen->ClearToBackground) (pWin, x, y, w, h, generateExposures);
cdde67c
+    VGAPut();
cdde67c
+    SCREEN_EPILOG (ClearToBackground, VGAarbiterClearToBackground);
cdde67c
+}
cdde67c
+
cdde67c
+static PixmapPtr
cdde67c
+VGAarbiterCreatePixmap(ScreenPtr pScreen, int w, int h, int depth, unsigned usage_hint)
cdde67c
+{
cdde67c
+    PixmapPtr pPix;
cdde67c
+
cdde67c
+    DPRINT_S("VGAarbiterCreatePixmap",pScreen->myNum);
cdde67c
+    SCREEN_PROLOG ( CreatePixmap);
cdde67c
+    VGAGet();
cdde67c
+    pPix = (*pScreen->CreatePixmap) (pScreen, w, h, depth, usage_hint);
cdde67c
+    VGAPut();
cdde67c
+    SCREEN_EPILOG (CreatePixmap, VGAarbiterCreatePixmap);
cdde67c
+
cdde67c
+    return pPix;
cdde67c
+}
cdde67c
+
cdde67c
+static Bool
cdde67c
+VGAarbiterSaveScreen(ScreenPtr pScreen, Bool unblank)
cdde67c
+{
cdde67c
+    Bool val;
cdde67c
+
cdde67c
+    DPRINT_S("VGAarbiterSaveScreen",pScreen->myNum);
cdde67c
+    SCREEN_PROLOG (SaveScreen);
cdde67c
+    VGAGet();
cdde67c
+    val = (*pScreen->SaveScreen) (pScreen, unblank);
cdde67c
+    VGAPut();
cdde67c
+    SCREEN_EPILOG (SaveScreen, VGAarbiterSaveScreen);
cdde67c
+
cdde67c
+    return val;
cdde67c
+}
cdde67c
+
cdde67c
+static void
cdde67c
+VGAarbiterStoreColors (
cdde67c
+    ColormapPtr        pmap,
cdde67c
+    int                ndef,
cdde67c
+    xColorItem         *pdefs)
cdde67c
+{
cdde67c
+    ScreenPtr pScreen = pmap->pScreen;
cdde67c
+
cdde67c
+    DPRINT_S("VGAarbiterStoreColors",pScreen->myNum);
cdde67c
+    SCREEN_PROLOG (StoreColors);
cdde67c
+    VGAGet();
cdde67c
+    (*pScreen->StoreColors) (pmap,ndef,pdefs);
cdde67c
+    VGAPut();
cdde67c
+    SCREEN_EPILOG ( StoreColors, VGAarbiterStoreColors);
cdde67c
+}
cdde67c
+
cdde67c
+static void
cdde67c
+VGAarbiterRecolorCursor (
cdde67c
+    DeviceIntPtr pDev,
cdde67c
+    ScreenPtr pScreen,
cdde67c
+    CursorPtr pCurs,
cdde67c
+    Bool displayed
cdde67c
+    )
cdde67c
+{
cdde67c
+    DPRINT_S("VGAarbiterRecolorCursor",pScreen->myNum);
cdde67c
+    SCREEN_PROLOG (RecolorCursor);
cdde67c
+    VGAGet();
cdde67c
+    (*pScreen->RecolorCursor) (pDev, pScreen, pCurs, displayed);
cdde67c
+    VGAPut();
cdde67c
+    SCREEN_EPILOG ( RecolorCursor, VGAarbiterRecolorCursor);
cdde67c
+}
cdde67c
+
cdde67c
+static Bool
cdde67c
+VGAarbiterRealizeCursor (
cdde67c
+    DeviceIntPtr pDev,
cdde67c
+    ScreenPtr   pScreen,
cdde67c
+    CursorPtr   pCursor
cdde67c
+    )
cdde67c
+{
cdde67c
+    Bool val;
cdde67c
+
cdde67c
+    DPRINT_S("VGAarbiterRealizeCursor",pScreen->myNum);
cdde67c
+    SCREEN_PROLOG (RealizeCursor);
cdde67c
+    VGAGet();
cdde67c
+    val = (*pScreen->RealizeCursor) (pDev, pScreen,pCursor);
cdde67c
+    VGAPut();
cdde67c
+    SCREEN_EPILOG ( RealizeCursor, VGAarbiterRealizeCursor);
cdde67c
+    return val;
cdde67c
+}
cdde67c
+
cdde67c
+static Bool
cdde67c
+VGAarbiterUnrealizeCursor (
cdde67c
+    DeviceIntPtr pDev,
cdde67c
+    ScreenPtr   pScreen,
cdde67c
+    CursorPtr   pCursor
cdde67c
+    )
cdde67c
+{
cdde67c
+    Bool val;
cdde67c
+
cdde67c
+    DPRINT_S("VGAarbiterUnrealizeCursor",pScreen->myNum);
cdde67c
+    SCREEN_PROLOG (UnrealizeCursor);
cdde67c
+    VGAGet();
cdde67c
+    val = (*pScreen->UnrealizeCursor) (pDev, pScreen, pCursor);
cdde67c
+    VGAPut();
cdde67c
+    SCREEN_EPILOG ( UnrealizeCursor, VGAarbiterUnrealizeCursor);
cdde67c
+    return val;
cdde67c
+}
cdde67c
+
cdde67c
+static Bool
cdde67c
+VGAarbiterDisplayCursor (
cdde67c
+    DeviceIntPtr pDev,
cdde67c
+    ScreenPtr   pScreen,
cdde67c
+    CursorPtr   pCursor
cdde67c
+    )
cdde67c
+{
cdde67c
+    Bool val;
cdde67c
+
cdde67c
+    DPRINT_S("VGAarbiterDisplayCursor",pScreen->myNum);
cdde67c
+    SCREEN_PROLOG (DisplayCursor);
cdde67c
+    VGAGet();
cdde67c
+    val = (*pScreen->DisplayCursor) (pDev, pScreen, pCursor);
cdde67c
+    VGAPut();
cdde67c
+    SCREEN_EPILOG ( DisplayCursor, VGAarbiterDisplayCursor);
cdde67c
+    return val;
cdde67c
+}
cdde67c
+
cdde67c
+static Bool
cdde67c
+VGAarbiterSetCursorPosition (
cdde67c
+    DeviceIntPtr pDev,
cdde67c
+    ScreenPtr   pScreen,
cdde67c
+    int x, int y,
cdde67c
+    Bool generateEvent)
cdde67c
+{
cdde67c
+    Bool val;
cdde67c
+
cdde67c
+    DPRINT_S("VGAarbiterSetCursorPosition",pScreen->myNum);
cdde67c
+    SCREEN_PROLOG (SetCursorPosition);
cdde67c
+    VGAGet();
cdde67c
+    val = (*pScreen->SetCursorPosition) (pDev, pScreen, x, y, generateEvent);
cdde67c
+    VGAPut();
cdde67c
+    SCREEN_EPILOG ( SetCursorPosition, VGAarbiterSetCursorPosition);
cdde67c
+    return val;
cdde67c
+}
cdde67c
+
cdde67c
+static void
cdde67c
+VGAarbiterAdjustFrame(int index, int x, int y, int flags)
cdde67c
+{
cdde67c
+    ScreenPtr pScreen = screenInfo.screens[index];
cdde67c
+    VGAarbiterScreenPtr pScreenPriv = (VGAarbiterScreenPtr)dixLookupPrivate(
cdde67c
+        &pScreen->devPrivates, VGAarbiterScreenKey);
cdde67c
+
cdde67c
+    DPRINT_S("VGAarbiterAdjustFrame",index);
cdde67c
+    VGAGet();
cdde67c
+    (*pScreenPriv->AdjustFrame)(index, x, y, flags);
cdde67c
+    VGAPut();
cdde67c
+}
cdde67c
+
cdde67c
+static Bool
cdde67c
+VGAarbiterSwitchMode(int index, DisplayModePtr mode, int flags)
cdde67c
+{
cdde67c
+    Bool val;
cdde67c
+    ScreenPtr pScreen = screenInfo.screens[index];
cdde67c
+    VGAarbiterScreenPtr pScreenPriv = (VGAarbiterScreenPtr)dixLookupPrivate(
cdde67c
+        &pScreen->devPrivates, VGAarbiterScreenKey);
cdde67c
+
cdde67c
+    DPRINT_S("VGAarbiterSwitchMode",index);
cdde67c
+    VGAGet();
cdde67c
+    val = (*pScreenPriv->SwitchMode)(index, mode, flags);
cdde67c
+    VGAPut();
cdde67c
+    return val;
cdde67c
+}
cdde67c
+
cdde67c
+static Bool
cdde67c
+VGAarbiterEnterVT(int index, int flags)
cdde67c
+{
cdde67c
+    Bool val;
cdde67c
+    ScreenPtr pScreen = screenInfo.screens[index];
cdde67c
+    VGAarbiterScreenPtr pScreenPriv = (VGAarbiterScreenPtr)dixLookupPrivate(
cdde67c
+        &pScreen->devPrivates, VGAarbiterScreenKey);
cdde67c
+
cdde67c
+    DPRINT_S("VGAarbiterEnterVT",index);
cdde67c
+    VGAGet();
cdde67c
+    val = (*pScreenPriv->EnterVT)(index, flags);
cdde67c
+    VGAPut();
cdde67c
+    return val;
cdde67c
+}
cdde67c
+
cdde67c
+static void
cdde67c
+VGAarbiterLeaveVT(int index, int flags)
cdde67c
+{
cdde67c
+    ScreenPtr pScreen = screenInfo.screens[index];
cdde67c
+    VGAarbiterScreenPtr pScreenPriv = (VGAarbiterScreenPtr)dixLookupPrivate(
cdde67c
+        &pScreen->devPrivates, VGAarbiterScreenKey);
cdde67c
+
cdde67c
+    DPRINT_S("VGAarbiterLeaveVT",index);
cdde67c
+
cdde67c
+    VGAGet();
cdde67c
+    (*pScreenPriv->LeaveVT)(index, flags);
cdde67c
+    VGAPut();
cdde67c
+}
cdde67c
+
cdde67c
+static void
cdde67c
+VGAarbiterFreeScreen(int index, int flags)
cdde67c
+{
cdde67c
+    ScreenPtr pScreen = screenInfo.screens[index];
cdde67c
+    VGAarbiterScreenPtr pScreenPriv = (VGAarbiterScreenPtr)dixLookupPrivate(
cdde67c
+        &pScreen->devPrivates, VGAarbiterScreenKey);
cdde67c
+
cdde67c
+    DPRINT_S("VGAarbiterFreeScreen",index);
cdde67c
+
cdde67c
+    VGAGet();
cdde67c
+    (*pScreenPriv->FreeScreen)(index, flags);
cdde67c
+    VGAPut();
cdde67c
+}
cdde67c
+
cdde67c
+static Bool
cdde67c
+VGAarbiterCreateGC(GCPtr pGC)
cdde67c
+{
cdde67c
+    ScreenPtr    pScreen = pGC->pScreen;
cdde67c
+    VGAarbiterGCPtr pGCPriv = (VGAarbiterGCPtr)dixLookupPrivate(&pGC->devPrivates, VGAarbiterGCKey);
cdde67c
+    Bool         ret;
cdde67c
+
cdde67c
+    DPRINT_S("VGAarbiterCreateGC",pScreen->myNum);
cdde67c
+    SCREEN_PROLOG(CreateGC);
cdde67c
+    VGAGet();
cdde67c
+    ret = (*pScreen->CreateGC)(pGC);
cdde67c
+    VGAPut();
cdde67c
+    GC_WRAP(pGC);
cdde67c
+    SCREEN_EPILOG(CreateGC,VGAarbiterCreateGC);
cdde67c
+
cdde67c
+    return ret;
cdde67c
+}
cdde67c
+
cdde67c
+/* GC funcs */
cdde67c
+static void
cdde67c
+VGAarbiterValidateGC(
cdde67c
+   GCPtr         pGC,
cdde67c
+   unsigned long changes,
cdde67c
+   DrawablePtr   pDraw )
cdde67c
+{
cdde67c
+    GC_UNWRAP(pGC);
cdde67c
+    DPRINT("VGAarbiterValidateGC");
cdde67c
+    (*pGC->funcs->ValidateGC)(pGC, changes, pDraw);
cdde67c
+    GC_WRAP(pGC);
cdde67c
+}
cdde67c
+
cdde67c
+
cdde67c
+static void
cdde67c
+VGAarbiterDestroyGC(GCPtr pGC)
cdde67c
+{
cdde67c
+    GC_UNWRAP (pGC);
cdde67c
+    DPRINT("VGAarbiterDestroyGC");
cdde67c
+    (*pGC->funcs->DestroyGC)(pGC);
cdde67c
+    GC_WRAP (pGC);
cdde67c
+}
cdde67c
+
cdde67c
+static void
cdde67c
+VGAarbiterChangeGC (
cdde67c
+    GCPtr       pGC,
cdde67c
+    unsigned long   mask)
cdde67c
+{
cdde67c
+    GC_UNWRAP (pGC);
cdde67c
+    DPRINT("VGAarbiterChangeGC");
cdde67c
+    (*pGC->funcs->ChangeGC) (pGC, mask);
cdde67c
+    GC_WRAP (pGC);
cdde67c
+}
cdde67c
+
cdde67c
+static void
cdde67c
+VGAarbiterCopyGC (
cdde67c
+    GCPtr       pGCSrc,
cdde67c
+    unsigned long   mask,
cdde67c
+    GCPtr       pGCDst)
cdde67c
+{
cdde67c
+    GC_UNWRAP (pGCDst);
cdde67c
+    DPRINT("VGAarbiterCopyGC");
cdde67c
+    (*pGCDst->funcs->CopyGC) (pGCSrc, mask, pGCDst);
cdde67c
+    GC_WRAP (pGCDst);
cdde67c
+}
cdde67c
+
cdde67c
+static void
cdde67c
+VGAarbiterChangeClip (
cdde67c
+    GCPtr   pGC,
cdde67c
+    int     type,
cdde67c
+    pointer pvalue,
cdde67c
+    int     nrects )
cdde67c
+{
cdde67c
+    GC_UNWRAP (pGC);
cdde67c
+    DPRINT("VGAarbiterChangeClip");
cdde67c
+    (*pGC->funcs->ChangeClip) (pGC, type, pvalue, nrects);
cdde67c
+    GC_WRAP (pGC);
cdde67c
+}
cdde67c
+
cdde67c
+static void
cdde67c
+VGAarbiterCopyClip(GCPtr pgcDst, GCPtr pgcSrc)
cdde67c
+{
cdde67c
+    GC_UNWRAP (pgcDst);
cdde67c
+    DPRINT("VGAarbiterCopyClip");
cdde67c
+    (* pgcDst->funcs->CopyClip)(pgcDst, pgcSrc);
cdde67c
+    GC_WRAP (pgcDst);
cdde67c
+}
cdde67c
+
cdde67c
+static void
cdde67c
+VGAarbiterDestroyClip(GCPtr pGC)
cdde67c
+{
cdde67c
+    GC_UNWRAP (pGC);
cdde67c
+    DPRINT("VGAarbiterDestroyClip");
cdde67c
+    (* pGC->funcs->DestroyClip)(pGC);
cdde67c
+    GC_WRAP (pGC);
cdde67c
+}
cdde67c
+
cdde67c
+/* GC Ops */
cdde67c
+static void
cdde67c
+VGAarbiterFillSpans(
cdde67c
+    DrawablePtr pDraw,
cdde67c
+    GC      *pGC,
cdde67c
+    int     nInit,
cdde67c
+    DDXPointPtr pptInit,
cdde67c
+    int *pwidthInit,
cdde67c
+    int fSorted )
cdde67c
+{
cdde67c
+    GC_UNWRAP(pGC);
cdde67c
+    DPRINT("VGAarbiterFillSpans");
cdde67c
+    VGAGet_GC();
cdde67c
+    (*pGC->ops->FillSpans)(pDraw, pGC, nInit, pptInit, pwidthInit, fSorted);
cdde67c
+    VGAPut_GC();
cdde67c
+    GC_WRAP(pGC);
cdde67c
+}
cdde67c
+
cdde67c
+static void
cdde67c
+VGAarbiterSetSpans(
cdde67c
+    DrawablePtr     pDraw,
cdde67c
+    GCPtr       pGC,
cdde67c
+    char        *pcharsrc,
cdde67c
+    register DDXPointPtr ppt,
cdde67c
+    int         *pwidth,
cdde67c
+    int         nspans,
cdde67c
+    int         fSorted )
cdde67c
+{
cdde67c
+    GC_UNWRAP(pGC);
cdde67c
+    DPRINT("VGAarbiterSetSpans");
cdde67c
+    VGAGet_GC();
cdde67c
+    (*pGC->ops->SetSpans)(pDraw, pGC, pcharsrc, ppt, pwidth, nspans, fSorted);
cdde67c
+    VGAPut_GC();
cdde67c
+    GC_WRAP(pGC);
cdde67c
+}
cdde67c
+
cdde67c
+static void
cdde67c
+VGAarbiterPutImage(
cdde67c
+    DrawablePtr pDraw,
cdde67c
+    GCPtr   pGC,
cdde67c
+    int     depth,
cdde67c
+    int x, int y, int w, int h,
cdde67c
+    int     leftPad,
cdde67c
+    int     format,
cdde67c
+    char    *pImage )
cdde67c
+{
cdde67c
+    GC_UNWRAP(pGC);
cdde67c
+    DPRINT("VGAarbiterPutImage");
cdde67c
+    VGAGet_GC();
cdde67c
+    (*pGC->ops->PutImage)(pDraw, pGC, depth, x, y, w, h,
cdde67c
+              leftPad, format, pImage);
cdde67c
+    VGAPut_GC();
cdde67c
+    GC_WRAP(pGC);
cdde67c
+}
cdde67c
+
cdde67c
+static RegionPtr
cdde67c
+VGAarbiterCopyArea(
cdde67c
+    DrawablePtr pSrc,
cdde67c
+    DrawablePtr pDst,
cdde67c
+    GC *pGC,
cdde67c
+    int srcx, int srcy,
cdde67c
+    int width, int height,
cdde67c
+    int dstx, int dsty )
cdde67c
+{
cdde67c
+    RegionPtr ret;
cdde67c
+
cdde67c
+    GC_UNWRAP(pGC);
cdde67c
+    DPRINT("VGAarbiterCopyArea");
cdde67c
+    VGAGet_GC();
cdde67c
+    ret = (*pGC->ops->CopyArea)(pSrc, pDst,
cdde67c
+                pGC, srcx, srcy, width, height, dstx, dsty);
cdde67c
+    VGAPut_GC();
cdde67c
+    GC_WRAP(pGC);
cdde67c
+    return ret;
cdde67c
+}
cdde67c
+
cdde67c
+static RegionPtr
cdde67c
+VGAarbiterCopyPlane(
cdde67c
+    DrawablePtr pSrc,
cdde67c
+    DrawablePtr pDst,
cdde67c
+    GCPtr pGC,
cdde67c
+    int srcx, int srcy,
cdde67c
+    int width, int height,
cdde67c
+    int dstx, int dsty,
cdde67c
+    unsigned long bitPlane )
cdde67c
+{
cdde67c
+    RegionPtr ret;
cdde67c
+
cdde67c
+    GC_UNWRAP(pGC);
cdde67c
+    DPRINT("VGAarbiterCopyPlane");
cdde67c
+    VGAGet_GC();
cdde67c
+    ret = (*pGC->ops->CopyPlane)(pSrc, pDst, pGC, srcx, srcy,
cdde67c
+                 width, height, dstx, dsty, bitPlane);
cdde67c
+    VGAPut_GC();
cdde67c
+    GC_WRAP(pGC);
cdde67c
+    return ret;
cdde67c
+}
cdde67c
+
cdde67c
+static void
cdde67c
+VGAarbiterPolyPoint(
cdde67c
+    DrawablePtr pDraw,
cdde67c
+    GCPtr pGC,
cdde67c
+    int mode,
cdde67c
+    int npt,
cdde67c
+    xPoint *pptInit )
cdde67c
+{
cdde67c
+    GC_UNWRAP(pGC);
cdde67c
+    DPRINT("VGAarbiterPolyPoint");
cdde67c
+    VGAGet_GC();
cdde67c
+    (*pGC->ops->PolyPoint)(pDraw, pGC, mode, npt, pptInit);
cdde67c
+    VGAPut_GC();
cdde67c
+    GC_WRAP(pGC);
cdde67c
+}
cdde67c
+
cdde67c
+
cdde67c
+static void
cdde67c
+VGAarbiterPolylines(
cdde67c
+    DrawablePtr pDraw,
cdde67c
+    GCPtr   pGC,
cdde67c
+    int     mode,
cdde67c
+    int     npt,
cdde67c
+    DDXPointPtr pptInit )
cdde67c
+{
cdde67c
+    GC_UNWRAP(pGC);
cdde67c
+    DPRINT("VGAarbiterPolylines");
cdde67c
+    VGAGet_GC();
cdde67c
+    (*pGC->ops->Polylines)(pDraw, pGC, mode, npt, pptInit);
cdde67c
+    VGAPut_GC();
cdde67c
+    GC_WRAP(pGC);
cdde67c
+}
cdde67c
+
cdde67c
+static void
cdde67c
+VGAarbiterPolySegment(
cdde67c
+    DrawablePtr pDraw,
cdde67c
+    GCPtr   pGC,
cdde67c
+    int     nseg,
cdde67c
+    xSegment    *pSeg )
cdde67c
+{
cdde67c
+    GC_UNWRAP(pGC);
cdde67c
+    DPRINT("VGAarbiterPolySegment");
cdde67c
+    VGAGet_GC();
cdde67c
+    (*pGC->ops->PolySegment)(pDraw, pGC, nseg, pSeg);
cdde67c
+    VGAPut_GC();
cdde67c
+    GC_WRAP(pGC);
cdde67c
+}
cdde67c
+
cdde67c
+static void
cdde67c
+VGAarbiterPolyRectangle(
cdde67c
+    DrawablePtr  pDraw,
cdde67c
+    GCPtr        pGC,
cdde67c
+    int          nRectsInit,
cdde67c
+    xRectangle  *pRectsInit )
cdde67c
+{
cdde67c
+    GC_UNWRAP(pGC);
cdde67c
+    DPRINT("VGAarbiterPolyRectangle");
cdde67c
+    VGAGet_GC();
cdde67c
+    (*pGC->ops->PolyRectangle)(pDraw, pGC, nRectsInit, pRectsInit);
cdde67c
+    VGAPut_GC();
cdde67c
+    GC_WRAP(pGC);
cdde67c
+}
cdde67c
+
cdde67c
+static void
cdde67c
+VGAarbiterPolyArc(
cdde67c
+    DrawablePtr pDraw,
cdde67c
+    GCPtr   pGC,
cdde67c
+    int     narcs,
cdde67c
+    xArc    *parcs )
cdde67c
+{
cdde67c
+    GC_UNWRAP(pGC);
cdde67c
+    DPRINT("VGAarbiterPolyArc");
cdde67c
+    VGAGet_GC();
cdde67c
+    (*pGC->ops->PolyArc)(pDraw, pGC, narcs, parcs);
cdde67c
+    VGAPut_GC();
cdde67c
+    GC_WRAP(pGC);
cdde67c
+}
cdde67c
+
cdde67c
+static void
cdde67c
+VGAarbiterFillPolygon(
cdde67c
+    DrawablePtr pDraw,
cdde67c
+    GCPtr   pGC,
cdde67c
+    int     shape,
cdde67c
+    int     mode,
cdde67c
+    int     count,
cdde67c
+    DDXPointPtr ptsIn )
cdde67c
+{
cdde67c
+    GC_UNWRAP(pGC);
cdde67c
+    DPRINT("VGAarbiterFillPolygon");
cdde67c
+    VGAGet_GC();
cdde67c
+    (*pGC->ops->FillPolygon)(pDraw, pGC, shape, mode, count, ptsIn);
cdde67c
+    VGAPut_GC();
cdde67c
+    GC_WRAP(pGC);
cdde67c
+}
cdde67c
+
cdde67c
+static void
cdde67c
+VGAarbiterPolyFillRect(
cdde67c
+    DrawablePtr pDraw,
cdde67c
+    GCPtr   pGC,
cdde67c
+    int     nrectFill,
cdde67c
+    xRectangle  *prectInit)
cdde67c
+{
cdde67c
+    GC_UNWRAP(pGC);
cdde67c
+    DPRINT("VGAarbiterPolyFillRect");
cdde67c
+    VGAGet_GC();
cdde67c
+    (*pGC->ops->PolyFillRect)(pDraw, pGC, nrectFill, prectInit);
cdde67c
+    VGAPut_GC();
cdde67c
+    GC_WRAP(pGC);
cdde67c
+}
cdde67c
+
cdde67c
+static void
cdde67c
+VGAarbiterPolyFillArc(
cdde67c
+    DrawablePtr pDraw,
cdde67c
+    GCPtr   pGC,
cdde67c
+    int     narcs,
cdde67c
+    xArc    *parcs )
cdde67c
+{
cdde67c
+    GC_UNWRAP(pGC);
cdde67c
+    DPRINT("VGAarbiterPolyFillArc");
cdde67c
+    VGAGet_GC();
cdde67c
+    (*pGC->ops->PolyFillArc)(pDraw, pGC, narcs, parcs);
cdde67c
+    VGAPut_GC();
cdde67c
+    GC_WRAP(pGC);
cdde67c
+}
cdde67c
+
cdde67c
+static int
cdde67c
+VGAarbiterPolyText8(
cdde67c
+    DrawablePtr pDraw,
cdde67c
+    GCPtr   pGC,
cdde67c
+    int     x,
cdde67c
+    int     y,
cdde67c
+    int     count,
cdde67c
+    char    *chars )
cdde67c
+{
cdde67c
+    int ret;
cdde67c
+
cdde67c
+    GC_UNWRAP(pGC);
cdde67c
+    DPRINT("VGAarbiterPolyText8");
cdde67c
+    VGAGet_GC();
cdde67c
+    ret = (*pGC->ops->PolyText8)(pDraw, pGC, x, y, count, chars);
cdde67c
+    VGAPut_GC();
cdde67c
+    GC_WRAP(pGC);
cdde67c
+    return ret;
cdde67c
+}
cdde67c
+
cdde67c
+static int
cdde67c
+VGAarbiterPolyText16(
cdde67c
+    DrawablePtr pDraw,
cdde67c
+    GCPtr   pGC,
cdde67c
+    int     x,
cdde67c
+    int     y,
cdde67c
+    int     count,
cdde67c
+    unsigned short *chars )
cdde67c
+{
cdde67c
+    int ret;
cdde67c
+
cdde67c
+    GC_UNWRAP(pGC);
cdde67c
+    DPRINT("VGAarbiterPolyText16");
cdde67c
+    VGAGet_GC();
cdde67c
+    ret = (*pGC->ops->PolyText16)(pDraw, pGC, x, y, count, chars);
cdde67c
+    VGAPut_GC();
cdde67c
+    GC_WRAP(pGC);
cdde67c
+    return ret;
cdde67c
+}
cdde67c
+
cdde67c
+static void
cdde67c
+VGAarbiterImageText8(
cdde67c
+    DrawablePtr pDraw,
cdde67c
+    GCPtr   pGC,
cdde67c
+    int     x,
cdde67c
+    int     y,
cdde67c
+    int     count,
cdde67c
+    char    *chars )
cdde67c
+{
cdde67c
+    GC_UNWRAP(pGC);
cdde67c
+    DPRINT("VGAarbiterImageText8");
cdde67c
+    VGAGet_GC();
cdde67c
+    (*pGC->ops->ImageText8)(pDraw, pGC, x, y, count, chars);
cdde67c
+    VGAPut_GC();
cdde67c
+    GC_WRAP(pGC);
cdde67c
+}
cdde67c
+
cdde67c
+static void
cdde67c
+VGAarbiterImageText16(
cdde67c
+    DrawablePtr pDraw,
cdde67c
+    GCPtr   pGC,
cdde67c
+    int     x,
cdde67c
+    int     y,
cdde67c
+    int     count,
cdde67c
+    unsigned short *chars )
cdde67c
+{
cdde67c
+    GC_UNWRAP(pGC);
cdde67c
+    DPRINT("VGAarbiterImageText16");
cdde67c
+    VGAGet_GC();
cdde67c
+    (*pGC->ops->ImageText16)(pDraw, pGC, x, y, count, chars);
cdde67c
+    VGAPut_GC();
cdde67c
+    GC_WRAP(pGC);
cdde67c
+}
cdde67c
+
cdde67c
+
cdde67c
+static void
cdde67c
+VGAarbiterImageGlyphBlt(
cdde67c
+    DrawablePtr pDraw,
cdde67c
+    GCPtr pGC,
cdde67c
+    int xInit, int yInit,
cdde67c
+    unsigned int nglyph,
cdde67c
+    CharInfoPtr *ppci,
cdde67c
+    pointer pglyphBase )
cdde67c
+{
cdde67c
+    GC_UNWRAP(pGC);
cdde67c
+    DPRINT("VGAarbiterImageGlyphBlt");
cdde67c
+    VGAGet_GC();
cdde67c
+    (*pGC->ops->ImageGlyphBlt)(pDraw, pGC, xInit, yInit,
cdde67c
+                   nglyph, ppci, pglyphBase);
cdde67c
+    VGAPut_GC();
cdde67c
+    GC_WRAP(pGC);
cdde67c
+}
cdde67c
+
cdde67c
+static void
cdde67c
+VGAarbiterPolyGlyphBlt(
cdde67c
+    DrawablePtr pDraw,
cdde67c
+    GCPtr pGC,
cdde67c
+    int xInit, int yInit,
cdde67c
+    unsigned int nglyph,
cdde67c
+    CharInfoPtr *ppci,
cdde67c
+    pointer pglyphBase )
cdde67c
+{
cdde67c
+    GC_UNWRAP(pGC);
cdde67c
+    DPRINT("VGAarbiterPolyGlyphBlt");
cdde67c
+    VGAGet_GC();
cdde67c
+    (*pGC->ops->PolyGlyphBlt)(pDraw, pGC, xInit, yInit,
cdde67c
+                  nglyph, ppci, pglyphBase);
cdde67c
+    VGAPut_GC();
cdde67c
+    GC_WRAP(pGC);
cdde67c
+}
cdde67c
+
cdde67c
+static void
cdde67c
+VGAarbiterPushPixels(
cdde67c
+    GCPtr   pGC,
cdde67c
+    PixmapPtr   pBitMap,
cdde67c
+    DrawablePtr pDraw,
cdde67c
+    int dx, int dy, int xOrg, int yOrg )
cdde67c
+{
cdde67c
+    GC_UNWRAP(pGC);
cdde67c
+    DPRINT("VGAarbiterPushPixels");
cdde67c
+    VGAGet_GC();
cdde67c
+    (*pGC->ops->PushPixels)(pGC, pBitMap, pDraw, dx, dy, xOrg, yOrg);
cdde67c
+    VGAPut_GC();
cdde67c
+    GC_WRAP(pGC);
cdde67c
+}
cdde67c
+
cdde67c
+
cdde67c
+/* miSpriteFuncs */
cdde67c
+static Bool
cdde67c
+VGAarbiterSpriteRealizeCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCur)
cdde67c
+{
cdde67c
+    Bool val;
cdde67c
+    SPRITE_PROLOG;
cdde67c
+    DPRINT_S("VGAarbiterSpriteRealizeCursor",pScreen->myNum);
cdde67c
+    VGAGet();
cdde67c
+    val = PointPriv->spriteFuncs->RealizeCursor(pDev, pScreen, pCur);
cdde67c
+    VGAPut();
cdde67c
+    SPRITE_EPILOG;
cdde67c
+    return val;
cdde67c
+}
cdde67c
+
cdde67c
+static Bool
cdde67c
+VGAarbiterSpriteUnrealizeCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCur)
cdde67c
+{
cdde67c
+    Bool val;
cdde67c
+    SPRITE_PROLOG;
cdde67c
+    DPRINT_S("VGAarbiterSpriteUnrealizeCursor",pScreen->myNum);
cdde67c
+    VGAGet();
cdde67c
+    val = PointPriv->spriteFuncs->UnrealizeCursor(pDev, pScreen, pCur);
cdde67c
+    VGAPut();
cdde67c
+    SPRITE_EPILOG;
cdde67c
+    return val;
cdde67c
+}
cdde67c
+
cdde67c
+static void
cdde67c
+VGAarbiterSpriteSetCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCur, int x, int y)
cdde67c
+{
cdde67c
+    SPRITE_PROLOG;
cdde67c
+    DPRINT_S("VGAarbiterSpriteSetCursor",pScreen->myNum);
cdde67c
+    VGAGet();
cdde67c
+    PointPriv->spriteFuncs->SetCursor(pDev, pScreen, pCur, x, y);
cdde67c
+    VGAPut();
cdde67c
+    SPRITE_EPILOG;
cdde67c
+}
cdde67c
+
cdde67c
+static void
cdde67c
+VGAarbiterSpriteMoveCursor(DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y)
cdde67c
+{
cdde67c
+    SPRITE_PROLOG;
cdde67c
+    DPRINT_S("VGAarbiterSpriteMoveCursor",pScreen->myNum);
cdde67c
+    VGAGet();
cdde67c
+    PointPriv->spriteFuncs->MoveCursor(pDev, pScreen, x, y);
cdde67c
+    VGAPut();
cdde67c
+    SPRITE_EPILOG;
cdde67c
+}
cdde67c
+
cdde67c
+static Bool
cdde67c
+VGAarbiterDeviceCursorInitialize(DeviceIntPtr pDev, ScreenPtr pScreen)
cdde67c
+{
cdde67c
+    Bool val;
cdde67c
+    SPRITE_PROLOG;
cdde67c
+    DPRINT_S("VGAarbiterDeviceCursorInitialize",pScreen->myNum);
cdde67c
+    VGAGet();
cdde67c
+    val = PointPriv->spriteFuncs->DeviceCursorInitialize(pDev, pScreen);
cdde67c
+    VGAPut();
cdde67c
+    SPRITE_EPILOG;
cdde67c
+    return val;
cdde67c
+}
cdde67c
+
cdde67c
+static void
cdde67c
+VGAarbiterDeviceCursorCleanup(DeviceIntPtr pDev, ScreenPtr pScreen)
cdde67c
+{
cdde67c
+    SPRITE_PROLOG;
cdde67c
+    DPRINT_S("VGAarbiterDeviceCursorCleanup",pScreen->myNum);
cdde67c
+    VGAGet();
cdde67c
+    PointPriv->spriteFuncs->DeviceCursorCleanup(pDev, pScreen);
cdde67c
+    VGAPut();
cdde67c
+    SPRITE_EPILOG;
cdde67c
+}
cdde67c
+
cdde67c
+#ifdef RENDER
cdde67c
+static void
cdde67c
+VGAarbiterComposite(CARD8 op, PicturePtr pSrc, PicturePtr pMask,
cdde67c
+         PicturePtr pDst, INT16 xSrc, INT16 ySrc, INT16 xMask,
cdde67c
+         INT16 yMask, INT16 xDst, INT16 yDst, CARD16 width,
cdde67c
+         CARD16 height)
cdde67c
+{
cdde67c
+    ScreenPtr       pScreen = pDst->pDrawable->pScreen;
cdde67c
+    PictureScreenPtr    ps = GetPictureScreen(pScreen);
cdde67c
+
cdde67c
+    PICTURE_PROLOGUE(Composite);
cdde67c
+
cdde67c
+    VGAGet();
cdde67c
+    (*ps->Composite) (op, pSrc, pMask, pDst, xSrc, ySrc, xMask, yMask, xDst,
cdde67c
+              yDst, width, height);
cdde67c
+    VGAPut();
cdde67c
+    PICTURE_EPILOGUE(Composite, VGAarbiterComposite);
cdde67c
+}
cdde67c
+
cdde67c
+static void
cdde67c
+VGAarbiterGlyphs(CARD8 op, PicturePtr pSrc, PicturePtr pDst,
cdde67c
+      PictFormatPtr maskFormat, INT16 xSrc, INT16 ySrc, int nlist,
cdde67c
+      GlyphListPtr list, GlyphPtr *glyphs)
cdde67c
+{
cdde67c
+    ScreenPtr       pScreen = pDst->pDrawable->pScreen;
cdde67c
+    PictureScreenPtr    ps = GetPictureScreen(pScreen);
cdde67c
+
cdde67c
+    PICTURE_PROLOGUE(Glyphs);
cdde67c
+
cdde67c
+    VGAGet();
cdde67c
+    (*ps->Glyphs)(op, pSrc, pDst, maskFormat, xSrc, ySrc, nlist, list, glyphs);
cdde67c
+    VGAPut();
cdde67c
+    PICTURE_EPILOGUE (Glyphs, VGAarbiterGlyphs);
cdde67c
+}
cdde67c
+
cdde67c
+static void
cdde67c
+VGAarbiterCompositeRects(CARD8 op, PicturePtr pDst, xRenderColor *color, int nRect,
cdde67c
+          xRectangle *rects)
cdde67c
+{
cdde67c
+    ScreenPtr       pScreen = pDst->pDrawable->pScreen;
cdde67c
+    PictureScreenPtr    ps = GetPictureScreen(pScreen);
cdde67c
+
cdde67c
+    PICTURE_PROLOGUE(CompositeRects);
cdde67c
+
cdde67c
+    VGAGet();
cdde67c
+    (*ps->CompositeRects)(op, pDst, color, nRect, rects);
cdde67c
+    VGAPut();
cdde67c
+    PICTURE_EPILOGUE (CompositeRects, VGAarbiterCompositeRects);
cdde67c
+}
cdde67c
+#endif
cdde67c
+#else
cdde67c
+/* dummy functions */
cdde67c
+void xf86VGAarbiterInit(void) {}
cdde67c
+void xf86VGAarbiterFini(void) {}
cdde67c
+
cdde67c
+void xf86VGAarbiterLock(ScrnInfoPtr pScrn) {}
cdde67c
+void xf86VGAarbiterUnlock(ScrnInfoPtr pScrn) {}
cdde67c
+Bool xf86VGAarbiterAllowDRI(ScreenPtr pScreen) { return TRUE; }
cdde67c
+void xf86VGAarbiterScrnInit(ScrnInfoPtr pScrn) {}
cdde67c
+void xf86VGAarbiterDeviceDecodes(ScrnInfoPtr pScrn) {}
cdde67c
+Bool xf86VGAarbiterWrapFunctions(ScreenPtr pScreen) { return FALSE; }
cdde67c
+
cdde67c
+#endif
cdde67c
diff --git a/hw/xfree86/common/xf86VGAarbiter.h b/hw/xfree86/common/xf86VGAarbiter.h
cdde67c
new file mode 100644
cdde67c
index 0000000..145d31c
cdde67c
--- /dev/null
cdde67c
+++ b/hw/xfree86/common/xf86VGAarbiter.h
cdde67c
@@ -0,0 +1,48 @@
cdde67c
+/*
cdde67c
+ * Copyright (c) 2009 Tiago Vignatti
cdde67c
+ *
cdde67c
+ * Permission is hereby granted, free of charge, to any person
cdde67c
+ * obtaining a copy of this software and associated documentation
cdde67c
+ * files (the "Software"), to deal in the Software without
cdde67c
+ * restriction, including without limitation the rights to use,
cdde67c
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell
cdde67c
+ * copies of the Software, and to permit persons to whom the
cdde67c
+ * Software is furnished to do so, subject to the following
cdde67c
+ * conditions:
cdde67c
+ *
cdde67c
+ * The above copyright notice and this permission notice shall be
cdde67c
+ * included in all copies or substantial portions of the Software.
cdde67c
+ *
cdde67c
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
cdde67c
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
cdde67c
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
cdde67c
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
cdde67c
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
cdde67c
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
cdde67c
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
cdde67c
+ * OTHER DEALINGS IN THE SOFTWARE.
cdde67c
+ */
cdde67c
+
cdde67c
+#ifndef __XF86VGAARBITER_H
cdde67c
+#define __XF86VGAARBITER_H
cdde67c
+
cdde67c
+#include "screenint.h"
cdde67c
+#include "misc.h"
cdde67c
+#include "xf86.h"
cdde67c
+
cdde67c
+/* Functions */
cdde67c
+extern void xf86VGAarbiterInit(void);
cdde67c
+extern void xf86VGAarbiterFini(void);
cdde67c
+void xf86VGAarbiterScrnInit(ScrnInfoPtr pScrn);
cdde67c
+extern Bool xf86VGAarbiterWrapFunctions(ScreenPtr pScreen);
cdde67c
+extern void xf86VGAarbiterLock(ScrnInfoPtr pScrn);
cdde67c
+extern void xf86VGAarbiterUnlock(ScrnInfoPtr pScrn);
cdde67c
+
cdde67c
+/* allow a driver to remove itself from arbiter - really should be
cdde67c
+ * done in the kernel though */
cdde67c
+extern _X_EXPORT void xf86VGAarbiterDeviceDecodes(ScrnInfoPtr pScrn);
cdde67c
+/* DRI and arbiter are really not possible together,
cdde67c
+ * you really want to remove the card from arbitration if you can */
cdde67c
+extern _X_EXPORT Bool xf86VGAarbiterAllowDRI(ScreenPtr pScreen);
cdde67c
+
cdde67c
+#endif /* __XF86VGAARBITER_H */
cdde67c
diff --git a/hw/xfree86/common/xf86VGAarbiterPriv.h b/hw/xfree86/common/xf86VGAarbiterPriv.h
cdde67c
new file mode 100644
cdde67c
index 0000000..40d4368
cdde67c
--- /dev/null
cdde67c
+++ b/hw/xfree86/common/xf86VGAarbiterPriv.h
cdde67c
@@ -0,0 +1,266 @@
cdde67c
+/*
cdde67c
+ * Copyright (c) 2009 Tiago Vignatti
cdde67c
+ *
cdde67c
+ * Permission is hereby granted, free of charge, to any person
cdde67c
+ * obtaining a copy of this software and associated documentation
cdde67c
+ * files (the "Software"), to deal in the Software without
cdde67c
+ * restriction, including without limitation the rights to use,
cdde67c
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell
cdde67c
+ * copies of the Software, and to permit persons to whom the
cdde67c
+ * Software is furnished to do so, subject to the following
cdde67c
+ * conditions:
cdde67c
+ *
cdde67c
+ * The above copyright notice and this permission notice shall be
cdde67c
+ * included in all copies or substantial portions of the Software.
cdde67c
+ *
cdde67c
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
cdde67c
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
cdde67c
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
cdde67c
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
cdde67c
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
cdde67c
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
cdde67c
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
cdde67c
+ * OTHER DEALINGS IN THE SOFTWARE.
cdde67c
+ *
cdde67c
+ */
cdde67c
+
cdde67c
+#ifdef HAVE_XORG_CONFIG_H
cdde67c
+#include <xorg-config.h>
cdde67c
+#endif
cdde67c
+
cdde67c
+#include "misc.h"
cdde67c
+#include "xf86.h"
cdde67c
+#include "xf86_OSproc.h"
cdde67c
+#include <X11/X.h>
cdde67c
+#include "colormapst.h"
cdde67c
+#include "scrnintstr.h"
cdde67c
+#include "screenint.h"
cdde67c
+#include "gcstruct.h"
cdde67c
+#include "pixmapstr.h"
cdde67c
+#include "pixmap.h"
cdde67c
+#include "windowstr.h"
cdde67c
+#include "window.h"
cdde67c
+#include "xf86str.h"
cdde67c
+#include "mipointer.h"
cdde67c
+#include "mipointrst.h"
cdde67c
+#ifdef RENDER
cdde67c
+# include "picturestr.h"
cdde67c
+#endif
cdde67c
+
cdde67c
+
cdde67c
+#define WRAP_SCREEN(x,y) {pScreenPriv->x = pScreen->x; pScreen->x = y;}
cdde67c
+
cdde67c
+#define UNWRAP_SCREEN(x) pScreen->x = pScreenPriv->x
cdde67c
+
cdde67c
+#define SCREEN_PROLOG(x) pScreen->x = ((VGAarbiterScreenPtr) \
cdde67c
+    dixLookupPrivate(&(pScreen)->devPrivates, VGAarbiterScreenKey))->x
cdde67c
+
cdde67c
+#define SCREEN_EPILOG(x,y) pScreen->x = y;
cdde67c
+
cdde67c
+#define WRAP_PICT(x,y) if (ps) {pScreenPriv->x = ps->x;\
cdde67c
+    ps->x = y;}
cdde67c
+
cdde67c
+#define UNWRAP_PICT(x) if (ps) {ps->x = pScreenPriv->x;}
cdde67c
+
cdde67c
+#define PICTURE_PROLOGUE(field) ps->field = \
cdde67c
+    ((VGAarbiterScreenPtr)dixLookupPrivate(&(pScreen)->devPrivates, \
cdde67c
+    VGAarbiterScreenKey))->field
cdde67c
+
cdde67c
+#define PICTURE_EPILOGUE(field, wrap) ps->field = wrap
cdde67c
+
cdde67c
+#define WRAP_SCREEN_INFO(x,y) do {pScreenPriv->x = pScrn->x; pScrn->x = y;} while(0)
cdde67c
+
cdde67c
+#define UNWRAP_SCREEN_INFO(x) pScrn->x = pScreenPriv->x
cdde67c
+
cdde67c
+#define SPRITE_PROLOG miPointerScreenPtr PointPriv = \
cdde67c
+    (miPointerScreenPtr)dixLookupPrivate(&pScreen->devPrivates, \
cdde67c
+    miPointerScreenKey); VGAarbiterScreenPtr pScreenPriv = \
cdde67c
+    ((VGAarbiterScreenPtr)dixLookupPrivate(&(pScreen)->devPrivates, \
cdde67c
+    VGAarbiterScreenKey)); PointPriv->spriteFuncs = pScreenPriv->miSprite;
cdde67c
+
cdde67c
+#define SPRITE_EPILOG pScreenPriv->miSprite = PointPriv->spriteFuncs;\
cdde67c
+    PointPriv->spriteFuncs  = &VGAarbiterSpriteFuncs;
cdde67c
+
cdde67c
+#define WRAP_SPRITE do { pScreenPriv->miSprite = PointPriv->spriteFuncs;\
cdde67c
+    	PointPriv->spriteFuncs  = &VGAarbiterSpriteFuncs; 		\
cdde67c
+	} while (0)
cdde67c
+
cdde67c
+#define UNWRAP_SPRITE PointPriv->spriteFuncs = pScreenPriv->miSprite
cdde67c
+
cdde67c
+#define GC_WRAP(x) pGCPriv->wrapOps = (x)->ops;\
cdde67c
+    pGCPriv->wrapFuncs = (x)->funcs; (x)->ops = &VGAarbiterGCOps;\
cdde67c
+    (x)->funcs = &VGAarbiterGCFuncs;
cdde67c
+
cdde67c
+#define GC_UNWRAP(x) VGAarbiterGCPtr  pGCPriv = \
cdde67c
+    (VGAarbiterGCPtr)dixLookupPrivate(&(x)->devPrivates, VGAarbiterGCKey);\
cdde67c
+    (x)->ops = pGCPriv->wrapOps; (x)->funcs = pGCPriv->wrapFuncs;
cdde67c
+
cdde67c
+#define GC_SCREEN register ScrnInfoPtr pScrn = \
cdde67c
+    xf86Screens[pGC->pScreen->myNum]
cdde67c
+
cdde67c
+#define VGAGet(x)\
cdde67c
+    pci_device_vgaarb_set_target(xf86Screens[pScreen->myNum]->vgaDev); \
cdde67c
+    pci_device_vgaarb_lock();
cdde67c
+
cdde67c
+#define VGAGet_GC(x)\
cdde67c
+    pci_device_vgaarb_set_target(xf86Screens[pGC->pScreen->myNum]->vgaDev); \
cdde67c
+    pci_device_vgaarb_lock();
cdde67c
+
cdde67c
+#define VGAPut(x)\
cdde67c
+    pci_device_vgaarb_unlock();
cdde67c
+
cdde67c
+#define VGAPut_GC(x)\
cdde67c
+    pci_device_vgaarb_unlock();
cdde67c
+
cdde67c
+
cdde67c
+typedef struct _VGAarbiterScreen {
cdde67c
+    CreateGCProcPtr             CreateGC;
cdde67c
+    CloseScreenProcPtr          CloseScreen;
cdde67c
+    ScreenBlockHandlerProcPtr   BlockHandler;
cdde67c
+    ScreenWakeupHandlerProcPtr  WakeupHandler;
cdde67c
+    GetImageProcPtr             GetImage;
cdde67c
+    GetSpansProcPtr             GetSpans;
cdde67c
+    SourceValidateProcPtr       SourceValidate;
cdde67c
+    CopyWindowProcPtr           CopyWindow;
cdde67c
+    ClearToBackgroundProcPtr    ClearToBackground;
cdde67c
+    CreatePixmapProcPtr         CreatePixmap;
cdde67c
+    SaveScreenProcPtr           SaveScreen;
cdde67c
+    /* Colormap */
cdde67c
+    StoreColorsProcPtr          StoreColors;
cdde67c
+    /* Cursor */
cdde67c
+    DisplayCursorProcPtr        DisplayCursor;
cdde67c
+    RealizeCursorProcPtr        RealizeCursor;
cdde67c
+    UnrealizeCursorProcPtr      UnrealizeCursor;
cdde67c
+    RecolorCursorProcPtr        RecolorCursor;
cdde67c
+    SetCursorPositionProcPtr    SetCursorPosition;
cdde67c
+    void                        (*AdjustFrame)(int,int,int,int);
cdde67c
+    Bool                        (*SwitchMode)(int, DisplayModePtr,int);
cdde67c
+    Bool                        (*EnterVT)(int, int);
cdde67c
+    void                        (*LeaveVT)(int, int);
cdde67c
+    void                        (*FreeScreen)(int, int);
cdde67c
+    miPointerSpriteFuncPtr      miSprite;
cdde67c
+#ifdef RENDER
cdde67c
+    CompositeProcPtr            Composite;
cdde67c
+    GlyphsProcPtr               Glyphs;
cdde67c
+    CompositeRectsProcPtr       CompositeRects;
cdde67c
+#endif
cdde67c
+} VGAarbiterScreenRec, *VGAarbiterScreenPtr;
cdde67c
+
cdde67c
+typedef struct _VGAarbiterGC {
cdde67c
+    GCOps                       *wrapOps;
cdde67c
+    GCFuncs                     *wrapFuncs;
cdde67c
+} VGAarbiterGCRec, *VGAarbiterGCPtr;
cdde67c
+
cdde67c
+/* Screen funcs */
cdde67c
+static void VGAarbiterBlockHandler(int i, pointer blockData, pointer pTimeout, pointer pReadmask);
cdde67c
+static void VGAarbiterWakeupHandler(int i, pointer blockData, unsigned long result, pointer pReadmask);
cdde67c
+static Bool VGAarbiterCloseScreen (int i, ScreenPtr pScreen);
cdde67c
+static void VGAarbiterGetImage (DrawablePtr pDrawable, int sx, int sy, int w,
cdde67c
+    int h, unsigned int format, unsigned long planemask, char *pdstLine);
cdde67c
+static void VGAarbiterGetSpans (DrawablePtr pDrawable, int wMax, DDXPointPtr
cdde67c
+    ppt, int *pwidth, int nspans, char  *pdstStart);
cdde67c
+static void VGAarbiterSourceValidate (DrawablePtr pDrawable, int x, int y,
cdde67c
+    int width, int height);
cdde67c
+static void VGAarbiterCopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg,
cdde67c
+    RegionPtr prgnSrc);
cdde67c
+static void VGAarbiterClearToBackground (WindowPtr pWin, int x, int y, int w,
cdde67c
+    int h, Bool generateExposures);
cdde67c
+static PixmapPtr VGAarbiterCreatePixmap(ScreenPtr pScreen, int w, int h,
cdde67c
+    int depth, unsigned int usage_hint);
cdde67c
+static Bool  VGAarbiterCreateGC(GCPtr pGC);
cdde67c
+static Bool VGAarbiterSaveScreen(ScreenPtr pScreen, Bool unblank);
cdde67c
+static void VGAarbiterStoreColors (ColormapPtr pmap, int ndef, xColorItem
cdde67c
+    *pdefs);
cdde67c
+static void VGAarbiterRecolorCursor (DeviceIntPtr pDev, ScreenPtr pScreen,
cdde67c
+    CursorPtr pCurs, Bool displayed);
cdde67c
+static Bool VGAarbiterRealizeCursor (DeviceIntPtr pDev, ScreenPtr pScreen,
cdde67c
+    CursorPtr pCursor);
cdde67c
+static Bool VGAarbiterUnrealizeCursor (DeviceIntPtr pDev, ScreenPtr pScreen,
cdde67c
+    CursorPtr pCursor);
cdde67c
+static Bool VGAarbiterDisplayCursor (DeviceIntPtr pDev, ScreenPtr pScreen,
cdde67c
+    CursorPtr pCursor);
cdde67c
+static Bool VGAarbiterSetCursorPosition (DeviceIntPtr pDev, ScreenPtr
cdde67c
+    pScreen, int x, int y, Bool generateEvent);
cdde67c
+static void VGAarbiterAdjustFrame(int index, int x, int y, int flags);
cdde67c
+static Bool VGAarbiterSwitchMode(int index, DisplayModePtr mode, int flags);
cdde67c
+static Bool VGAarbiterEnterVT(int index, int flags);
cdde67c
+static void VGAarbiterLeaveVT(int index, int flags);
cdde67c
+static void VGAarbiterFreeScreen(int index, int flags);
cdde67c
+
cdde67c
+/* GC funcs */
cdde67c
+static void VGAarbiterValidateGC(GCPtr pGC, unsigned long changes,
cdde67c
+    DrawablePtr pDraw);
cdde67c
+static void VGAarbiterChangeGC(GCPtr pGC, unsigned long mask);
cdde67c
+static void VGAarbiterCopyGC(GCPtr pGCSrc, unsigned long mask, GCPtr pGCDst);
cdde67c
+static void VGAarbiterDestroyGC(GCPtr pGC);
cdde67c
+static void VGAarbiterChangeClip(GCPtr pGC, int type, pointer pvalue,
cdde67c
+    int nrects);
cdde67c
+static void VGAarbiterDestroyClip(GCPtr pGC);
cdde67c
+static void VGAarbiterCopyClip(GCPtr pgcDst, GCPtr pgcSrc);
cdde67c
+
cdde67c
+/* GC ops */
cdde67c
+static void VGAarbiterFillSpans( DrawablePtr pDraw, GC *pGC, int nInit,
cdde67c
+    DDXPointPtr pptInit, int *pwidthInit, int fSorted);
cdde67c
+static void VGAarbiterSetSpans(DrawablePtr pDraw, GCPtr pGC, char *pcharsrc,
cdde67c
+    register DDXPointPtr ppt, int *pwidth, int nspans, int fSorted);
cdde67c
+static void VGAarbiterPutImage(DrawablePtr pDraw, GCPtr pGC, int depth,
cdde67c
+    int x, int y, int w, int h, int leftPad, int format, char *pImage);
cdde67c
+static RegionPtr VGAarbiterCopyArea(DrawablePtr pSrc, DrawablePtr pDst,
cdde67c
+    GC *pGC, int srcx, int srcy, int width, int height, int dstx, int dsty);
cdde67c
+static RegionPtr VGAarbiterCopyPlane(DrawablePtr pSrc, DrawablePtr pDst,
cdde67c
+    GCPtr pGC, int srcx, int srcy, int width, int height, int dstx, int dsty,
cdde67c
+    unsigned long bitPlane);
cdde67c
+static void VGAarbiterPolyPoint(DrawablePtr pDraw, GCPtr pGC, int mode,
cdde67c
+    int npt, xPoint *pptInit);
cdde67c
+static void VGAarbiterPolylines(DrawablePtr pDraw, GCPtr pGC, int mode,
cdde67c
+    int npt, DDXPointPtr pptInit);
cdde67c
+static void VGAarbiterPolySegment(DrawablePtr pDraw, GCPtr pGC, int nseg,
cdde67c
+    xSegment *pSeg);
cdde67c
+static void VGAarbiterPolyRectangle(DrawablePtr pDraw, GCPtr pGC,
cdde67c
+    int nRectsInit, xRectangle *pRectsInit);
cdde67c
+static void VGAarbiterPolyArc(DrawablePtr pDraw, GCPtr pGC, int narcs,
cdde67c
+    xArc *parcs);
cdde67c
+static void VGAarbiterFillPolygon(DrawablePtr pDraw, GCPtr pGC, int shape,
cdde67c
+    int mode, int count, DDXPointPtr ptsIn);
cdde67c
+static void VGAarbiterPolyFillRect( DrawablePtr pDraw, GCPtr pGC,
cdde67c
+    int nrectFill, xRectangle *prectInit);
cdde67c
+static void VGAarbiterPolyFillArc(DrawablePtr pDraw, GCPtr pGC, int narcs,
cdde67c
+    xArc *parcs);
cdde67c
+static int VGAarbiterPolyText8(DrawablePtr pDraw, GCPtr pGC, int x, int y,
cdde67c
+    int count, char *chars);
cdde67c
+static int VGAarbiterPolyText16(DrawablePtr pDraw, GCPtr pGC, int x, int y,
cdde67c
+    int count, unsigned short *chars);
cdde67c
+static void VGAarbiterImageText8(DrawablePtr pDraw, GCPtr pGC, int x, int y,
cdde67c
+    int count, char *chars);
cdde67c
+static void VGAarbiterImageText16(DrawablePtr pDraw, GCPtr pGC, int x, int y,
cdde67c
+    int count, unsigned short *chars);
cdde67c
+static void VGAarbiterImageGlyphBlt(DrawablePtr pDraw, GCPtr pGC, int xInit,
cdde67c
+    int yInit, unsigned int nglyph, CharInfoPtr *ppci, pointer pglyphBase);
cdde67c
+static void VGAarbiterPolyGlyphBlt(DrawablePtr pDraw, GCPtr pGC, int xInit,
cdde67c
+    int yInit, unsigned int nglyph, CharInfoPtr *ppci, pointer pglyphBase);
cdde67c
+static void VGAarbiterPushPixels(GCPtr pGC, PixmapPtr pBitMap, DrawablePtr
cdde67c
+    pDraw, int dx, int dy, int xOrg, int yOrg);
cdde67c
+
cdde67c
+/* miSpriteFuncs */
cdde67c
+static Bool VGAarbiterSpriteRealizeCursor(DeviceIntPtr pDev, ScreenPtr
cdde67c
+    pScreen, CursorPtr pCur);
cdde67c
+static Bool VGAarbiterSpriteUnrealizeCursor(DeviceIntPtr pDev, ScreenPtr
cdde67c
+    pScreen, CursorPtr pCur);
cdde67c
+static void VGAarbiterSpriteSetCursor(DeviceIntPtr pDev, ScreenPtr pScreen,
cdde67c
+    CursorPtr pCur, int x, int y);
cdde67c
+static void VGAarbiterSpriteMoveCursor(DeviceIntPtr pDev, ScreenPtr pScreen,
cdde67c
+    int x, int y);
cdde67c
+static Bool VGAarbiterDeviceCursorInitialize(DeviceIntPtr pDev, ScreenPtr pScreen);
cdde67c
+static void VGAarbiterDeviceCursorCleanup(DeviceIntPtr pDev, ScreenPtr pScreen);
cdde67c
+
cdde67c
+
cdde67c
+#ifdef RENDER
cdde67c
+static void VGAarbiterComposite(CARD8 op, PicturePtr pSrc, PicturePtr pMask,
cdde67c
+    PicturePtr pDst, INT16 xSrc, INT16 ySrc, INT16 xMask, INT16 yMask,
cdde67c
+    INT16 xDst, INT16 yDst, CARD16 width, CARD16 height);
cdde67c
+static void VGAarbiterGlyphs(CARD8 op, PicturePtr pSrc, PicturePtr pDst,
cdde67c
+    PictFormatPtr maskFormat, INT16 xSrc, INT16 ySrc, int nlist, GlyphListPtr
cdde67c
+    list, GlyphPtr *glyphs);
cdde67c
+static void VGAarbiterCompositeRects(CARD8 op, PicturePtr pDst, xRenderColor
cdde67c
+    *color, int nRect, xRectangle *rects);
cdde67c
+#endif
cdde67c
diff --git a/hw/xfree86/common/xf86str.h b/hw/xfree86/common/xf86str.h
cdde67c
index 9cb66eb..5c3ee44 100644
cdde67c
--- a/hw/xfree86/common/xf86str.h
cdde67c
+++ b/hw/xfree86/common/xf86str.h
cdde67c
@@ -517,7 +517,7 @@ typedef struct _confdrirec {
cdde67c
 
cdde67c
 /* These values should be adjusted when new fields are added to ScrnInfoRec */
cdde67c
 #define NUM_RESERVED_INTS		16
cdde67c
-#define NUM_RESERVED_POINTERS		15
cdde67c
+#define NUM_RESERVED_POINTERS		14
cdde67c
 #define NUM_RESERVED_FUNCS		11
cdde67c
 
cdde67c
 typedef pointer (*funcPointer)(void);
cdde67c
@@ -808,6 +808,8 @@ typedef struct _ScrnInfoRec {
cdde67c
     int			reservedInt[NUM_RESERVED_INTS];
cdde67c
 
cdde67c
     int *		entityInstanceList;
cdde67c
+    struct pci_device   *vgaDev;
cdde67c
+
cdde67c
     pointer		reservedPtr[NUM_RESERVED_POINTERS];
cdde67c
 
cdde67c
     /*
cdde67c
diff --git a/hw/xfree86/dri/dri.c b/hw/xfree86/dri/dri.c
cdde67c
index 3af9878..d32b284 100644
cdde67c
--- a/hw/xfree86/dri/dri.c
cdde67c
+++ b/hw/xfree86/dri/dri.c
cdde67c
@@ -69,6 +69,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
cdde67c
 #include "mipointer.h"
cdde67c
 #include "xf86_OSproc.h"
cdde67c
 #include "inputstr.h"
cdde67c
+#include "xf86VGAarbiter.h"
cdde67c
 
cdde67c
 #define PCI_BUS_NO_DOMAIN(bus) ((bus) & 0xffu)
cdde67c
 
cdde67c
@@ -333,6 +334,12 @@ DRIScreenInit(ScreenPtr pScreen, DRIInfoPtr pDRIInfo, int *pDRMFD)
cdde67c
 	return FALSE;
cdde67c
     }
cdde67c
 
cdde67c
+    if (!xf86VGAarbiterAllowDRI(pScreen)) {
cdde67c
+        DRIDrvMsg(pScreen->myNum, X_WARNING,
cdde67c
+                  "Direct rendering is not supported when VGA arb is necessary for the device\n");
cdde67c
+	return FALSE;
cdde67c
+    }
cdde67c
+		
cdde67c
     /*
cdde67c
      * If Xinerama is on, don't allow DRI to initialise.  It won't be usable
cdde67c
      * anyway.
cdde67c
diff --git a/hw/xfree86/dri2/dri2.c b/hw/xfree86/dri2/dri2.c
cdde67c
index 8795cd1..d15ced1 100644
cdde67c
--- a/hw/xfree86/dri2/dri2.c
cdde67c
+++ b/hw/xfree86/dri2/dri2.c
cdde67c
@@ -39,6 +39,7 @@
cdde67c
 #include "scrnintstr.h"
cdde67c
 #include "windowstr.h"
cdde67c
 #include "dri2.h"
cdde67c
+#include "xf86VGAarbiter.h"
cdde67c
 
cdde67c
 #include "xf86.h"
cdde67c
 
cdde67c
@@ -414,6 +415,12 @@ DRI2ScreenInit(ScreenPtr pScreen, DRI2InfoPtr info)
cdde67c
     if (info->version < 3)
cdde67c
 	return FALSE;
cdde67c
 
cdde67c
+    if (!xf86VGAarbiterAllowDRI(pScreen)) {
cdde67c
+        xf86DrvMsg(pScreen->myNum, X_WARNING,
cdde67c
+                  "[DRI2] Direct rendering is not supported when VGA arb is necessary for the device\n");
cdde67c
+        return FALSE;
cdde67c
+    }
cdde67c
+
cdde67c
     ds = xalloc(sizeof *ds);
cdde67c
     if (!ds)
cdde67c
 	return FALSE;
cdde67c
diff --git a/hw/xfree86/int10/generic.c b/hw/xfree86/int10/generic.c
cdde67c
index 9d39e99..655e535 100644
cdde67c
--- a/hw/xfree86/int10/generic.c
cdde67c
+++ b/hw/xfree86/int10/generic.c
cdde67c
@@ -224,11 +224,13 @@ xf86ExtendedInitInt10(int entityIndex, int Flags)
cdde67c
 	default:
cdde67c
 	    goto error1;
cdde67c
 	}
cdde67c
+#if 0
cdde67c
 	pInt->BIOSseg = V_BIOS >> 4;
cdde67c
 	pInt->num = 0xe6;
cdde67c
 	LockLegacyVGA(pInt, &vga);
cdde67c
 	xf86ExecX86int10(pInt);
cdde67c
 	UnlockLegacyVGA(pInt, &vga);
cdde67c
+#endif
cdde67c
     }
cdde67c
 #else
cdde67c
     if (!sysMem) {
cdde67c
diff --git a/hw/xfree86/loader/sdksyms.sh b/hw/xfree86/loader/sdksyms.sh
cdde67c
index 8bda8d7..1186547 100755
cdde67c
--- a/hw/xfree86/loader/sdksyms.sh
cdde67c
+++ b/hw/xfree86/loader/sdksyms.sh
cdde67c
@@ -121,6 +121,7 @@ cat > sdksyms.c << EOF
cdde67c
 #include "xf86fbman.h"
cdde67c
 #include "xf86str.h"
cdde67c
 #include "xf86Xinput.h"
cdde67c
+#include "xf86VGAarbiter.h"
cdde67c
 #include "xisb.h"
cdde67c
 #if XV
cdde67c
 # include "xf86xv.h"
cdde67c
diff --git a/include/xorg-config.h.in b/include/xorg-config.h.in
cdde67c
index ffb35f8..603ae13 100644
cdde67c
--- a/include/xorg-config.h.in
cdde67c
+++ b/include/xorg-config.h.in
cdde67c
@@ -124,6 +124,9 @@
cdde67c
 /* Have pci_enable_device */
cdde67c
 #undef HAVE_PCI_DEVICE_ENABLE
cdde67c
 
cdde67c
+/* Define to 1 if you have the `pci_device_vgaarb_init' function. */
cdde67c
+#undef HAVE_PCI_DEVICE_VGAARB_INIT
cdde67c
+
cdde67c
 /* Path to text files containing PCI IDs */
cdde67c
 #undef PCI_TXT_IDS_PATH
cdde67c
 
cdde67c
-- 
df08191
1.6.4
cdde67c