xf86-video-ati: Branch 'master' - 2 commits

Michel Dänzer daenzer at kemper.freedesktop.org
Sat Jan 24 02:11:44 PST 2009


 src/radeon_driver.c     |   14 -----
 src/radeon_exa_funcs.c  |  114 +++++++-----------------------------------------
 src/radeon_exa_render.c |   37 ++++++++-------
 3 files changed, 38 insertions(+), 127 deletions(-)

New commits:
commit 1c5678fc452dbc93135e9ece50a4cff6583f6078
Author: Michel Dänzer <daenzer at vmware.com>
Date:   Sat Jan 24 11:10:00 2009 +0100

    Drop memcpy fallbacks from EXA UploadToScreen and DownloadFromScreen hooks.
    
    While in theory it's possible for the PrepareAccess hook to fail on big endian
    platforms, in practice it isn't at this point because there's no other users of
    the surface registers.

diff --git a/src/radeon_driver.c b/src/radeon_driver.c
index e53edbb..22b2e4c 100644
--- a/src/radeon_driver.c
+++ b/src/radeon_driver.c
@@ -3361,15 +3361,9 @@ Bool RADEONScreenInit(int scrnIndex, ScreenPtr pScreen,
 #ifdef USE_EXA
     if (info->useEXA) {
 #ifdef XF86DRI
-	MessageType from = X_DEFAULT;
-
 	if (hasDRI) {
-	    info->accelDFS = info->cardType != CARD_AGP;
-
-	    if (xf86GetOptValInteger(info->Options, OPTION_ACCEL_DFS,
-				     &info->accelDFS)) {
-		from = X_CONFIG;
-	    }
+	    info->accelDFS = xf86ReturnOptValBool(info->Options, OPTION_ACCEL_DFS,
+						  info->cardType != CARD_AGP);
 
 	    /* Reserve approx. half of offscreen memory for local textures by
 	     * default, can be overridden with Option "FBTexPercent".
@@ -3387,10 +3381,6 @@ Bool RADEONScreenInit(int scrnIndex, ScreenPtr pScreen,
 		}
 	    }
 	}
-
-	xf86DrvMsg(pScrn->scrnIndex, from,
-		   "%ssing accelerated EXA DownloadFromScreen hook\n",
-		   info->accelDFS ? "U" : "Not u");
 #endif /* XF86DRI */
 
 	if (!RADEONSetupMemEXA(pScreen))
diff --git a/src/radeon_exa_funcs.c b/src/radeon_exa_funcs.c
index 55710ff..cd97cc6 100644
--- a/src/radeon_exa_funcs.c
+++ b/src/radeon_exa_funcs.c
@@ -256,31 +256,23 @@ FUNC_NAME(RADEONDoneCopy)(PixmapPtr pDst)
     FINISH_ACCEL();
 }
 
+
+#ifdef ACCEL_CP
+
 static Bool
-FUNC_NAME(RADEONUploadToScreen)(PixmapPtr pDst, int x, int y, int w, int h,
-				char *src, int src_pitch)
+RADEONUploadToScreenCP(PixmapPtr pDst, int x, int y, int w, int h,
+		       char *src, int src_pitch)
 {
     RINFO_FROM_SCREEN(pDst->drawable.pScreen);
-    uint8_t	   *dst	     = info->FB + exaGetPixmapOffset(pDst);
-    unsigned int   dst_pitch = exaGetPixmapPitch(pDst);
     unsigned int   bpp	     = pDst->drawable.bitsPerPixel;
-#ifdef ACCEL_CP
     unsigned int   hpass;
     uint32_t	   buf_pitch, dst_pitch_off;
-#endif
-#if X_BYTE_ORDER == X_BIG_ENDIAN
-    unsigned char *RADEONMMIO = info->MMIO;
-    unsigned int swapper = info->ModeReg->surface_cntl &
-	    ~(RADEON_NONSURF_AP0_SWP_32BPP | RADEON_NONSURF_AP1_SWP_32BPP |
-	      RADEON_NONSURF_AP0_SWP_16BPP | RADEON_NONSURF_AP1_SWP_16BPP);
-#endif
 
     TRACE;
 
     if (bpp < 8)
 	return FALSE;
 
-#ifdef ACCEL_CP
     if (info->directRenderingEnabled &&
 	RADEONGetPixmapOffsetPitch(pDst, &dst_pitch_off)) {
 	uint8_t *buf;
@@ -301,45 +293,11 @@ FUNC_NAME(RADEONUploadToScreen)(PixmapPtr pDst, int x, int y, int w, int h,
 
 	exaMarkSync(pDst->drawable.pScreen);
 	return TRUE;
-  }
-#endif
-
-    /* Do we need that sync here ? probably not .... */
-    exaWaitSync(pDst->drawable.pScreen);
-
-#if X_BYTE_ORDER == X_BIG_ENDIAN
-    switch(bpp) {
-    case 15:
-    case 16:
-	swapper |= RADEON_NONSURF_AP0_SWP_16BPP
-		|  RADEON_NONSURF_AP1_SWP_16BPP;
-	break;
-    case 24:
-    case 32:
-	swapper |= RADEON_NONSURF_AP0_SWP_32BPP
-		|  RADEON_NONSURF_AP1_SWP_32BPP;
-	break;
     }
-    OUTREG(RADEON_SURFACE_CNTL, swapper);
-#endif
-    w *= bpp / 8;
-    dst += (x * bpp / 8) + (y * dst_pitch);
-
-    while (h--) {
-	memcpy(dst, src, w);
-	src += src_pitch;
-	dst += dst_pitch;
-    }
-
-#if X_BYTE_ORDER == X_BIG_ENDIAN
-    /* restore byte swapping */
-    OUTREG(RADEON_SURFACE_CNTL, info->ModeReg->surface_cntl);
-#endif
 
-    return TRUE;
+    return FALSE;
 }
 
-#ifdef ACCEL_CP
 /* Emit blit with arbitrary source and destination offsets and pitches */
 static void
 RADEONBlitChunk(ScrnInfoPtr pScrn, uint32_t datatype, uint32_t src_pitch_offset,
@@ -372,36 +330,26 @@ RADEONBlitChunk(ScrnInfoPtr pScrn, uint32_t datatype, uint32_t src_pitch_offset,
                   RADEON_WAIT_2D_IDLECLEAN | RADEON_WAIT_DMA_GUI_IDLE);
     FINISH_ACCEL();
 }
-#endif
+
 
 static Bool
-FUNC_NAME(RADEONDownloadFromScreen)(PixmapPtr pSrc, int x, int y, int w, int h,
+RADEONDownloadFromScreenCP(PixmapPtr pSrc, int x, int y, int w, int h,
 				    char *dst, int dst_pitch)
 {
     RINFO_FROM_SCREEN(pSrc->drawable.pScreen);
-#if X_BYTE_ORDER == X_BIG_ENDIAN
-    unsigned char *RADEONMMIO = info->MMIO;
-    unsigned int swapper = info->ModeReg->surface_cntl &
-	    ~(RADEON_NONSURF_AP0_SWP_32BPP | RADEON_NONSURF_AP1_SWP_32BPP |
-	      RADEON_NONSURF_AP0_SWP_16BPP | RADEON_NONSURF_AP1_SWP_16BPP);
-#endif
     uint8_t	  *src	     = info->FB + exaGetPixmapOffset(pSrc);
-    int		   src_pitch = exaGetPixmapPitch(pSrc);
     int		   bpp	     = pSrc->drawable.bitsPerPixel;
-#ifdef ACCEL_CP
     uint32_t datatype, src_pitch_offset, scratch_pitch = (w * bpp/8 + 63) & ~63, scratch_off = 0;
     drmBufPtr scratch;
-#endif
 
     TRACE;
 
-#ifdef ACCEL_CP
     /*
      * Try to accelerate download. Use an indirect buffer as scratch space,
      * blitting the bits to one half while copying them out of the other one and
      * then swapping the halves.
      */
-    if (info->accelDFS && bpp != 24 && RADEONGetDatatypeBpp(bpp, &datatype) &&
+    if (bpp != 24 && RADEONGetDatatypeBpp(bpp, &datatype) &&
 	RADEONGetPixmapOffsetPitch(pSrc, &src_pitch_offset) &&
 	(scratch = RADEONCPGetBuffer(pScrn)))
     {
@@ -487,43 +435,12 @@ FUNC_NAME(RADEONDownloadFromScreen)(PixmapPtr pSrc, int x, int y, int w, int h,
 
 	return TRUE;
     }
-#endif
-
-    /* Can't accelerate download */
-    exaWaitSync(pSrc->drawable.pScreen);
 
-#if X_BYTE_ORDER == X_BIG_ENDIAN
-    switch(bpp) {
-    case 15:
-    case 16:
-	swapper |= RADEON_NONSURF_AP0_SWP_16BPP
-		|  RADEON_NONSURF_AP1_SWP_16BPP;
-	break;
-    case 24:
-    case 32:
-	swapper |= RADEON_NONSURF_AP0_SWP_32BPP
-		|  RADEON_NONSURF_AP1_SWP_32BPP;
-	break;
-    }
-    OUTREG(RADEON_SURFACE_CNTL, swapper);
-#endif
-
-    src += (x * bpp / 8) + (y * src_pitch);
-    w *= bpp / 8;
-
-    while (h--) {
-	memcpy(dst, src, w);
-	src += src_pitch;
-	dst += dst_pitch;
-    }
+    return FALSE;
+}
 
-#if X_BYTE_ORDER == X_BIG_ENDIAN
-    /* restore byte swapping */
-    OUTREG(RADEON_SURFACE_CNTL, info->ModeReg->surface_cntl);
-#endif
+#endif	/* def ACCEL_CP */
 
-    return TRUE;
-}
 
 Bool FUNC_NAME(RADEONDrawInit)(ScreenPtr pScreen)
 {
@@ -547,8 +464,11 @@ Bool FUNC_NAME(RADEONDrawInit)(ScreenPtr pScreen)
 
     info->accel_state->exa->MarkSync = FUNC_NAME(RADEONMarkSync);
     info->accel_state->exa->WaitMarker = FUNC_NAME(RADEONSync);
-    info->accel_state->exa->UploadToScreen = FUNC_NAME(RADEONUploadToScreen);
-    info->accel_state->exa->DownloadFromScreen = FUNC_NAME(RADEONDownloadFromScreen);
+#ifdef ACCEL_CP
+    info->accel_state->exa->UploadToScreen = RADEONUploadToScreenCP;
+    if (info->accelDFS)
+	info->accel_state->exa->DownloadFromScreen = RADEONDownloadFromScreenCP;
+#endif
 
 #if X_BYTE_ORDER == X_BIG_ENDIAN
     info->accel_state->exa->PrepareAccess = RADEONPrepareAccess;
commit 5cbd6082b9f8d7009ee9ef5e036673f99e1bfb05
Author: Michel Dänzer <daenzer at vmware.com>
Date:   Sat Jan 24 11:07:12 2009 +0100

    Don't transform EXA Composite mask coordinates when there's no mask.

diff --git a/src/radeon_exa_render.c b/src/radeon_exa_render.c
index 38a9ea7..5a368e6 100644
--- a/src/radeon_exa_render.c
+++ b/src/radeon_exa_render.c
@@ -1984,7 +1984,7 @@ static void FUNC_NAME(RadeonCompositeTile)(PixmapPtr pDst,
     RINFO_FROM_SCREEN(pDst->drawable.pScreen);
     int vtx_count;
     xPointFixed srcTopLeft, srcTopRight, srcBottomLeft, srcBottomRight;
-    xPointFixed maskTopLeft, maskTopRight, maskBottomLeft, maskBottomRight;
+    static xPointFixed maskTopLeft, maskTopRight, maskBottomLeft, maskBottomRight;
     ACCEL_PREAMBLE();
 
     ENTER_DRAW(0);
@@ -2001,31 +2001,32 @@ static void FUNC_NAME(RadeonCompositeTile)(PixmapPtr pDst,
     srcBottomRight.x = IntToxFixed(srcX + w);
     srcBottomRight.y = IntToxFixed(srcY + h);
 
-    maskTopLeft.x     = IntToxFixed(maskX);
-    maskTopLeft.y     = IntToxFixed(maskY);
-    maskTopRight.x    = IntToxFixed(maskX + w);
-    maskTopRight.y    = IntToxFixed(maskY);
-    maskBottomLeft.x  = IntToxFixed(maskX);
-    maskBottomLeft.y  = IntToxFixed(maskY + h);
-    maskBottomRight.x = IntToxFixed(maskX + w);
-    maskBottomRight.y = IntToxFixed(maskY + h);
-
     if (info->accel_state->is_transform[0]) {
 	transformPoint(info->accel_state->transform[0], &srcTopLeft);
 	transformPoint(info->accel_state->transform[0], &srcTopRight);
 	transformPoint(info->accel_state->transform[0], &srcBottomLeft);
 	transformPoint(info->accel_state->transform[0], &srcBottomRight);
     }
-    if (info->accel_state->is_transform[1]) {
-	transformPoint(info->accel_state->transform[1], &maskTopLeft);
-	transformPoint(info->accel_state->transform[1], &maskTopRight);
-	transformPoint(info->accel_state->transform[1], &maskBottomLeft);
-	transformPoint(info->accel_state->transform[1], &maskBottomRight);
-    }
 
-    if (info->accel_state->has_mask)
+    if (info->accel_state->has_mask) {
+	maskTopLeft.x     = IntToxFixed(maskX);
+	maskTopLeft.y     = IntToxFixed(maskY);
+	maskTopRight.x    = IntToxFixed(maskX + w);
+	maskTopRight.y    = IntToxFixed(maskY);
+	maskBottomLeft.x  = IntToxFixed(maskX);
+	maskBottomLeft.y  = IntToxFixed(maskY + h);
+	maskBottomRight.x = IntToxFixed(maskX + w);
+	maskBottomRight.y = IntToxFixed(maskY + h);
+
+	if (info->accel_state->is_transform[1]) {
+	    transformPoint(info->accel_state->transform[1], &maskTopLeft);
+	    transformPoint(info->accel_state->transform[1], &maskTopRight);
+	    transformPoint(info->accel_state->transform[1], &maskBottomLeft);
+	    transformPoint(info->accel_state->transform[1], &maskBottomRight);
+	}
+
 	vtx_count = 6;
-    else
+    } else
 	vtx_count = 4;
 
     FUNC_NAME(RADEONWaitForVLine)(pScrn, pDst, RADEONBiggerCrtcArea(pDst), dstY, dstY + h, info->accel_state->vsync);


More information about the xorg-commit mailing list