diff options
author | Brice Goglin <bgoglin@debian.org> | 2008-06-27 07:11:58 +0200 |
---|---|---|
committer | Brice Goglin <bgoglin@debian.org> | 2008-06-27 07:11:58 +0200 |
commit | 45d5d763b5b7170b3535af1d5a933a2b67a989fe (patch) | |
tree | cb29ce9eb7f390ba6901f5d9e27818629a9f79af | |
parent | d0c85bce3fcb03c12438f598dda6a9e76562a86d (diff) | |
parent | c83fbdfa076c107012b7dfbbfbbb2feede00542b (diff) | |
download | xf86-video-ati-frc-45d5d763b5b7170b3535af1d5a933a2b67a989fe.tar.gz xf86-video-ati-frc-45d5d763b5b7170b3535af1d5a933a2b67a989fe.tar.bz2 |
Merge tag 'xf86-video-ati-6.9.0' into debian-unstable
-rw-r--r-- | configure.ac | 62 | ||||
-rw-r--r-- | src/radeon_accel.c | 6 | ||||
-rw-r--r-- | src/radeon_accelfuncs.c | 40 | ||||
-rw-r--r-- | src/radeon_atombios.c | 7 | ||||
-rw-r--r-- | src/radeon_exa.c | 2 | ||||
-rw-r--r-- | src/radeon_exa_funcs.c | 25 | ||||
-rw-r--r-- | src/radeon_exa_render.c | 23 | ||||
-rw-r--r-- | src/radeon_macros.h | 16 | ||||
-rw-r--r-- | src/radeon_reg.h | 1 | ||||
-rw-r--r-- | src/radeon_textured_videofuncs.c | 13 |
10 files changed, 173 insertions, 22 deletions
diff --git a/configure.ac b/configure.ac index beafb7e..b8c18a6 100644 --- a/configure.ac +++ b/configure.ac @@ -22,7 +22,7 @@ AC_PREREQ(2.57) AC_INIT([xf86-video-ati], - 6.8.192, + 6.9.0, [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], xf86-video-ati) @@ -244,6 +244,66 @@ if test "x$XSERVER_LIBPCIACCESS" = xyes; then fi AM_CONDITIONAL(XSERVER_LIBPCIACCESS, test "x$XSERVER_LIBPCIACCESS" = xyes) +# Checks for headers/macros for byte swapping +# Known variants: +# <byteswap.h> bswap_16, bswap_32, bswap_64 (glibc) +# <sys/endian.h> __swap16, __swap32, __swap64 (OpenBSD) +# <sys/endian.h> bswap16, bswap32, bswap64 (other BSD's) +# and a fallback to local macros if none of the above are found + +# if <byteswap.h> is found, assume it's the correct version +AC_CHECK_HEADERS([byteswap.h]) + +# if <sys/endian.h> is found, have to check which version +AC_CHECK_HEADER([sys/endian.h], [HAVE_SYS_ENDIAN_H="yes"], [HAVE_SYS_ENDIAN_H="no"]) + +if test "x$HAVE_SYS_ENDIAN_H" = "xyes" ; then + AC_MSG_CHECKING([for __swap16 variant of <sys/endian.h> byteswapping macros]) + AC_LINK_IFELSE([AC_LANG_PROGRAM([ +#include <sys/types.h> +#include <sys/endian.h> + ], [ +int a = 1, b; +b = __swap16(a); + ]) +], [SYS_ENDIAN__SWAP='yes'], [SYS_ENDIAN__SWAP='no']) + AC_MSG_RESULT([$SYS_ENDIAN__SWAP]) + + AC_MSG_CHECKING([for bswap16 variant of <sys/endian.h> byteswapping macros]) + AC_LINK_IFELSE([AC_LANG_PROGRAM([ +#include <sys/types.h> +#include <sys/endian.h> + ], [ +int a = 1, b; +b = bswap16(a); + ]) +], [SYS_ENDIAN_BSWAP='yes'], [SYS_ENDIAN_BSWAP='no']) + AC_MSG_RESULT([$SYS_ENDIAN_BSWAP]) + + if test "$SYS_ENDIAN_BSWAP" = "yes" ; then + USE_SYS_ENDIAN_H=yes + BSWAP=bswap + else + if test "$SYS_ENDIAN__SWAP" = "yes" ; then + USE_SYS_ENDIAN_H=yes + BSWAP=__swap + else + USE_SYS_ENDIAN_H=no + fi + fi + + if test "$USE_SYS_ENDIAN_H" = "yes" ; then + AC_DEFINE([USE_SYS_ENDIAN_H], 1, + [Define to use byteswap macros from <sys/endian.h>]) + AC_DEFINE_UNQUOTED([bswap_16], ${BSWAP}16, + [Define to 16-bit byteswap macro]) + AC_DEFINE_UNQUOTED([bswap_32], ${BSWAP}32, + [Define to 32-bit byteswap macro]) + AC_DEFINE_UNQUOTED([bswap_64], ${BSWAP}64, + [Define to 64-bit byteswap macro]) + fi +fi + case $host_os in *linux*) AC_DEFINE(FGL_LINUX, 1, [Use linux pragma pack]) ;; diff --git a/src/radeon_accel.c b/src/radeon_accel.c index d45e932..65ad33d 100644 --- a/src/radeon_accel.c +++ b/src/radeon_accel.c @@ -371,7 +371,7 @@ void RADEONEngineInit(ScrnInfoPtr pScrn) info->CurrentLayout.bitsPerPixel); #ifdef XF86DRI - if (info->directRenderingEnabled && (IS_R300_3D | IS_R500_3D)) { + if (info->directRenderingEnabled && (IS_R300_3D || IS_R500_3D)) { drmRadeonGetParam np; int num_pipes; @@ -419,11 +419,11 @@ void RADEONEngineInit(ScrnInfoPtr pScrn) } } - if (IS_R300_3D | IS_R500_3D) + if (IS_R300_3D || IS_R500_3D) xf86DrvMsg(pScrn->scrnIndex, X_INFO, "num pipes is %d\n", info->num_gb_pipes); - if (IS_R300_3D | IS_R500_3D) { + if (IS_R300_3D || IS_R500_3D) { uint32_t gb_tile_config = (R300_ENABLE_TILING | R300_TILE_SIZE_16 | R300_SUBPIXEL_1_16); switch(info->num_gb_pipes) { diff --git a/src/radeon_accelfuncs.c b/src/radeon_accelfuncs.c index 3c0b8a0..56793cd 100644 --- a/src/radeon_accelfuncs.c +++ b/src/radeon_accelfuncs.c @@ -151,6 +151,11 @@ FUNC_NAME(RADEONSetupForSolidFill)(ScrnInfoPtr pScrn, | RADEON_DST_Y_TOP_TO_BOTTOM)); FINISH_ACCEL(); + BEGIN_ACCEL(2); + OUT_ACCEL_REG(RADEON_DSTCACHE_CTLSTAT, RADEON_RB2D_DC_FLUSH_ALL); + OUT_ACCEL_REG(RADEON_WAIT_UNTIL, + RADEON_WAIT_2D_IDLECLEAN | RADEON_WAIT_DMA_GUI_IDLE); + FINISH_ACCEL(); } /* Subsequent XAA SolidFillRect @@ -205,6 +210,11 @@ FUNC_NAME(RADEONSetupForSolidLine)(ScrnInfoPtr pScrn, OUT_ACCEL_REG(RADEON_DP_WRITE_MASK, planemask); FINISH_ACCEL(); + BEGIN_ACCEL(2); + OUT_ACCEL_REG(RADEON_DSTCACHE_CTLSTAT, RADEON_RB2D_DC_FLUSH_ALL); + OUT_ACCEL_REG(RADEON_WAIT_UNTIL, + RADEON_WAIT_2D_IDLECLEAN | RADEON_WAIT_DMA_GUI_IDLE); + FINISH_ACCEL(); } /* Subsequent XAA solid horizontal and vertical lines */ @@ -324,6 +334,11 @@ FUNC_NAME(RADEONSetupForDashedLine)(ScrnInfoPtr pScrn, OUT_ACCEL_REG(RADEON_BRUSH_DATA0, pat); FINISH_ACCEL(); + BEGIN_ACCEL(2); + OUT_ACCEL_REG(RADEON_DSTCACHE_CTLSTAT, RADEON_RB2D_DC_FLUSH_ALL); + OUT_ACCEL_REG(RADEON_WAIT_UNTIL, + RADEON_WAIT_2D_IDLECLEAN | RADEON_WAIT_DMA_GUI_IDLE); + FINISH_ACCEL(); } /* Helper function to draw last point for dashed lines */ @@ -358,6 +373,11 @@ FUNC_NAME(RADEONDashedLastPel)(ScrnInfoPtr pScrn, OUT_ACCEL_REG(RADEON_DP_BRUSH_FRGD_CLR, info->dash_fg); FINISH_ACCEL(); + BEGIN_ACCEL(2); + OUT_ACCEL_REG(RADEON_DSTCACHE_CTLSTAT, RADEON_RB2D_DC_FLUSH_ALL); + OUT_ACCEL_REG(RADEON_WAIT_UNTIL, + RADEON_WAIT_2D_IDLECLEAN | RADEON_WAIT_DMA_GUI_IDLE); + FINISH_ACCEL(); } /* Subsequent XAA dashed line */ @@ -461,6 +481,11 @@ FUNC_NAME(RADEONSetupForScreenToScreenCopy)(ScrnInfoPtr pScrn, (ydir >= 0 ? RADEON_DST_Y_TOP_TO_BOTTOM : 0))); FINISH_ACCEL(); + BEGIN_ACCEL(2); + OUT_ACCEL_REG(RADEON_DSTCACHE_CTLSTAT, RADEON_RB2D_DC_FLUSH_ALL); + OUT_ACCEL_REG(RADEON_WAIT_UNTIL, + RADEON_WAIT_2D_IDLECLEAN | RADEON_WAIT_DMA_GUI_IDLE); + FINISH_ACCEL(); info->trans_color = trans_color; FUNC_NAME(RADEONSetTransparency)(pScrn, trans_color); @@ -553,6 +578,11 @@ FUNC_NAME(RADEONSetupForMono8x8PatternFill)(ScrnInfoPtr pScrn, #endif FINISH_ACCEL(); + BEGIN_ACCEL(2); + OUT_ACCEL_REG(RADEON_DSTCACHE_CTLSTAT, RADEON_RB2D_DC_FLUSH_ALL); + OUT_ACCEL_REG(RADEON_WAIT_UNTIL, + RADEON_WAIT_2D_IDLECLEAN | RADEON_WAIT_DMA_GUI_IDLE); + FINISH_ACCEL(); } /* Subsequent XAA 8x8 pattern color expansion. Because they are used in @@ -1086,6 +1116,11 @@ FUNC_NAME(RADEONSetClippingRectangle)(ScrnInfoPtr pScrn, OUT_ACCEL_REG(RADEON_SC_BOTTOM_RIGHT, tmp2); FINISH_ACCEL(); + BEGIN_ACCEL(2); + OUT_ACCEL_REG(RADEON_DSTCACHE_CTLSTAT, RADEON_RB2D_DC_FLUSH_ALL); + OUT_ACCEL_REG(RADEON_WAIT_UNTIL, + RADEON_WAIT_2D_IDLECLEAN | RADEON_WAIT_DMA_GUI_IDLE); + FINISH_ACCEL(); FUNC_NAME(RADEONSetTransparency)(pScrn, info->trans_color); } @@ -1105,6 +1140,11 @@ FUNC_NAME(RADEONDisableClipping)(ScrnInfoPtr pScrn) RADEON_DEFAULT_SC_BOTTOM_MAX)); FINISH_ACCEL(); + BEGIN_ACCEL(2); + OUT_ACCEL_REG(RADEON_DSTCACHE_CTLSTAT, RADEON_RB2D_DC_FLUSH_ALL); + OUT_ACCEL_REG(RADEON_WAIT_UNTIL, + RADEON_WAIT_2D_IDLECLEAN | RADEON_WAIT_DMA_GUI_IDLE); + FINISH_ACCEL(); FUNC_NAME(RADEONSetTransparency)(pScrn, info->trans_color); } diff --git a/src/radeon_atombios.c b/src/radeon_atombios.c index 900e928..20aa722 100644 --- a/src/radeon_atombios.c +++ b/src/radeon_atombios.c @@ -1787,6 +1787,13 @@ RADEONGetATOMConnectorInfoFromBIOSConnectorTable (ScrnInfoPtr pScrn) continue; } #endif +#if 1 + if (i == ATOM_DEVICE_TV1_INDEX) { + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Skipping TV-Out\n"); + info->BiosConnector[i].valid = FALSE; + continue; + } +#endif info->BiosConnector[i].valid = TRUE; info->BiosConnector[i].output_id = ci.sucI2cId.sbfAccess.bfI2C_LineMux; diff --git a/src/radeon_exa.c b/src/radeon_exa.c index 0193a28..f461f3c 100644 --- a/src/radeon_exa.c +++ b/src/radeon_exa.c @@ -323,7 +323,7 @@ do { \ case EXA_ENGINEMODE_UNKNOWN: \ wait_until |= RADEON_WAIT_HOST_IDLECLEAN | RADEON_WAIT_3D_IDLECLEAN; \ case EXA_ENGINEMODE_2D: \ - wait_until |= RADEON_WAIT_2D_IDLECLEAN; \ + wait_until |= RADEON_WAIT_2D_IDLECLEAN | RADEON_WAIT_DMA_GUI_IDLE; \ case EXA_ENGINEMODE_3D: \ break; \ } \ diff --git a/src/radeon_exa_funcs.c b/src/radeon_exa_funcs.c index 13a7de5..56de23e 100644 --- a/src/radeon_exa_funcs.c +++ b/src/radeon_exa_funcs.c @@ -124,7 +124,6 @@ FUNC_NAME(RADEONPrepareSolid)(PixmapPtr pPix, int alu, Pixel pm, Pixel fg) static void FUNC_NAME(RADEONSolid)(PixmapPtr pPix, int x1, int y1, int x2, int y2) { - RINFO_FROM_SCREEN(pPix->drawable.pScreen); ACCEL_PREAMBLE(); @@ -139,7 +138,16 @@ FUNC_NAME(RADEONSolid)(PixmapPtr pPix, int x1, int y1, int x2, int y2) static void FUNC_NAME(RADEONDoneSolid)(PixmapPtr pPix) { + RINFO_FROM_SCREEN(pPix->drawable.pScreen); + ACCEL_PREAMBLE(); + TRACE; + + BEGIN_ACCEL(2); + OUT_ACCEL_REG(RADEON_DSTCACHE_CTLSTAT, RADEON_RB2D_DC_FLUSH_ALL); + OUT_ACCEL_REG(RADEON_WAIT_UNTIL, + RADEON_WAIT_2D_IDLECLEAN | RADEON_WAIT_DMA_GUI_IDLE); + FINISH_ACCEL(); } void @@ -206,7 +214,6 @@ FUNC_NAME(RADEONCopy)(PixmapPtr pDst, int dstX, int dstY, int w, int h) { - RINFO_FROM_SCREEN(pDst->drawable.pScreen); ACCEL_PREAMBLE(); @@ -233,7 +240,16 @@ FUNC_NAME(RADEONCopy)(PixmapPtr pDst, static void FUNC_NAME(RADEONDoneCopy)(PixmapPtr pDst) { + RINFO_FROM_SCREEN(pDst->drawable.pScreen); + ACCEL_PREAMBLE(); + TRACE; + + BEGIN_ACCEL(2); + OUT_ACCEL_REG(RADEON_DSTCACHE_CTLSTAT, RADEON_RB2D_DC_FLUSH_ALL); + OUT_ACCEL_REG(RADEON_WAIT_UNTIL, + RADEON_WAIT_2D_IDLECLEAN | RADEON_WAIT_DMA_GUI_IDLE); + FINISH_ACCEL(); } static Bool @@ -343,6 +359,11 @@ RADEONBlitChunk(ScrnInfoPtr pScrn, uint32_t datatype, uint32_t src_pitch_offset, OUT_ACCEL_REG(RADEON_DST_Y_X, (dstY << 16) | dstX); OUT_ACCEL_REG(RADEON_DST_HEIGHT_WIDTH, (h << 16) | w); FINISH_ACCEL(); + BEGIN_ACCEL(2); + OUT_ACCEL_REG(RADEON_DSTCACHE_CTLSTAT, RADEON_RB2D_DC_FLUSH_ALL); + OUT_ACCEL_REG(RADEON_WAIT_UNTIL, + RADEON_WAIT_2D_IDLECLEAN | RADEON_WAIT_DMA_GUI_IDLE); + FINISH_ACCEL(); } #endif diff --git a/src/radeon_exa_render.c b/src/radeon_exa_render.c index 2319e3b..4736e4f 100644 --- a/src/radeon_exa_render.c +++ b/src/radeon_exa_render.c @@ -1978,7 +1978,7 @@ static void FUNC_NAME(RadeonCompositeTile)(PixmapPtr pDst, RADEON_CP_VC_CNTL_VTX_FMT_RADEON_MODE | (4 << RADEON_CP_VC_CNTL_NUM_SHIFT)); } else { - if (IS_R300_3D | IS_R500_3D) + if (IS_R300_3D || IS_R500_3D) BEGIN_RING(4 * vtx_count + 4); else BEGIN_RING(4 * vtx_count + 2); @@ -1991,7 +1991,7 @@ static void FUNC_NAME(RadeonCompositeTile)(PixmapPtr pDst, } #else /* ACCEL_CP */ - if (IS_R300_3D | IS_R500_3D) + if (IS_R300_3D || IS_R500_3D) BEGIN_ACCEL(2 + vtx_count * 4); else BEGIN_ACCEL(1 + vtx_count * 4); @@ -2032,7 +2032,7 @@ static void FUNC_NAME(RadeonCompositeTile)(PixmapPtr pDst, xFixedToFloat(srcTopRight.x) / info->texW[0], xFixedToFloat(srcTopRight.y) / info->texH[0]); } - if (IS_R300_3D | IS_R500_3D) + if (IS_R300_3D || IS_R500_3D) /* flushing is pipelined, free/finish is not */ OUT_ACCEL_REG(R300_RB3D_DSTCACHE_CTLSTAT, R300_DC_FLUSH_3D); @@ -2114,18 +2114,13 @@ static void FUNC_NAME(RadeonDoneComposite)(PixmapPtr pDst) ENTER_DRAW(0); - if (IS_R500_3D || ((info->ChipFamily == CHIP_FAMILY_RS400) || - (info->ChipFamily == CHIP_FAMILY_RS480) || - (info->ChipFamily == CHIP_FAMILY_RS600) || - (info->ChipFamily == CHIP_FAMILY_RS690) || - (info->ChipFamily == CHIP_FAMILY_RS740))) { - /* r500 shows corruption on small things like glyphs without a 3D idle - * IGP shows more substantial corruption - */ + if (IS_R300_3D || IS_R500_3D) { + BEGIN_ACCEL(2); + OUT_ACCEL_REG(R300_RB3D_DSTCACHE_CTLSTAT, R300_RB3D_DC_FLUSH_ALL); + } else BEGIN_ACCEL(1); - OUT_ACCEL_REG(RADEON_WAIT_UNTIL, RADEON_WAIT_3D_IDLECLEAN); - FINISH_ACCEL(); - } + OUT_ACCEL_REG(RADEON_WAIT_UNTIL, RADEON_WAIT_3D_IDLECLEAN); + FINISH_ACCEL(); LEAVE_DRAW(0); } diff --git a/src/radeon_macros.h b/src/radeon_macros.h index 3675dc5..afe442e 100644 --- a/src/radeon_macros.h +++ b/src/radeon_macros.h @@ -51,7 +51,23 @@ #include "compiler.h" +#if HAVE_BYTESWAP_H #include <byteswap.h> +#elif defined(USE_SYS_ENDIAN_H) +#include <sys/endian.h> +#else +#define bswap_16(value) \ + ((((value) & 0xff) << 8) | ((value) >> 8)) + +#define bswap_32(value) \ + (((uint32_t)bswap_16((uint16_t)((value) & 0xffff)) << 16) | \ + (uint32_t)bswap_16((uint16_t)((value) >> 16))) + +#define bswap_64(value) \ + (((uint64_t)bswap_32((uint32_t)((value) & 0xffffffff)) \ + << 32) | \ + (uint64_t)bswap_32((uint32_t)((value) >> 32))) +#endif #if X_BYTE_ORDER == X_BIG_ENDIAN #define le32_to_cpu(x) bswap_32(x) diff --git a/src/radeon_reg.h b/src/radeon_reg.h index 52795b1..59e2f12 100644 --- a/src/radeon_reg.h +++ b/src/radeon_reg.h @@ -1458,6 +1458,7 @@ # define RADEON_RB2D_DC_FLUSH_ALL 0xf # define RADEON_RB2D_DC_BUSY (1 << 31) #define RADEON_RB2D_DSTCACHE_MODE 0x3428 +#define RADEON_DSTCACHE_CTLSTAT 0x1714 #define RADEON_RB3D_ZCACHE_MODE 0x3250 #define RADEON_RB3D_ZCACHE_CTLSTAT 0x3254 diff --git a/src/radeon_textured_videofuncs.c b/src/radeon_textured_videofuncs.c index d5d1b1c..277d9b2 100644 --- a/src/radeon_textured_videofuncs.c +++ b/src/radeon_textured_videofuncs.c @@ -117,7 +117,10 @@ FUNC_NAME(RADEONDisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv OUT_VIDEO_REG(RADEON_RB3D_DSTCACHE_CTLSTAT, RADEON_RB3D_DC_FLUSH); /* We must wait for 3d to idle, in case source was just written as a dest. */ OUT_VIDEO_REG(RADEON_WAIT_UNTIL, - RADEON_WAIT_HOST_IDLECLEAN | RADEON_WAIT_2D_IDLECLEAN | RADEON_WAIT_3D_IDLECLEAN); + RADEON_WAIT_HOST_IDLECLEAN | + RADEON_WAIT_2D_IDLECLEAN | + RADEON_WAIT_3D_IDLECLEAN | + RADEON_WAIT_DMA_GUI_IDLE); FINISH_VIDEO(); if (IS_R300_3D || IS_R500_3D) { @@ -640,6 +643,14 @@ FUNC_NAME(RADEONDisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv pBox++; } + if (IS_R300_3D || IS_R500_3D) { + BEGIN_VIDEO(2); + OUT_VIDEO_REG(R300_RB3D_DSTCACHE_CTLSTAT, R300_RB3D_DC_FLUSH_ALL); + } else + BEGIN_VIDEO(1); + OUT_VIDEO_REG(RADEON_WAIT_UNTIL, RADEON_WAIT_3D_IDLECLEAN); + FINISH_VIDEO(); + DamageDamageRegion(pPriv->pDraw, &pPriv->clip); } |