xserver/hw/xgl/glx xglx.c,1.7,1.8

David Reveman <xserver-commit-u7BhqnqprCWvj1b/[email protected]> Tue, 7 Jun 2005 01:53:42 -0700 (PDT)
Newsgroups gmane.comp.freedesktop.xserver.cvs
Message-ID <[email protected]>
Committed by: davidr

Update of /cvs/xserver/xserver/hw/xgl/glx
In directory gabe:/tmp/cvs-serv19611/hw/xgl/glx

Modified Files:
	xglx.c 
Log Message:
GLX improvements and remove use of pbuffers for offscreen rendering in Xgl

Index: xglx.c
===================================================================
RCS file: /cvs/xserver/xserver/hw/xgl/glx/xglx.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -d -r1.7 -r1.8
--- xglx.c	27 Apr 2005 09:29:33 -0000	1.7
+++ xglx.c	7 Jun 2005 08:53:40 -0000	1.8
@@ -437,7 +437,11 @@
 	return FALSE;
     }
 
-    XSelectInput (xdisplay, pScreenPriv->win, ExposureMask);
+    XSelectInput (xdisplay, pScreenPriv->win,
+		  ButtonPressMask | ButtonReleaseMask |
+		  KeyPressMask | KeyReleaseMask | EnterWindowMask |
+		  PointerMotionMask | ExposureMask);
+    
     XMapWindow (xdisplay, pScreenPriv->win);
 
     if (xglScreenInfo.fullscreen)
@@ -517,11 +521,6 @@
     while (XNextEvent (xdisplay, &xevent))
 	if (xevent.type == Expose)
 	    break;
-    
-    XSelectInput (xdisplay, pScreenPriv->win,
-		  ButtonPressMask | ButtonReleaseMask |
-		  KeyPressMask | KeyReleaseMask | EnterWindowMask |
-		  PointerMotionMask);
 
     return TRUE;
 }
@@ -580,20 +579,81 @@
     AddScreen (xglxScreenInit, argc, argv);
 }
 
+static Bool
+xglxExposurePredicate (Display *xdisplay,
+		       XEvent  *xevent,
+		       char    *args)
+{
+    return (xevent->type == Expose);
+}
+
+static Bool
+xglxNotExposurePredicate (Display *xdisplay,
+			  XEvent  *xevent,
+			  char	  *args)
+{
+    return (xevent->type != Expose);
+}
+
+static int
+xglxWindowExposures (WindowPtr pWin,
+		     pointer   pReg)
+{
+    ScreenPtr pScreen = pWin->drawable.pScreen;
+    RegionRec ClipList;
+
+    if (HasBorder (pWin))
+    {
+	REGION_INIT (pScreen, &ClipList, NullBox, 0);
+	REGION_SUBTRACT (pScreen, &ClipList, &pWin->borderClip,
+			 &pWin->winSize);
+	REGION_INTERSECT (pScreen, &ClipList, &ClipList, (RegionPtr) pReg);
+	(*pScreen->PaintWindowBorder) (pWin, &ClipList, PW_BORDER);
+	REGION_UNINIT (pScreen, &ClipList);
+    }
+    
+    REGION_INIT (pScreen, &ClipList, NullBox, 0);
+    REGION_INTERSECT (pScreen, &ClipList, &pWin->clipList, (RegionPtr) pReg);
+    (*pScreen->WindowExposures) (pWin, &ClipList, NullRegion);
+    REGION_UNINIT (pScreen, &ClipList);
+
+    return WT_WALKCHILDREN;
+}
+
 static void
 xglxBlockHandler (pointer   blockData,
 		  OSTimePtr pTimeout,
 		  pointer   pReadMask)
 {
+    XEvent    X;
+    RegionRec region;
+    BoxRec    box;
+
     XGL_SCREEN_PRIV (currentScreen);
 
+    while (XCheckIfEvent (xdisplay, &X, xglxExposurePredicate, NULL))
+    {
+	ScreenPtr pScreen = currentScreen;
+	
+	box.x1 = X.xexpose.x;
+	box.y1 = X.xexpose.y;
+	box.x2 = box.x1 + X.xexpose.width;
+	box.y2 = box.y1 + X.xexpose.height;
+	    
+	REGION_INIT (currentScreen, &region, &box, 1);
+
+	WalkTree (pScreen, xglxWindowExposures, &region);
+	
+	REGION_UNINIT (pScreen, &region);
+    }
+    
     if (!xglSyncSurface (&pScreenPriv->pScreenPixmap->drawable))
 	FatalError (XGL_SW_FAILURE_STRING);
     
     glitz_surface_flush (pScreenPriv->surface);
-    glitz_drawable_finish (pScreenPriv->drawable);
+    glitz_drawable_flush (pScreenPriv->drawable);
     
-    XSync (xdisplay, FALSE);
+    XFlush (xdisplay);
 }
 
 static void
@@ -605,9 +665,8 @@
     XEvent    X;
     xEvent    x;
 
-    while (XPending (xdisplay)) {
-	XNextEvent (xdisplay, &X);
-	
+    while (XCheckIfEvent (xdisplay, &X, xglxNotExposurePredicate, NULL))
+    {
 	switch (X.type) {
 	case KeyPress:
 	    x.u.u.type = KeyPress;