xserver/hw/kdrive/ati ati.c, 1.14, 1.15 ati.h, 1.8, 1.9 ati_cursor.c, 1.2, 1.3 ati_draw.c, 1.17, 1.18

Keith Packard <xserver-commit-u7BhqnqprCWvj1b/[email protected]>
Newsgroups gmane.comp.freedesktop.xserver.cvs
Message-ID <[email protected]>
Committed by: keithp

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

Modified Files:
	ati.c ati.h ati_cursor.c ati_draw.c 
Log Message:
2004-06-27  Keith Packard  <[email protected]>

	* hw/kdrive/ati/ati.c: (ATICardInit), (ATISetOffscreen),
	(ATIScreenInit), (ATIRandRSetConfig), (ATIRandRInit),
	(ATIFinishInitScreen), (ATIEnable):
	* hw/kdrive/ati/ati.h:
	* hw/kdrive/ati/ati_cursor.c: (ATICursorInit):
	* hw/kdrive/ati/ati_draw.c: (RadeonSwitchTo2D), (RadeonSwitchTo3D),
	(ATIBlockHandler), (ATIWakeupHandler), (ATIDrawEnable),
	(ATIDrawDisable), (ATIDrawFini):
	Separate out off-screen allocation from Init.
	Fix Enable to update off-screen addresses.
	Wrap RandR to update off-screen addresses.
	
	* hw/kdrive/fbdev/fbdev.c: (fbdevMapFramebuffer):
	Set off_screen_base and memory_size fields correctly.


Index: ati.c
===================================================================
RCS file: /cvs/xserver/xserver/hw/kdrive/ati/ati.c,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -d -r1.14 -r1.15
--- ati.c	26 Jun 2004 04:13:02 -0000	1.14
+++ ati.c	28 Jun 2004 00:48:51 -0000	1.15
@@ -203,6 +203,9 @@
 		atic->backend_funcs.disable = fbdevDisable;
 		atic->backend_funcs.getColors = fbdevGetColors;
 		atic->backend_funcs.putColors = fbdevPutColors;
+#ifdef RANDR
+		atic->backend_funcs.randrSetConfig = fbdevRandRSetConfig;
+#endif
 	}
 #endif
 #ifdef KDRIVEVESA
@@ -221,6 +224,9 @@
 		atic->backend_funcs.disable = vesaDisable;
 		atic->backend_funcs.getColors = vesaGetColors;
 		atic->backend_funcs.putColors = vesaPutColors;
+#ifdef RANDR
+		atic->backend_funcs.randrSetConfig = vesaRandRSetConfig;
+#endif
 	}
 #endif
 
@@ -277,62 +283,31 @@
 	atic->backend_funcs.cardfini(card);
 }
 
-static Bool
-ATIScreenInit(KdScreenInfo *screen)
+/*
+ * Once screen->off_screen_base is set, this function
+ * allocates the remaining memory appropriately
+ */
+
+static void
+ATISetOffscreen (KdScreenInfo *screen)
 {
-	ATIScreenInfo *atis;
 	ATICardInfo(screen);
-	Bool success = FALSE;
-	int screen_size = 0;
-	int cursor_size;
+	ATIScreenInfo *atis = (ATIScreenInfo *)screen->driver;
+	int screen_size = screen->fb[0].byteStride * screen->height;
 #if defined(USE_DRI) && defined(GLXEXT)
 	int l;
 #endif
 
-	atis = xcalloc(sizeof(ATIScreenInfo), 1);
-	if (atis == NULL)
-		return FALSE;
-
-	atis->atic = atic;
-	atis->screen = screen;
-	screen->driver = atis;
-
-#ifdef KDRIVEFBDEV
-	if (atic->use_fbdev) {
-		success = fbdevScreenInitialize(screen,
-						&atis->backend_priv.fbdev);
-		screen->memory_size = atic->backend_priv.fbdev.fix.smem_len;
-		screen_size = atic->backend_priv.fbdev.var.yres_virtual *
-		    screen->fb[0].byteStride;
-	}
-#endif
-#ifdef KDRIVEVESA
-	if (atic->use_vesa) {
-		if (screen->fb[0].depth == 0)
-			screen->fb[0].depth = 16;
-		success = vesaScreenInitialize(screen,
-		    &atis->backend_priv.vesa);
-		screen_size = screen->off_screen_base;
-	}
-#endif
-
-	if (!success) {
-		screen->driver = NULL;
-		xfree(atis);
-		return FALSE;
-	}
-
 	screen->off_screen_base = screen_size;
 
 	if (atic->is_radeon)
-		cursor_size = ATI_CURSOR_HEIGHT * ATI_CURSOR_WIDTH * 4;
+		atis->cursor.cursor_size = ATI_CURSOR_HEIGHT * ATI_CURSOR_WIDTH * 4;
 	else
-		cursor_size = ATI_CURSOR_HEIGHT * ATI_CURSOR_PITCH * 2;
-	/* Reserve the area for the cursor. */
-	if (screen->off_screen_base + cursor_size <= screen->memory_size) {
-		atis->cursor.offset = screen->off_screen_base;
-		screen->off_screen_base += cursor_size;
-	}
+		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
@@ -393,13 +368,84 @@
 		atis->scratch_offset = screen->off_screen_base;
 		screen->off_screen_base += atis->scratch_size;
 		atis->scratch_next = atis->scratch_offset;
-	} else {
+	}
+	else 
+	{
 		atis->scratch_size = 0;
 	}
