xserver/hw/xgl xgl.h, 1.9, 1.10 xglcmap.c, 1.4, 1.5 xglcopy.c, 1.4, 1.5 xglparse.c, 1.3, 1.4 xglpixmap.c, 1.8, 1.9 xglscreen.c, 1.5, 1.6 xglshm.c, 1.1, 1.2 xglsync.c, 1.4, 1.5 xgltrap.c, 1.2, 1.3

David Reveman <xserver-commit-u7BhqnqprCWvj1b/[email protected]> Thu, 10 Mar 2005 16:58:51 -0800 (PST)
Newsgroups gmane.comp.freedesktop.xserver.cvs
Message-ID <[email protected]>
Committed by: davidr

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

Modified Files:
	xgl.h xglcmap.c xglcopy.c xglparse.c xglpixmap.c xglscreen.c 
	xglshm.c xglsync.c xgltrap.c 
Log Message:
Use negative stride and PBOs in Xgl

Index: xgl.h
===================================================================
RCS file: /cvs/xserver/xserver/hw/xgl/xgl.h,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -d -r1.9 -r1.10
--- xgl.h	8 Mar 2005 09:12:17 -0000	1.9
+++ xgl.h	11 Mar 2005 00:58:49 -0000	1.10
@@ -54,6 +54,8 @@
 
 extern WindowPtr *WindowTable;
 
+#define XGL_DEFAULT_PBO_MASK 0 /* don't use PBO as default */
+
 typedef struct _xglScreenInfo {
     glitz_drawable_t *drawable;
     unsigned int     width;
@@ -63,6 +65,8 @@
     Bool	     fullscreen;
     int		     geometryDataType;
     int		     geometryUsage;
+    Bool	     yInverted;
+    int		     pboMask;
 } xglScreenInfoRec, *xglScreenInfoPtr;
 
 typedef struct _xglPixelFormat {
@@ -217,6 +221,8 @@
     int				  nOffscreen;
     int				  geometryUsage;
     int				  geometryDataType;
+    Bool			  yInverted;
+    int				  pboMask;
     xglGeometryRec		  scratchGeometry;
     
 #ifdef RENDER
@@ -830,12 +836,27 @@
 
 /* xglpixmap.c */
 
+#define XGL_PIXMAP_USAGE_HINT_STREAM_DRAW  1
+#define XGL_PIXMAP_USAGE_HINT_STREAM_READ  2
+#define XGL_PIXMAP_USAGE_HINT_STREAM_COPY  3
+#define XGL_PIXMAP_USAGE_HINT_STATIC_DRAW  4
+#define XGL_PIXMAP_USAGE_HINT_STATIC_READ  5
+#define XGL_PIXMAP_USAGE_HINT_STATIC_COPY  6
+#define XGL_PIXMAP_USAGE_HINT_DYNAMIC_DRAW 7
+#define XGL_PIXMAP_USAGE_HINT_DYNAMIC_READ 8
+#define XGL_PIXMAP_USAGE_HINT_DYNAMIC_COPY 9
+
+#define XGL_PIXMAP_USAGE_HINT_DEFAULT XGL_PIXMAP_USAGE_HINT_STREAM_DRAW
+
 PixmapPtr
 xglCreatePixmap (ScreenPtr  pScreen,
 		 int	    width,
 		 int	    height, 
 		 int	    depth);
 
+void
+xglFiniPixmap (PixmapPtr pPixmap);
+
 Bool
 xglDestroyPixmap (PixmapPtr pPixmap);
 
@@ -860,7 +881,7 @@
 xglCreatePixmapSurface (PixmapPtr pPixmap);
 
 Bool
-xglAllocatePixmapBits (PixmapPtr pPixmap);
+xglAllocatePixmapBits (PixmapPtr pPixmap, int hint);
 
 Bool
 xglMapPixmapBits (PixmapPtr pPixmap);

Index: xglcmap.c
===================================================================
RCS file: /cvs/xserver/xserver/hw/xgl/xglcmap.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- xglcmap.c	11 Feb 2005 20:19:20 -0000	1.4
+++ xglcmap.c	11 Mar 2005 00:58:49 -0000	1.5
@@ -157,8 +157,8 @@
 	    if (xglPbufferVisuals)
 	    {
 		xglPbufferVisuals[nxglPbufferVisuals].format  = format;
-		xglPbufferVisuals[nxglPbufferVisuals].pPixel  = pPixelFormat;
-		xglPbufferVisuals[nxglPbufferVisuals].visuals = visuals;
+		xglPbufferVisuals[nxglPbufferVisuals].pPixel  = NULL;
+		xglPbufferVisuals[nxglPbufferVisuals].visuals = 0;
 		nxglPbufferVisuals++;
 	    }
 	}
