xserver/hw/kdrive/ati ati.c, 1.15, 1.16 ati.h, 1.9, 1.10 ati_cursor.c, 1.3, 1.4 ati_draw.c, 1.18, 1.19 ati_draw.h, 1.6, 1.7

Eric Anholt xserver-commit at pdx.freedesktop.org
Mon Jul 19 00:53:56 PDT 2004


Committed by: anholt

Update of /cvs/xserver/xserver/hw/kdrive/ati
In directory pdx:/tmp/cvs-serv20297/hw/kdrive/ati

Modified Files:
	ati.c ati.h ati_cursor.c ati_draw.c ati_draw.h 
Log Message:
Use the offscreen memory manager as much as possible to do the
reservation of memory at startup.  Do some drive-by cleanups while I'm
here (sorry!).


Index: ati.c
===================================================================
RCS file: /cvs/xserver/xserver/hw/kdrive/ati/ati.c,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -d -r1.15 -r1.16
--- ati.c	28 Jun 2004 00:48:51 -0000	1.15
+++ ati.c	19 Jul 2004 07:53:53 -0000	1.16
@@ -291,24 +291,15 @@
 static void
 ATISetOffscreen (KdScreenInfo *screen)
 {
+#if defined(USE_DRI) && defined(GLXEXT)
 	ATICardInfo(screen);
 	ATIScreenInfo *atis = (ATIScreenInfo *)screen->driver;
-	int screen_size = screen->fb[0].byteStride * screen->height;
-#if defined(USE_DRI) && defined(GLXEXT)
 	int l;
 #endif
+	int screen_size = screen->fb[0].byteStride * screen->height;
 
 	screen->off_screen_base = screen_size;
 
-	if (atic->is_radeon)
-		atis->cursor.cursor_size = ATI_CURSOR_HEIGHT * ATI_CURSOR_WIDTH * 4;
-	else
-		atis->cursor.cursor_size = ATI_CURSOR_HEIGHT * ATI_CURSOR_PITCH * 3;
-
-	atis->cursor.offset = screen->off_screen_base;
-
-	screen->off_screen_base += atis->cursor.cursor_size;
-
 #if defined(USE_DRI) && defined(GLXEXT)
 	/* Reserve a static area for the back buffer the same size as the
 	 * visible screen.  XXX: This would be better initialized in ati_dri.c
@@ -357,22 +348,6 @@
 		atis->textureSize = 0;
 	}
 #endif /* USE_DRI && GLXEXT */
-
-	/* Reserve a scratch area.  It'll be used for storing glyph data during
-	 * Composite operations, because glyphs aren't in real pixmaps and thus
-	 * can't be migrated.
-	 */
-	atis->scratch_size = 131072;	/* big enough for 128x128 at 32bpp */
-	if (screen->off_screen_base + atis->scratch_size <= screen->memory_size)
-	{
-		atis->scratch_offset = screen->off_screen_base;
-		screen->off_screen_base += atis->scratch_size;
-		atis->scratch_next = atis->scratch_offset;
-	}
-	else 
-	{
-		atis->scratch_size = 0;
-	}
 }
 
 static Bool
@@ -574,6 +549,9 @@
 ATIDisable(ScreenPtr pScreen)
 {
 	KdScreenPriv(pScreen);
+#if defined(USE_DRI) && defined(GLXEXT)
+	ATIScreenInfo(pScreenPriv);
+#endif /* USE_DRI && GLXEXT */
 	ATICardInfo(pScreenPriv);
 
 	ATIUnmapReg(pScreenPriv->card, atic);
@@ -605,8 +583,6 @@
 {
 	int bits;
 
-	if (!val)
-		return 1;
 	for (bits = 0; val != 0; val >>= 1, ++bits)
 		;
 	return bits - 1;

Index: ati.h
===================================================================
RCS file: /cvs/xserver/xserver/hw/kdrive/ati/ati.h,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -d -r1.9 -r1.10
--- ati.h	28 Jun 2004 00:48:51 -0000	1.9
+++ ati.h	19 Jul 2004 07:53:54 -0000	1.10
@@ -162,10 +162,7 @@
 	Bool		has_cursor;
 	CursorPtr	pCursor;
 	Pixel		source, mask;
-	KdOffscreenArea	*area;
-	CARD32		offset;
-	
-	int		cursor_size;
+	KdOffscreenArea *area;
 } ATICursor;
 
 typedef struct _ATIPortPriv {
@@ -213,12 +210,10 @@
 	ATICardInfo *atic;
 	KdScreenInfo *screen;
 
-	void (*save_blockhandler)(int screen, pointer blockData,
-	    pointer timeout, pointer readmask);
-
 	int		scratch_offset;
 	int		scratch_next;
 	int		scratch_size;
+	KdOffscreenArea *scratch_area;
 
 	ATICursor	cursor;
 

Index: ati_cursor.c
===================================================================
RCS file: /cvs/xserver/xserver/hw/kdrive/ati/ati_cursor.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- ati_cursor.c	28 Jun 2004 00:48:51 -0000	1.3
+++ ati_cursor.c	19 Jul 2004 07:53:54 -0000	1.4
@@ -63,7 +63,8 @@
 	    (xoff << 16) | yoff);
 	MMIO_OUT32(mmio, ATI_REG_CUR_HORZ_VERT_POSN, ATI_CUR_LOCK |
 	    (x << 16) | y);
-	MMIO_OUT32(mmio, ATI_REG_CUR_OFFSET, (pCurPriv->offset + yoff * stride));
+	MMIO_OUT32(mmio, ATI_REG_CUR_OFFSET, (pCurPriv->area->offset + yoff *
+	    stride));
 }
 
 static void