+}
+
+static Bool
+ATIScreenInit(KdScreenInfo *screen)
+{
+	ATIScreenInfo *atis;
+	ATICardInfo(screen);
+	Bool success = FALSE;
+
+	atis = xcalloc(sizeof(ATIScreenInfo), 1);
+	if (atis == NULL)
+		return FALSE;
+
+	atis->atic = atic;
+	atis->screen = screen;
+	screen->driver = atis;
+
+	if (screen->fb[0].depth == 0)
+		screen->fb[0].depth = 16;
+#ifdef KDRIVEFBDEV
+	if (atic->use_fbdev) {
+		success = fbdevScreenInitialize(screen,
+						&atis->backend_priv.fbdev);
+	}
+#endif
+#ifdef KDRIVEVESA
+	if (atic->use_vesa) {
+		success = vesaScreenInitialize(screen,
+					       &atis->backend_priv.vesa);
+	}
+#endif
+
+	if (!success) {
+		screen->driver = NULL;
+		xfree(atis);
+		return FALSE;
+	}
+
+	ATISetOffscreen (screen);
 
 	return TRUE;
 }
 
+#ifdef RANDR
+static Bool
+ATIRandRSetConfig (ScreenPtr		pScreen,
+		   Rotation		randr,
+		   int			rate,
+		   RRScreenSizePtr	pSize)
+{
+	KdScreenPriv(pScreen);
+	KdScreenInfo *screen = pScreenPriv->screen;
+	ATICardInfo *atic = screen->card->driver;
+	Bool ret;
+
+	ATIDrawDisable (pScreen);
+	ret = atic->backend_funcs.randrSetConfig(pScreen, randr, rate, pSize);
+	ATISetOffscreen (screen);
+	ATIDrawEnable (pScreen);
+	return ret;
+}
+
+static Bool
+ATIRandRInit (ScreenPtr pScreen)
+{
+    rrScrPrivPtr    pScrPriv;
+    
+    pScrPriv = rrGetScrPriv(pScreen);
+    pScrPriv->rrSetConfig = ATIRandRSetConfig;
+    return TRUE;
+}
+#endif
+
 static void
 ATIScreenFini(KdScreenInfo *screen)
 {
@@ -459,7 +505,13 @@
 	KdScreenPriv(pScreen);
 	ATICardInfo(pScreenPriv);
 
-	return atic->backend_funcs.finishInitScreen(pScreen);
+	if (!atic->backend_funcs.finishInitScreen(pScreen))
+		return FALSE;
+#ifdef RANDR
+	if (!ATIRandRInit (pScreen))
+		return FALSE;
+#endif
+	return TRUE;
 }
 
 static Bool
@@ -507,6 +559,8 @@
 	if (!atic->backend_funcs.enable(pScreen))
 		return FALSE;
 
+	ATISetOffscreen (pScreenPriv->screen);
+
 	if ((atic->reg_base == NULL) && !ATIMapReg(pScreenPriv->screen->card,
 	    atic))
 		return FALSE;

Index: ati.h
===================================================================
RCS file: /cvs/xserver/xserver/hw/kdrive/ati/ati.h,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -d -r1.8 -r1.9
--- ati.h	17 May 2004 20:18:02 -0000	1.8
+++ ati.h	28 Jun 2004 00:48:51 -0000	1.9
@@ -122,6 +122,9 @@
 	void    (*disable)(ScreenPtr);
 	void    (*getColors)(ScreenPtr, int, int, xColorItem *);
 	void    (*putColors)(ScreenPtr, int, int, xColorItem *);