@@ -217,23 +217,6 @@
 				      rm, gm, bm);
 	}
     }
-
-#if 1
-    {
-	for (j = 0; j < nxglVisuals; j++)
-	{
-	    ErrorF ("Visual: 0x%x (%c) - r/g/b/a: %d/%d/%d/%d  db: %d\n",
-		    (int) xglVisuals[j].format->id,
-		    xglVisuals[j].format->types.pbuffer? 'y' : 'n',
-		    xglVisuals[j].format->color.red_size,
-		    xglVisuals[j].format->color.green_size,
-		    xglVisuals[j].format->color.blue_size,
-		    xglVisuals[j].format->color.alpha_size,
-		    xglVisuals[j].format->doublebuffer);
-	}
-    }
-#endif
-
 }
 
 void

Index: xglcopy.c
===================================================================
RCS file: /cvs/xserver/xserver/hw/xgl/xglcopy.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- xglcopy.c	8 Mar 2005 09:27:09 -0000	1.4
+++ xglcopy.c	11 Mar 2005 00:58:49 -0000	1.5
@@ -158,12 +158,6 @@
 
 	    pBox++;
 	}
-
-	if (pPixmapPriv->target == xglPixmapTargetIn)
-	{
-	    if (!xglSyncSurface (pDst))
-		FatalError (XGL_SW_FAILURE_STRING);
-	}
     } else
 	xglAddCurrentBitDamage (pDst);
 }

Index: xglparse.c
===================================================================
RCS file: /cvs/xserver/xserver/hw/xgl/xglparse.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- xglparse.c	26 Jan 2005 10:58:52 -0000	1.3
+++ xglparse.c	11 Mar 2005 00:58:49 -0000	1.4
@@ -105,6 +105,9 @@
     ErrorF ("-vertextype [short|float] set vertex data type\n");
     ErrorF ("-vbostream             "
 	    "use vertex buffer objects for streaming of vertex data\n");
+    ErrorF ("-yinverted             Y is upside-down\n");
+    ErrorF ("-pbomask [1|4|8|16|32] "
+	    "set bpp's to use with pixel buffer objects\n");
 }
 
 int
@@ -148,6 +151,22 @@
 	pScreenInfo->geometryUsage = GEOMETRY_USAGE_STREAM;
 	return 1;
     }
+    else if (!strcmp (argv[i], "-yinverted"))
+    {
+	pScreenInfo->yInverted = TRUE;
+	return 1;
+    }
+    else if (!strcmp (argv[i], "-pbomask"))
+    {
+	if ((i + 1) < argc)
+	{
+	    pScreenInfo->pboMask = atoi (argv[i + 1]);
+	}
+	else
+	    return 1;
+	
+	return 2;
+    }
     
     return 0;
 }

Index: xglpixmap.c
===================================================================
RCS file: /cvs/xserver/xserver/hw/xgl/xglpixmap.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -d -r1.8 -r1.9
--- xglpixmap.c	11 Feb 2005 20:19:20 -0000	1.8
+++ xglpixmap.c	11 Mar 2005 00:58:49 -0000	1.9
@@ -26,6 +26,24 @@
 #include "xgl.h"
 #include "fb.h"
 
+static glitz_buffer_hint_t xglPixmapUsageHints[] = {
+    (glitz_buffer_hint_t) 0,	    /* reserved for system memory */
+    GLITZ_BUFFER_HINT_STREAM_DRAW,
+    GLITZ_BUFFER_HINT_STREAM_READ,
+    GLITZ_BUFFER_HINT_STREAM_COPY,
+    GLITZ_BUFFER_HINT_STATIC_DRAW,
+    GLITZ_BUFFER_HINT_STATIC_READ,
+    GLITZ_BUFFER_HINT_STATIC_COPY,
+    GLITZ_BUFFER_HINT_DYNAMIC_DRAW,
+    GLITZ_BUFFER_HINT_DYNAMIC_READ,
+    GLITZ_BUFFER_HINT_DYNAMIC_COPY
+};
+
+#define NUM_XGL_PIXMAP_USAGE_HINTS				     \
+    (sizeof (xglPixmapUsageHints) / sizeof (xglPixmapUsageHints[0]))
+
+#define XGL_PIXMAP_USAGE_HINT(hint) (xglPixmapUsageHints[hint])
+
 static void
 xglPixmapDamageReport (DamagePtr pDamage,
 		       RegionPtr pRegion,
@@ -187,14 +205,11 @@
     return pPixmap;
 }
 