@@ -163,7 +164,7 @@
 
 	/* Stick new image into cursor memory */
 	ram = (CARD32 *)(pScreenPriv->screen->memory_base +
-	    pCurPriv->offset);
+	    pCurPriv->area->offset);
 	mskLine = (CARD32 *)bits->mask;
 	srcLine = (CARD32 *)bits->source;
 
@@ -261,7 +262,7 @@
 
 	/* Stick new image into cursor memory */
 	ram = (CARD32 *)(pScreenPriv->screen->memory_base +
-	    pCurPriv->offset);
+	    pCurPriv->area->offset);
 	if (pCursor->bits->argb)
 	{
 		srcLine = pCursor->bits->argb;
@@ -445,6 +446,16 @@
 	}
 }
 
+static void
+ATICursorSave(ScreenPtr pScreen, KdOffscreenArea *area)
+{
+	KdScreenPriv(pScreen);
+	ATIScreenInfo(pScreenPriv);
+	ATICursor *pCurPriv = &atis->cursor;
+
+	pCurPriv->area = NULL;
+}
+
 void
 ATICursorEnable(ScreenPtr pScreen)
 {
@@ -456,6 +467,19 @@
 	if (!pCurPriv->has_cursor)
 		return;
 
+	if (pCurPriv->area == NULL) {
+		if (atic->is_radeon)
+			pCurPriv->area = KdOffscreenAlloc(pScreen,
+			    ATI_CURSOR_HEIGHT * ATI_CURSOR_WIDTH * 4,
+			    1, TRUE, ATICursorSave, atis);
+		else
+			pCurPriv->area = KdOffscreenAlloc(pScreen,
+			    ATI_CURSOR_HEIGHT * ATI_CURSOR_PITCH * 2,
+			    1, TRUE, ATICursorSave, atis);
+	}
+	if (pCurPriv->area == NULL)
+		FatalError("Couldn't allocate offscreen memory for cursor.\n");
+
 	if (pCurPriv->pCursor) {
 		int x, y;
 
@@ -495,7 +519,7 @@
 
 	pCurPriv->has_cursor = FALSE;
 
-	if (pCurPriv->cursor_size == 0)
+	if (pCurPriv->area == NULL)
 		return FALSE;
 
 	if (atic->reg_base == NULL)

Index: ati_draw.c
===================================================================
RCS file: /cvs/xserver/xserver/hw/kdrive/ati/ati_draw.c,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -d -r1.18 -r1.19
--- ati_draw.c	28 Jun 2004 00:48:51 -0000	1.18
+++ ati_draw.c	19 Jul 2004 07:53:54 -0000	1.19
@@ -91,6 +91,7 @@
 	 * issues.
 	 */
 	/*if (!atic->is_radeon) {
+		char *mmio = atic->reg_base;
 		ATIWaitIdle(atis);
 		MMIO_OUT32(mmio, R128_REG_PC_GUI_MODE,
 		    R128_PC_BYPASS_EN);
@@ -615,23 +616,23 @@
 	    atis->kaa.offscreenPitch - 1) & ~(atis->kaa.offscreenPitch - 1);
 
 	size = dst_pitch * pSrc->drawable.height;
-	if (size > atis->scratch_size)
+	if (size > atis->scratch_area->size)
 		ATI_FALLBACK(("Pixmap too large for scratch (%d,%d)\n",
 		    pSrc->drawable.width, pSrc->drawable.height));
 
 	atis->scratch_next = (atis->scratch_next +
 	    atis->kaa.offscreenByteAlign - 1) &
 	    ~(atis->kaa.offscreenByteAlign - 1);
-	if (atis->scratch_next + size > atis->scratch_offset +
-	    atis->scratch_size) {
+	if (atis->scratch_next + size > atis->scratch_area->offset +
+	    atis->scratch_area->size) {
 		/* Only sync when we've used all of the scratch area. */
 		KdCheckSync(pSrc->drawable.pScreen);
-		atis->scratch_next = atis->scratch_offset;
+		atis->scratch_next = atis->scratch_area->offset;
 	}
 	memcpy(pDst, pSrc, sizeof(*pDst));
 	pDst->devKind = dst_pitch;
-	pDst->devPrivate.ptr = atis->scratch_next +
-	    pScreenPriv->screen->memory_base;
+	pDst->devPrivate.ptr = pScreenPriv->screen->memory_base +
+	    atis->scratch_next;
 	atis->scratch_next += size;
 
 	src = pSrc->devPrivate.ptr;
@@ -662,7 +663,7 @@
 }
 
 static void