+#ifdef RANDR
+	Bool	(*randrSetConfig) (ScreenPtr, Rotation, int, RRScreenSizePtr);
+#endif
 };
 
 typedef struct _ATICardInfo {
@@ -161,6 +164,8 @@
 	Pixel		source, mask;
 	KdOffscreenArea	*area;
 	CARD32		offset;
+	
+	int		cursor_size;
 } ATICursor;
 
 typedef struct _ATIPortPriv {

Index: ati_cursor.c
===================================================================
RCS file: /cvs/xserver/xserver/hw/kdrive/ati/ati_cursor.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- ati_cursor.c	26 Jun 2004 04:13:03 -0000	1.2
+++ ati_cursor.c	28 Jun 2004 00:48:51 -0000	1.3
@@ -495,7 +495,7 @@
 
 	pCurPriv->has_cursor = FALSE;
 
-	if (pCurPriv->offset == 0)
+	if (pCurPriv->cursor_size == 0)
 		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.17
retrieving revision 1.18
diff -u -d -r1.17 -r1.18
--- ati_draw.c	26 Jun 2004 04:13:03 -0000	1.17
+++ ati_draw.c	28 Jun 2004 00:48:51 -0000	1.18
@@ -175,7 +175,9 @@
 {
 	RING_LOCALS;
 
-	BEGIN_DMA(2);
+	BEGIN_DMA(4);
+	OUT_REG(RADEON_REG_RB2D_DSTCACHE_CTLSTAT,
+		RADEON_RB2D_DC_FLUSH);
 	OUT_REG(ATI_REG_WAIT_UNTIL,
 	    RADEON_WAIT_HOST_IDLECLEAN | RADEON_WAIT_3D_IDLECLEAN);
 	END_DMA();
@@ -186,7 +188,9 @@
 {
 	RING_LOCALS;
 
-	BEGIN_DMA(2);
+	BEGIN_DMA(4);
+	OUT_REG(RADEON_REG_RB2D_DSTCACHE_CTLSTAT,
+		RADEON_RB2D_DC_FLUSH);
 	OUT_REG(ATI_REG_WAIT_UNTIL,
 	    RADEON_WAIT_HOST_IDLECLEAN | RADEON_WAIT_2D_IDLECLEAN);
 	END_DMA();
@@ -658,10 +662,9 @@
 }
 
 static void
-ATIBlockHandler (int screen, pointer blockData, pointer timeout,
-    pointer readmask)
+ATIBlockHandler (pointer blockData, OSTimePtr timeout, pointer readmask)
 {
-	ScreenPtr pScreen = screenInfo.screens[screen];
+	ScreenPtr pScreen = (ScreenPtr) blockData;
 	KdScreenPriv(pScreen);
 	ATIScreenInfo(pScreenPriv);
 
@@ -671,6 +674,11 @@
 	ATIFlushIndirect(atis, 1);
 }
 
+static void
+ATIWakeupHandler (pointer blockData, int result, pointer readmask)
+{
+}
+
 Bool
 ATIDrawInit(ScreenPtr pScreen)
 {
@@ -774,8 +782,8 @@
 	atis->kaa.UploadToScreen = ATIUploadToScreen;
 	atis->kaa.UploadToScratch = ATIUploadToScratch;
 
-	atis->save_blockhandler = pScreen->BlockHandler;
-	pScreen->BlockHandler = ATIBlockHandler;
+	RegisterBlockAndWakeupHandlers (ATIBlockHandler, ATIWakeupHandler,
+				       pScreen);
 
 	KdMarkSync(pScreen);
 }
@@ -783,19 +791,17 @@
 void
 ATIDrawDisable(ScreenPtr pScreen)
 {
-	KdScreenPriv(pScreen);
-	ATIScreenInfo(pScreenPriv);
-
 	ATIDMATeardown(pScreen);
 
-	pScreen->BlockHandler = atis->save_blockhandler;
+	RemoveBlockAndWakeupHandlers (ATIBlockHandler, ATIWakeupHandler,
+				      pScreen);
 }
 
 void
 ATIDrawFini(ScreenPtr pScreen)
 {
-	KdScreenPriv(pScreen);
 #ifdef USE_DRI
+	KdScreenPriv(pScreen);
 	ATIScreenInfo(pScreenPriv);
 	if (atis->using_dri) {
 		ATIDRICloseScreen(pScreen);
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.