-Bool
-xglDestroyPixmap (PixmapPtr pPixmap)
+void
+xglFiniPixmap (PixmapPtr pPixmap)
 {
     XGL_PIXMAP_PRIV (pPixmap);
-	    
-    if (--pPixmap->refcnt)
-	return TRUE;
-
+        
     if (pPixmapPriv->pArea)
 	xglWithdrawArea (pPixmapPriv->pArea);
 	
@@ -215,6 +230,15 @@
     
     if (pPixmapPriv->surface)
 	glitz_surface_destroy (pPixmapPriv->surface);
+}
+
+Bool
+xglDestroyPixmap (PixmapPtr pPixmap)
+{
+    if (--pPixmap->refcnt)
+	return TRUE;
+
+    xglFiniPixmap (pPixmap);
 
     xfree (pPixmap);
     
@@ -362,7 +386,6 @@
 	glitz_surface_reference (pScreenPriv->surface);
 	
 	pPixmapPriv->surface = pScreenPriv->surface;
-	pPixmapPriv->pPixel  = pScreenPriv->pVisual[0].pPixel;
 	pPixmapPriv->target  = xglPixmapTargetIn;
 	
 	pScreenPriv->pScreenPixmap = pPixmap;
@@ -405,7 +428,8 @@
 	
 	if (!pPixmapPriv->buffer)
 	{
-	    if (!xglAllocatePixmapBits (pPixmap))
+	    if (!xglAllocatePixmapBits (pPixmap,
+					XGL_PIXMAP_USAGE_HINT_DEFAULT))
 		return NULL;
 	}
 	
@@ -476,11 +500,12 @@
 }
 
 Bool
-xglAllocatePixmapBits (PixmapPtr pPixmap)
+xglAllocatePixmapBits (PixmapPtr pPixmap, int hint)
 {
     int width, height, bpp, stride;
     
     XGL_PIXMAP_PRIV (pPixmap);
+    XGL_SCREEN_PRIV (pPixmap->drawable.pScreen);
 
     width  = pPixmap->drawable.width;
     height = pPixmap->drawable.height;
@@ -490,22 +515,37 @@
 
     if (stride)
     {
-	pPixmapPriv->bits = xalloc (height * stride);
-	if (!pPixmapPriv->bits)
-	    return FALSE;
+	glitz_buffer_t *buffer;
+	
+	if ((pScreenPriv->pboMask & bpp) && hint)
+	{
+	    buffer = glitz_pixel_buffer_create (pScreenPriv->drawable,
+						NULL, height * stride,
+						XGL_PIXMAP_USAGE_HINT (hint));
+	}
+	else
+	{
+	    pPixmapPriv->bits = xalloc (height * stride);
+	    if (!pPixmapPriv->bits)
+		return FALSE;
 
-	pPixmapPriv->buffer =
-	    glitz_buffer_create_for_data (pPixmapPriv->bits);
-	if (!pPixmapPriv->buffer)
+	    buffer = glitz_buffer_create_for_data (pPixmapPriv->bits);
+	}
+
+	if (!buffer)
 	{
-	    xfree (pPixmapPriv->bits);
+	    if (pPixmapPriv->bits)
+		xfree (pPixmapPriv->bits);
 	    pPixmapPriv->bits = NULL;
 	    return FALSE;
-	}	
+	}
+	pPixmapPriv->buffer = buffer;
     }
 
-    /* XXX: pPixmapPriv->stride = -stride */
-    pPixmapPriv->stride = stride;
+    if (pScreenPriv->yInverted)
+	pPixmapPriv->stride = stride;
+    else
+	pPixmapPriv->stride = -stride;
     
     return TRUE;
 }
@@ -520,7 +560,8 @@
 	XGL_PIXMAP_PRIV (pPixmap);
 	
 	if (!pPixmapPriv->buffer)
