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, ®ion, &box, 1);
+
+ WalkTree (pScreen, xglxWindowExposures, ®ion);
+
+ REGION_UNINIT (pScreen, ®ion);
+ }
+
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;