-ATIBlockHandler (pointer blockData, OSTimePtr timeout, pointer readmask)
+ATIBlockHandler(pointer blockData, OSTimePtr timeout, pointer readmask)
 {
 	ScreenPtr pScreen = (ScreenPtr) blockData;
 	KdScreenPriv(pScreen);
@@ -675,7 +676,7 @@
 }
 
 static void
-ATIWakeupHandler (pointer blockData, int result, pointer readmask)
+ATIWakeupHandler(pointer blockData, int result, pointer readmask)
 {
 }
 
@@ -685,7 +686,6 @@
 	KdScreenPriv(pScreen);
 	ATIScreenInfo(pScreenPriv);
 	ATICardInfo(pScreenPriv);
-	int align_scratch;
 
 	ErrorF("Screen: %d/%d depth/bpp\n", pScreenPriv->screen->fb[0].depth,
 	    pScreenPriv->screen->fb[0].bitsPerPixel);
@@ -719,19 +719,21 @@
 		atis->kaa.offscreenPitch = 32;
 	}
 
-	/* Align the scratch area to what offscreenByteAlign requires. */
-	align_scratch = (atis->scratch_offset +
-	    atis->kaa.offscreenByteAlign - 1) &
-	    ~(atis->kaa.offscreenByteAlign - 1);
-	atis->scratch_size -= align_scratch - atis->scratch_offset;
-	atis->scratch_offset = align_scratch;
-
 	if (!kaaDrawInit(pScreen, &atis->kaa))
 		return FALSE;
 
 	return TRUE;
 }
 
+static void
+ATIScratchSave(ScreenPtr pScreen, KdOffscreenArea *area)
+{
+	KdScreenPriv(pScreen);
+	ATIScreenInfo(pScreenPriv);
+
+	atis->scratch_area = NULL;
+}
+
 void
 ATIDrawEnable(ScreenPtr pScreen)
 {
@@ -780,7 +782,18 @@
 	}
 
 	atis->kaa.UploadToScreen = ATIUploadToScreen;
-	atis->kaa.UploadToScratch = ATIUploadToScratch;
+
+	/* Reserve a scratch area.  It'll be used for storing glyph data during
+	 * Composite operations, because glyphs aren't in real pixmaps and thus
+	 * can't be migrated.
+	 */
+	atis->scratch_area = KdOffscreenAlloc(pScreen, 131072,
+	    atis->kaa.offscreenByteAlign, TRUE, ATIScratchSave, atis);
+	if (atis->scratch_area != NULL) {
+		atis->scratch_next = atis->scratch_area->offset;
+		atis->kaa.UploadToScratch = ATIUploadToScratch;
+	} else
+		atis->kaa.UploadToScratch = NULL;
 
 	RegisterBlockAndWakeupHandlers (ATIBlockHandler, ATIWakeupHandler,
 				       pScreen);
@@ -791,10 +804,10 @@
 void
 ATIDrawDisable(ScreenPtr pScreen)
 {
-	ATIDMATeardown(pScreen);
-
 	RemoveBlockAndWakeupHandlers (ATIBlockHandler, ATIWakeupHandler,
 				      pScreen);
+
+	ATIDMATeardown(pScreen);
 }
 
 void

Index: ati_draw.h
===================================================================
RCS file: /cvs/xserver/xserver/hw/kdrive/ati/ati_draw.h,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- ati_draw.h	17 May 2004 20:18:02 -0000	1.6
+++ ati_draw.h	19 Jul 2004 07:53:54 -0000	1.7
@@ -89,10 +89,11 @@
 ATIWaitIdle(ATIScreenInfo *atis);
 
 #if 0
-#define ATI_FALLBACK(x)		\
-do {				\
-	ErrorF x;		\
-	return FALSE;		\
+#define ATI_FALLBACK(x)			\
+do {					\
+	ErrorF("%s: ", __FUNCTION__);	\
+	ErrorF x;			\
+	return FALSE;			\
 } while (0)
 #else
 #define ATI_FALLBACK(x) return FALSE



More information about the xserver-commit mailing list