-	    if (!xglAllocatePixmapBits (pPixmap))
+	    if (!xglAllocatePixmapBits (pPixmap,
+					XGL_PIXMAP_USAGE_HINT_DEFAULT))
 		return FALSE;
 	
 	bits = glitz_buffer_map (pPixmapPriv->buffer,

Index: xglscreen.c
===================================================================
RCS file: /cvs/xserver/xserver/hw/xgl/xglscreen.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- xglscreen.c	8 Mar 2005 09:12:17 -0000	1.5
+++ xglscreen.c	11 Mar 2005 00:58:49 -0000	1.6
@@ -135,6 +135,7 @@
 	       xglScreenInfoPtr pScreenInfo)
 {
     xglScreenPtr pScreenPriv;
+    int		 depth;
     
 #ifdef RENDER
     PictureScreenPtr pPictureScreen;
@@ -152,15 +153,19 @@
     pScreenPriv->features =
 	glitz_drawable_get_features (pScreenInfo->drawable);
 
+    depth = pScreenPriv->pVisual->pPixel->depth;
+
     if (!xglInitOffscreen (pScreen, pScreenInfo))
 	return FALSE;
     
     xglInitPixmapFormats (pScreen);
-    if (!pScreenPriv->pixmapFormats[32].format)
+    if (!pScreenPriv->pixmapFormats[depth].format)
 	return FALSE;
     
     pScreenPriv->geometryDataType = pScreenInfo->geometryDataType;
     pScreenPriv->geometryUsage    = pScreenInfo->geometryUsage;
+    pScreenPriv->yInverted	  = pScreenInfo->yInverted;
+    pScreenPriv->pboMask	  = pScreenInfo->pboMask;
 
     GEOMETRY_INIT (pScreen, &pScreenPriv->scratchGeometry,
 		   GLITZ_GEOMETRY_TYPE_VERTEX,
@@ -168,7 +173,7 @@
     
     pScreenPriv->surface =
 	glitz_surface_create (pScreenPriv->drawable,
-			      pScreenPriv->pixmapFormats[32].format,
+			      pScreenPriv->pixmapFormats[depth].format,
 			      pScreenInfo->width, pScreenInfo->height,
 			      0, NULL);
     if (!pScreenPriv->surface)
@@ -283,7 +288,9 @@
 
     XGL_SCREEN_PRIV (pScreen);
 	
-    miInitializeBackingStore (pScreen);
+    /* Do we want to use BackingStore?
+       miInitializeBackingStore (pScreen);
+    */
 
     if (!fbCreateDefColormap (pScreen))
 	return FALSE;
@@ -348,7 +355,8 @@
 		ScreenPtr pScreen)
 {
     XGL_SCREEN_PRIV (pScreen);
-
+    XGL_PIXMAP_PRIV (pScreenPriv->pScreenPixmap);
+    
 #ifdef RENDER
     int i;
     
@@ -362,6 +370,10 @@
 	glitz_surface_destroy (pScreenPriv->trapInfo.mask);
 #endif
 
+    xglFiniPixmap (pScreenPriv->pScreenPixmap);
+    if (pPixmapPriv->pDamage)
+	DamageDestroy (pPixmapPriv->pDamage);
+
     if (pScreenPriv->solid)
 	glitz_surface_destroy (pScreenPriv->solid);
 

Index: xglshm.c
===================================================================
RCS file: /cvs/xserver/xserver/hw/xgl/xglshm.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- xglshm.c	8 Mar 2005 09:12:17 -0000	1.1
+++ xglshm.c	11 Mar 2005 00:58:49 -0000	1.2
@@ -64,7 +64,8 @@
 
 	    XGL_PIXMAP_PRIV (pPixmap);
 
-	    if (!xglAllocatePixmapBits (pPixmap))
+	    if (!xglAllocatePixmapBits (pPixmap,
+					XGL_PIXMAP_USAGE_HINT_DEFAULT))
 	    {
 		(*pScreen->DestroyPixmap) (pPixmap);
 		return;

Index: xglsync.c
===================================================================
RCS file: /cvs/xserver/xserver/hw/xgl/xglsync.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- xglsync.c	1 Mar 2005 16:57:54 -0000	1.4
+++ xglsync.c	11 Mar 2005 00:58:49 -0000	1.5
@@ -80,7 +80,7 @@
 
     pBitBox = &pPixmapPriv->bitBox;
 
-    if (pExtents)
+    if (pPixmapPriv->target == xglPixmapTargetIn && pExtents)
     {
 	box.x1 = MAX (0, pExtents->x1);
 	box.y1 = MAX (0, pExtents->y1);
@@ -150,7 +150,7 @@
     }
 
     if (!pPixmapPriv->buffer)
-	if (!xglAllocatePixmapBits (pPixmap))
+	if (!xglAllocatePixmapBits (pPixmap, XGL_PIXMAP_USAGE_HINT_DEFAULT))
 	    return FALSE;
 
     if (pPixmapPriv->pDamage)
@@ -176,23 +176,24 @@
 	nBox = REGION_NUM_RECTS (&region);
 
 	format.masks = pPixmapPriv->pPixel->masks;
-
-	if (pPixmapPriv->stride < 0)
-	{
-	    format.bytes_per_line = -pPixmapPriv->stride;
-	    format.scanline_order = GLITZ_PIXEL_SCANLINE_ORDER_BOTTOM_UP;
-	}
-	else
-	{
-	    format.bytes_per_line = pPixmapPriv->stride;
-	    format.scanline_order = GLITZ_PIXEL_SCANLINE_ORDER_TOP_DOWN;
-	}
 	
 	while (nBox--)
 	{
-	    format.xoffset    = pBox->x1;
-	    format.skip_lines = pBox->y1;
-	    
+	    format.xoffset = pBox->x1;
+
+	    if (pPixmapPriv->stride < 0)
+	    {
+		format.skip_lines     = pPixmap->drawable.height - pBox->y2;
+		format.bytes_per_line = -pPixmapPriv->stride;
+		format.scanline_order = GLITZ_PIXEL_SCANLINE_ORDER_BOTTOM_UP;
+	    }
+	    else
+	    {
+		format.skip_lines     = pBox->y1;
+		format.bytes_per_line = pPixmapPriv->stride;
+		format.scanline_order = GLITZ_PIXEL_SCANLINE_ORDER_TOP_DOWN;
+	    }
+
 	    glitz_get_pixels (pPixmapPriv->surface,
 			      pBox->x1,
 			      pBox->y1,
@@ -254,17 +255,18 @@
 	pBox = REGION_RECTS (pRegion);
 	pExt = REGION_EXTENTS (pDrawable->pScreen, pRegion);
 
-	format.masks	  = pPixmapPriv->pPixel->masks;
-	format.xoffset    = pExt->x1;
-	format.skip_lines = pExt->y1;
-	
+	format.masks   = pPixmapPriv->pPixel->masks;
+	format.xoffset = pExt->x1;
+
 	if (pPixmapPriv->stride < 0)
 	{
+	    format.skip_lines	  = pPixmap->drawable.height - pExt->y2;
 	    format.bytes_per_line = -pPixmapPriv->stride;
 	    format.scanline_order = GLITZ_PIXEL_SCANLINE_ORDER_BOTTOM_UP;
 	}
 	else
 	{
+	    format.skip_lines	  = pExt->y1;
 	    format.bytes_per_line = pPixmapPriv->stride;
 	    format.scanline_order = GLITZ_PIXEL_SCANLINE_ORDER_TOP_DOWN;
 	}

Index: xgltrap.c
===================================================================
RCS file: /cvs/xserver/xserver/hw/xgl/xgltrap.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- xgltrap.c	1 Feb 2005 21:22:02 -0000	1.2
+++ xgltrap.c	11 Mar 2005 00:58:49 -0000	1.3
@@ -66,17 +66,13 @@
     {
 	XGL_PIXMAP_PRIV (pPixmap);
 	
-	if (!xglAllocatePixmapBits (pPixmap))
+	if (!xglAllocatePixmapBits (pPixmap, XGL_PIXMAP_USAGE_HINT_DEFAULT))
 	{
 	    (*pScreen->DestroyPixmap) (pPixmap);
 	    return 0;
 	}
 
 	pPixmapPriv->target = xglPixmapTargetNo;
-
-	/* force negative stride */
-	if (pPixmapPriv->stride > 0)
-	    pPixmapPriv->stride = -pPixmapPriv->stride;
     }
     
     pGC = GetScratchGC (pPixmap->drawable.depth, pScreen);