Add an OUT_RING_REG macro for use with DMA_PACKET0, which is like OUT_RING
but includes debugging to ensure that the reg being submitted is the one that follows in the packet. Convert most uses of OUT_RING to it, and convert a couple of OUT_REG sets to DMA_PACKET0/OUT_RING_REG. Also, add checking to see if more registers are submitted to a DMA_PACKET0 than should be, to avoid hangs during stupid mistakes (checking for less isn't done).
This commit is contained in:
parent
0bd459488b
commit
5ca5fe7111
|
@ -24,15 +24,23 @@
|
|||
#ifndef _ATI_DMA_H_
|
||||
#define _ATI_DMA_H_
|
||||
|
||||
#define CCE_DEBUG 1
|
||||
|
||||
#if !CCE_DEBUG
|
||||
#define DMA_PACKET0(reg, count) \
|
||||
(ATI_CCE_PACKET0 | (((count) - 1) << 16) | ((reg) >> 2))
|
||||
#else
|
||||
#define DMA_PACKET0(reg, count) \
|
||||
(__packet0count = (count), __reg = (reg), \
|
||||
ATI_CCE_PACKET0 | (((count) - 1) << 16) | ((reg) >> 2))
|
||||
#endif
|
||||
#define DMA_PACKET1(reg1, reg2) \
|
||||
(ATI_CCE_PACKET1 | \
|
||||
(((reg2) >> 2) << ATI_CCE_PACKET1_REG_2_SHIFT) | ((reg1) >> 2))
|
||||
#define DMA_PACKET3(type, count) \
|
||||
((type) | (((count) - 1) << 16))
|
||||
|
||||
#if 0 /* CCE non-debug */
|
||||
#if !CCE_DEBUG
|
||||
|
||||
#define RING_LOCALS CARD32 *__head; int __count
|
||||
#define BEGIN_DMA(n) \
|
||||
|
@ -51,7 +59,8 @@ do { \
|
|||
|
||||
#else
|
||||
|
||||
#define RING_LOCALS CARD32 *__head; int __count; int __total
|
||||
#define RING_LOCALS \
|
||||
CARD32 *__head; int __count, __total, __reg, __packet0count
|
||||
#define BEGIN_DMA(n) \
|
||||
do { \
|
||||
if ((atis->indirectBuffer->used + 4*(n)) > \
|
||||
|
@ -62,6 +71,8 @@ do { \
|
|||
atis->indirectBuffer->used); \
|
||||
__count = 0; \
|
||||
__total = n; \
|
||||
__reg = 0; \
|
||||
__packet0count = 0; \
|
||||
} while (0)
|
||||
#define END_DMA() do { \
|
||||
if (__count != __total) \
|
||||
|
@ -72,8 +83,19 @@ do { \
|
|||
|
||||
#endif
|
||||
|
||||
#define OUT_RING(x) do { \
|
||||
__head[__count++] = (x); \
|
||||
#define OUT_RING(val) do { \
|
||||
__head[__count++] = (val); \
|
||||
} while (0)
|
||||
|
||||
#define OUT_RING_REG(reg, val) do { \
|
||||
if (__reg != reg) \
|
||||
FatalError("unexpected reg (0x%x vs 0x%x) at %s:%d\n", \
|
||||
reg, __reg, __FILE__, __LINE__); \
|
||||
if (__packet0count-- <= 0) \
|
||||
FatalError("overrun of packet0 at %s:%d\n", \
|
||||
__FILE__, __LINE__); \
|
||||
__head[__count++] = (val); \
|
||||
__reg += 4; \
|
||||
} while (0)
|
||||
|
||||
#define OUT_RING_F(x) OUT_RING(GET_FLOAT_BITS(x))
|
||||
|
|
|
@ -423,8 +423,8 @@ ATISolid(int x1, int y1, int x2, int y2)
|
|||
#else
|
||||
BEGIN_DMA(3);
|
||||
OUT_RING(DMA_PACKET0(ATI_REG_DST_Y_X, 2));
|
||||
OUT_RING((y1 << 16) | x1);
|
||||
OUT_RING(((y2 - y1) << 16) | (x2 - x1));
|
||||
OUT_RING_REG(ATI_REG_DST_Y_X, (y1 << 16) | x1);
|
||||
OUT_RING_REG(ATI_REG_DST_HEIGHT_WIDTH, ((y2 - y1) << 16) | (x2 - x1));
|
||||
END_DMA();
|
||||
#endif
|
||||
LEAVE_DRAW(0);
|
||||
|
@ -542,9 +542,9 @@ ATICopy(int srcX, int srcY, int dstX, int dstY, int w, int h)
|
|||
#else
|
||||
BEGIN_DMA(4);
|
||||
OUT_RING(DMA_PACKET0(ATI_REG_SRC_Y_X, 3));
|
||||
OUT_RING((srcY << 16) | srcX);
|
||||
OUT_RING((dstY << 16) | dstX);
|
||||
OUT_RING((h << 16) | w);
|
||||
OUT_RING_REG(ATI_REG_SRC_Y_X, (srcY << 16) | srcX);
|
||||
OUT_RING_REG(ATI_REG_DST_Y_X, (dstY << 16) | dstX);
|
||||
OUT_RING_REG(ATI_REG_DST_HEIGHT_WIDTH, (h << 16) | w);
|
||||
END_DMA();
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -1312,6 +1312,11 @@
|
|||
# define R200_BORDER_MODE_D3D (1 << 31)
|
||||
|
||||
#define R200_REG_PP_TXFORMAT_0 0x2c04
|
||||
#define R200_REG_PP_TXFORMAT_1 0x2c24
|
||||
#define R200_REG_PP_TXFORMAT_2 0x2c44
|
||||
#define R200_REG_PP_TXFORMAT_3 0x2c64
|
||||
#define R200_REG_PP_TXFORMAT_4 0x2c84
|
||||
#define R200_REG_PP_TXFORMAT_5 0x2ca4
|
||||
# define R200_TXFORMAT_I8 (0 << 0)
|
||||
# define R200_TXFORMAT_AI88 (1 << 0)
|
||||
# define R200_TXFORMAT_RGB332 (2 << 0)
|
||||
|
@ -1352,6 +1357,11 @@
|
|||
# define R200_TXFORMAT_CUBIC_MAP_ENABLE (1 << 30)
|
||||
|
||||
#define R200_REG_PP_TXFORMAT_X_0 0x2c08
|
||||
#define R200_REG_PP_TXFORMAT_X_1 0x2c28
|
||||
#define R200_REG_PP_TXFORMAT_X_2 0x2c48
|
||||
#define R200_REG_PP_TXFORMAT_X_3 0x2c68
|
||||
#define R200_REG_PP_TXFORMAT_X_4 0x2c88
|
||||
#define R200_REG_PP_TXFORMAT_X_5 0x2ca8
|
||||
# define R200_DEPTH_LOG2_MASK (0xf << 0)
|
||||
# define R200_DEPTH_LOG2_SHIFT 0
|
||||
# define R200_VOLUME_FILTER_SHIFT 4
|
||||
|
@ -1383,7 +1393,19 @@
|
|||
# define R200_LOD_BIAS_SHIFT 19
|
||||
|
||||
#define R200_REG_PP_TXSIZE_0 0x2c0c /* NPOT only */
|
||||
#define R200_REG_PP_TXSIZE_1 0x2c2c /* NPOT only */
|
||||
#define R200_REG_PP_TXSIZE_2 0x2c4c /* NPOT only */
|
||||
#define R200_REG_PP_TXSIZE_3 0x2c6c /* NPOT only */
|
||||
#define R200_REG_PP_TXSIZE_4 0x2c8c /* NPOT only */
|
||||
#define R200_REG_PP_TXSIZE_5 0x2cac /* NPOT only */
|
||||
|
||||
#define R200_REG_PP_TXPITCH_0 0x2c10 /* NPOT only */
|
||||
#define R200_REG_PP_TXPITCH_1 0x2c30 /* NPOT only */
|
||||
#define R200_REG_PP_TXPITCH_2 0x2c50 /* NPOT only */
|
||||
#define R200_REG_PP_TXPITCH_3 0x2c70 /* NPOT only */
|
||||
#define R200_REG_PP_TXPITCH_4 0x2c90 /* NPOT only */
|
||||
#define R200_REG_PP_TXPITCH_5 0x2cb0 /* NPOT only */
|
||||
|
||||
#define R200_REG_PP_BORDER_COLOR_0 0x2c14
|
||||
#define R200_REG_PP_TXMULTI_CTL_0 0x2c1c
|
||||
|
||||
|
|
|
@ -217,11 +217,13 @@ R128DisplayVideo(KdScreenInfo *screen, ATIPortPrivPtr pPortPriv)
|
|||
OUT_REG(R128_REG_SCALE_3D_DATATYPE, srcDatatype);
|
||||
|
||||
OUT_RING(DMA_PACKET0(R128_REG_SCALE_PITCH, 5));
|
||||
OUT_RING(pPortPriv->src_pitch / 16);
|
||||
OUT_RING((pPortPriv->src_w << 16) / pPortPriv->dst_w);
|
||||
OUT_RING((pPortPriv->src_h << 16) / pPortPriv->dst_h);
|
||||
OUT_RING(0x0);
|
||||
OUT_RING(0x0);
|
||||
OUT_RING_REG(R128_REG_SCALE_PITCH, pPortPriv->src_pitch / 16);
|
||||
OUT_RING_REG(R128_REG_SCALE_X_INC,
|
||||
(pPortPriv->src_w << 16) / pPortPriv->dst_w);
|
||||
OUT_RING_REG(R128_REG_SCALE_Y_INC,
|
||||
(pPortPriv->src_h << 16) / pPortPriv->dst_h);
|
||||
OUT_RING_REG(R128_REG_SCALE_HACC, 0x0);
|
||||
OUT_RING_REG(R128_REG_SCALE_VACC, 0x0);
|
||||
|
||||
END_DMA();
|
||||
|
||||
|
@ -240,19 +242,16 @@ R128DisplayVideo(KdScreenInfo *screen, ATIPortPrivPtr pPortPriv)
|
|||
srch = pPortPriv->src_h - srcY;
|
||||
|
||||
BEGIN_DMA(6);
|
||||
/* R128_REG_SCALE_SRC_HEIGHT_WIDTH,
|
||||
* R128_REG_SCALE_OFFSET_0
|
||||
*/
|
||||
OUT_RING(DMA_PACKET0(R128_REG_SCALE_SRC_HEIGHT_WIDTH, 2));
|
||||
OUT_RING((srch << 16) | srcw);
|
||||
OUT_RING(pPortPriv->src_offset + srcY * pPortPriv->src_pitch +
|
||||
srcX * 2);
|
||||
/* R128_REG_SCALE_DST_X_Y
|
||||
* R128_REG_SCALE_DST_HEIGHT_WIDTH
|
||||
*/
|
||||
OUT_RING_REG(R128_REG_SCALE_SRC_HEIGHT_WIDTH,
|
||||
(srch << 16) | srcw);
|
||||
OUT_RING_REG(R128_REG_SCALE_OFFSET_0, pPortPriv->src_offset +
|
||||
srcY * pPortPriv->src_pitch + srcX * 2);
|
||||
|
||||
OUT_RING(DMA_PACKET0(R128_REG_SCALE_DST_X_Y, 2));
|
||||
OUT_RING((dstX << 16) | dstY);
|
||||
OUT_RING((dsth << 16) | dstw);
|
||||
OUT_RING_REG(R128_REG_SCALE_DST_X_Y, (dstX << 16) | dstY);
|
||||
OUT_RING_REG(R128_REG_SCALE_DST_HEIGHT_WIDTH,
|
||||
(dsth << 16) | dstw);
|
||||
END_DMA();
|
||||
pBox++;
|
||||
}
|
||||
|
@ -340,14 +339,12 @@ RadeonDisplayVideo(KdScreenInfo *screen, ATIPortPrivPtr pPortPriv)
|
|||
|
||||
BEGIN_DMA(8);
|
||||
|
||||
/* RADEON_REG_PP_CNTL,
|
||||
* RADEON_REG_RB3D_CNTL,
|
||||
* RADEON_REG_RB3D_COLOROFFSET
|
||||
*/
|
||||
OUT_RING(DMA_PACKET0(RADEON_REG_PP_CNTL, 3));
|
||||
OUT_RING(RADEON_TEX_0_ENABLE | RADEON_TEX_BLEND_0_ENABLE);
|
||||
OUT_RING(dst_format | RADEON_ALPHA_BLEND_ENABLE);
|
||||
OUT_RING(dst_offset);
|
||||
OUT_RING_REG(RADEON_REG_PP_CNTL,
|
||||
RADEON_TEX_0_ENABLE | RADEON_TEX_BLEND_0_ENABLE);
|
||||
OUT_RING_REG(RADEON_REG_RB3D_CNTL,
|
||||
dst_format | RADEON_ALPHA_BLEND_ENABLE);
|
||||
OUT_RING_REG(RADEON_REG_RB3D_COLOROFFSET, dst_offset);
|
||||
|
||||
OUT_REG(RADEON_REG_RB3D_COLORPITCH, dst_pitch >> pixel_shift);
|
||||
|
||||
|
@ -363,79 +360,66 @@ RadeonDisplayVideo(KdScreenInfo *screen, ATIPortPrivPtr pPortPriv)
|
|||
OUT_REG(R200_REG_SE_VTX_FMT_1,
|
||||
(2 << R200_VTX_TEX0_COMP_CNT_SHIFT));
|
||||
|
||||
/* R200_REG_PP_TXFILTER_0,
|
||||
* R200_REG_PP_TXFORMAT_0,
|
||||
* R200_REG_PP_TXFORMAT_X_0,
|
||||
* R200_REG_PP_TXSIZE_0,
|
||||
* R200_REG_PP_TXPITCH_0
|
||||
*/
|
||||
OUT_RING(DMA_PACKET0(R200_REG_PP_TXFILTER_0, 5));
|
||||
OUT_RING(R200_MAG_FILTER_LINEAR |
|
||||
OUT_RING_REG(R200_REG_PP_TXFILTER_0,
|
||||
R200_MAG_FILTER_LINEAR |
|
||||
R200_MIN_FILTER_LINEAR |
|
||||
R200_YUV_TO_RGB);
|
||||
OUT_RING(txformat);
|
||||
OUT_RING(0);
|
||||
OUT_RING((pPixmap->drawable.width - 1) |
|
||||
OUT_RING_REG(R200_REG_PP_TXFORMAT_0, txformat);
|
||||
OUT_RING_REG(R200_REG_PP_TXFORMAT_X_0, 0);
|
||||
OUT_RING_REG(R200_REG_PP_TXSIZE_0,
|
||||
(pPixmap->drawable.width - 1) |
|
||||
((pPixmap->drawable.height - 1) << RADEON_TEX_VSIZE_SHIFT));
|
||||
OUT_RING(pPortPriv->src_pitch - 32);
|
||||
OUT_RING_REG(R200_REG_PP_TXPITCH_0, pPortPriv->src_pitch - 32);
|
||||
|
||||
OUT_REG(R200_PP_TXOFFSET_0, pPortPriv->src_offset);
|
||||
|
||||
/* R200_REG_PP_TXCBLEND_0,
|
||||
* R200_REG_PP_TXCBLEND2_0
|
||||
* R200_REG_PP_TXABLEND_0
|
||||
* R200_REG_PP_TXABLEND2_0
|
||||
*/
|
||||
OUT_RING(DMA_PACKET0(R200_REG_PP_TXCBLEND_0, 4));
|
||||
OUT_RING(
|
||||
OUT_RING_REG(R200_REG_PP_TXCBLEND_0,
|
||||
R200_TXC_ARG_A_ZERO |
|
||||
R200_TXC_ARG_B_ZERO |
|
||||
R200_TXC_ARG_C_R0_COLOR |
|
||||
R200_TXC_OP_MADD);
|
||||
OUT_RING(R200_TXC_CLAMP_0_1 | R200_TXC_OUTPUT_REG_R0);
|
||||
OUT_RING(
|
||||
OUT_RING_REG(R200_REG_PP_TXCBLEND2_0,
|
||||
R200_TXC_CLAMP_0_1 | R200_TXC_OUTPUT_REG_R0);
|
||||
OUT_RING_REG(R200_REG_PP_TXABLEND_0,
|
||||
R200_TXA_ARG_A_ZERO |
|
||||
R200_TXA_ARG_B_ZERO |
|
||||
R200_TXA_ARG_C_R0_ALPHA |
|
||||
R200_TXA_OP_MADD);
|
||||
OUT_RING(R200_TXA_CLAMP_0_1 | R200_TXA_OUTPUT_REG_R0);
|
||||
OUT_RING_REG(R200_REG_PP_TXABLEND2_0,
|
||||
R200_TXA_CLAMP_0_1 | R200_TXA_OUTPUT_REG_R0);
|
||||
|
||||
END_DMA();
|
||||
} else {
|
||||
BEGIN_DMA(11);
|
||||
BEGIN_DMA(9);
|
||||
|
||||
/* RADEON_REG_PP_TXFILTER_0,
|
||||
* RADEON_REG_PP_TXFORMAT_0,
|
||||
* RADEON_REG_PP_TXOFFSET_0
|
||||
*/
|
||||
OUT_RING(DMA_PACKET0(RADEON_REG_PP_TXFILTER_0, 3));
|
||||
OUT_RING(RADEON_MAG_FILTER_LINEAR |
|
||||
OUT_RING(DMA_PACKET0(RADEON_REG_PP_TXFILTER_0, 5));
|
||||
OUT_RING_REG(RADEON_REG_PP_TXFILTER_0, RADEON_MAG_FILTER_LINEAR |
|
||||
RADEON_MIN_FILTER_LINEAR |
|
||||
RADEON_YUV_TO_RGB);
|
||||
OUT_RING(txformat);
|
||||
OUT_RING(pPortPriv->src_offset);
|
||||
|
||||
/* RADEON_REG_PP_TEX_SIZE_0,
|
||||
* RADEON_REG_PP_TEX_PITCH_0
|
||||
*/
|
||||
OUT_RING(DMA_PACKET0(RADEON_REG_PP_TEX_SIZE_0, 2));
|
||||
OUT_RING((pPixmap->drawable.width - 1) |
|
||||
((pPixmap->drawable.height - 1) << RADEON_TEX_VSIZE_SHIFT));
|
||||
OUT_RING(pPortPriv->src_pitch - 32);
|
||||
|
||||
OUT_REG(RADEON_REG_PP_TXCBLEND_0,
|
||||
OUT_RING_REG(RADEON_REG_PP_TXFORMAT_0, txformat);
|
||||
OUT_RING_REG(RADEON_REG_PP_TXOFFSET_0, pPortPriv->src_offset);
|
||||
OUT_RING_REG(RADEON_REG_PP_TXCBLEND_0,
|
||||
RADEON_COLOR_ARG_A_ZERO |
|
||||
RADEON_COLOR_ARG_B_ZERO |
|
||||
RADEON_COLOR_ARG_C_T0_COLOR |
|
||||
RADEON_BLEND_CTL_ADD |
|
||||
RADEON_CLAMP_TX);
|
||||
OUT_REG(RADEON_REG_PP_TXABLEND_0,
|
||||
OUT_RING_REG(RADEON_REG_PP_TXABLEND_0,
|
||||
RADEON_ALPHA_ARG_A_ZERO |
|
||||
RADEON_ALPHA_ARG_B_ZERO |
|
||||
RADEON_ALPHA_ARG_C_T0_ALPHA |
|
||||
RADEON_BLEND_CTL_ADD |
|
||||
RADEON_CLAMP_TX);
|
||||
|
||||
OUT_RING(DMA_PACKET0(RADEON_REG_PP_TEX_SIZE_0, 2));
|
||||
OUT_RING_REG(RADEON_REG_PP_TEX_SIZE_0,
|
||||
(pPixmap->drawable.width - 1) |
|
||||
((pPixmap->drawable.height - 1) << RADEON_TEX_VSIZE_SHIFT));
|
||||
OUT_RING_REG(RADEON_REG_PP_TEX_PITCH_0,
|
||||
pPortPriv->src_pitch - 32);
|
||||
|
||||
END_DMA();
|
||||
}
|
||||
|
||||
|
|
|
@ -308,13 +308,8 @@ R128PrepareComposite(int op, PicturePtr pSrcPicture, PicturePtr pMaskPicture,
|
|||
* in the mask, depending on componentAlpha.
|
||||
*/
|
||||
BEGIN_DMA(15);
|
||||
/* R128_REG_PRIM_TEX_CNTL_C,
|
||||
* R128_REG_PRIM_TEXTURE_COMBINE_CNTL_C,
|
||||
* R128_REG_TEX_SIZE_PITCH_C,
|
||||
* R128_REG_PRIM_TEX_0_OFFSET_C - R128_REG_PRIM_TEX_10_OFFSET_C
|
||||
*/
|
||||
OUT_RING(DMA_PACKET0(R128_REG_PRIM_TEX_CNTL_C, 14));
|
||||
OUT_RING(prim_tex_cntl_c);
|
||||
OUT_RING_REG(R128_REG_PRIM_TEX_CNTL_C, prim_tex_cntl_c);
|
||||
|
||||
/* If this is the only stage and the dest is a8, route the alpha result
|
||||
* to the color (red channel, in particular), too. Otherwise, be sure
|
||||
|
@ -332,29 +327,28 @@ R128PrepareComposite(int op, PicturePtr pSrcPicture, PicturePtr pMaskPicture,
|
|||
else
|
||||
alpha_comb = R128_COMB_ALPHA_DIS;
|
||||
|
||||
OUT_RING(R128_COMB_COPY |
|
||||
OUT_RING_REG(R128_REG_PRIM_TEXTURE_COMBINE_CNTL_C,
|
||||
R128_COMB_COPY |
|
||||
color_factor |
|
||||
R128_INPUT_FACTOR_INT_COLOR |
|
||||
alpha_comb |
|
||||
R128_ALPHA_FACTOR_TEX_ALPHA |
|
||||
R128_INP_FACTOR_A_CONST_ALPHA);
|
||||
OUT_RING(txsize);
|
||||
OUT_RING_REG(R128_REG_TEX_SIZE_PITCH_C, txsize);
|
||||
/* We could save some output by only writing the offset register that
|
||||
* will actually be used. On the other hand, this is easy.
|
||||
*/
|
||||
for (i = 0; i <= 10; i++)
|
||||
OUT_RING(((CARD8 *)pSrc->devPrivate.ptr -
|
||||
for (i = 0; i <= 10; i++) {
|
||||
OUT_RING_REG(R128_REG_PRIM_TEX_0_OFFSET_C + 4 * i,
|
||||
((CARD8 *)pSrc->devPrivate.ptr -
|
||||
pScreenPriv->screen->memory_base));
|
||||
}
|
||||
END_DMA();
|
||||
|
||||
if (pMask != NULL) {
|
||||
BEGIN_DMA(14);
|
||||
/* R128_REG_SEC_TEX_CNTL_C,
|
||||
* R128_REG_SEC_TEXTURE_COMBINE_CNTL_C,
|
||||
* R128_REG_SEC_TEX_0_OFFSET_C - R128_REG_SEC_TEX_10_OFFSET_C
|
||||
*/
|
||||
OUT_RING(DMA_PACKET0(R128_REG_SEC_TEX_CNTL_C, 13));
|
||||
OUT_RING(sec_tex_cntl_c);
|
||||
OUT_RING_REG(R128_REG_SEC_TEX_CNTL_C, sec_tex_cntl_c);
|
||||
|
||||
if (pDstPicture->format == PICT_a8) {
|
||||
color_factor = R128_COLOR_FACTOR_ALPHA;
|
||||
|
@ -367,15 +361,18 @@ R128PrepareComposite(int op, PicturePtr pSrcPicture, PicturePtr pMaskPicture,
|
|||
in_color_factor = R128_INPUT_FACTOR_PREV_COLOR;
|
||||
}
|
||||
|
||||
OUT_RING(R128_COMB_MODULATE |
|
||||
OUT_RING_REG(R128_REG_SEC_TEXTURE_COMBINE_CNTL_C,
|
||||
R128_COMB_MODULATE |
|
||||
color_factor |
|
||||
in_color_factor |
|
||||
R128_COMB_ALPHA_MODULATE |
|
||||
R128_ALPHA_FACTOR_TEX_ALPHA |
|
||||
R128_INP_FACTOR_A_PREV_ALPHA);
|
||||
for (i = 0; i <= 10; i++)
|
||||
OUT_RING(((CARD8 *)pMask->devPrivate.ptr -
|
||||
for (i = 0; i <= 10; i++) {
|
||||
OUT_RING_REG(R128_REG_SEC_TEX_0_OFFSET_C + 4 * i,
|
||||
((CARD8 *)pMask->devPrivate.ptr -
|
||||
pScreenPriv->screen->memory_base));
|
||||
}
|
||||
END_DMA();
|
||||
}
|
||||
|
||||
|
@ -502,18 +499,12 @@ R128PrepareTrapezoids(PicturePtr pDstPicture, PixmapPtr pDst)
|
|||
R128_ALPHA_ENABLE);
|
||||
OUT_REG(R128_REG_PC_GUI_CTLSTAT, R128_PC_FLUSH_GUI);
|
||||
|
||||
/* R128_REG_AUX_SC_CNTL,
|
||||
* R128_REG_AUX1_SC_LEFT
|
||||
* R128_REG_AUX1_SC_RIGHT
|
||||
* R128_REG_AUX1_SC_TOP
|
||||
* R128_REG_AUX1_SC_BOTTOM
|
||||
*/
|
||||
OUT_RING(DMA_PACKET0(R128_REG_AUX_SC_CNTL, 5));
|
||||
OUT_RING(R128_AUX1_SC_ENB);
|
||||
OUT_RING(0);
|
||||
OUT_RING(pDst->drawable.width);
|
||||
OUT_RING(0);
|
||||
OUT_RING(pDst->drawable.height);
|
||||
OUT_RING_REG(R128_REG_AUX_SC_CNTL, R128_AUX1_SC_ENB);
|
||||
OUT_RING_REG(R128_REG_AUX1_SC_LEFT, 0);
|
||||
OUT_RING_REG(R128_REG_AUX1_SC_RIGHT, pDst->drawable.width);
|
||||
OUT_RING_REG(R128_REG_AUX1_SC_TOP, 0);
|
||||
OUT_RING_REG(R128_REG_AUX1_SC_BOTTOM, pDst->drawable.height);
|
||||
END_DMA();
|
||||
|
||||
return TRUE;
|
||||
|
|
|
@ -196,25 +196,28 @@ R100TextureSetup(PicturePtr pPict, PixmapPtr pPix, int unit)
|
|||
if ((txpitch & 0x1f) != 0)
|
||||
ATI_FALLBACK(("Bad texture pitch 0x%x\n", txpitch));
|
||||
|
||||
/* RADEON_REG_PP_TXFILTER_0,
|
||||
* RADEON_REG_PP_TXFORMAT_0,
|
||||
* RADEON_REG_PP_TXOFFSET_0
|
||||
*/
|
||||
BEGIN_DMA(4);
|
||||
OUT_RING(DMA_PACKET0(RADEON_REG_PP_TXFILTER_0 + 0x18 * unit, 3));
|
||||
OUT_RING(0);
|
||||
OUT_RING(txformat);
|
||||
OUT_RING(txoffset);
|
||||
END_DMA();
|
||||
|
||||
/* RADEON_REG_PP_TEX_SIZE_0,
|
||||
* RADEON_REG_PP_TEX_PITCH_0
|
||||
*/
|
||||
BEGIN_DMA(3);
|
||||
OUT_RING(DMA_PACKET0(RADEON_REG_PP_TEX_SIZE_0 + 0x8 * unit, 2));
|
||||
OUT_RING((pPix->drawable.width - 1) |
|
||||
((pPix->drawable.height - 1) << RADEON_TEX_VSIZE_SHIFT));
|
||||
OUT_RING(txpitch - 32);
|
||||
BEGIN_DMA(7);
|
||||
if (unit == 0) {
|
||||
OUT_RING(DMA_PACKET0(RADEON_REG_PP_TXFILTER_0, 3));
|
||||
OUT_RING_REG(RADEON_REG_PP_TXFILTER_0, 0);
|
||||
OUT_RING_REG(RADEON_REG_PP_TXFORMAT_0, txformat);
|
||||
OUT_RING_REG(RADEON_REG_PP_TXOFFSET_0, txoffset);
|
||||
OUT_RING(DMA_PACKET0(RADEON_REG_PP_TEX_SIZE_0, 2));
|
||||
OUT_RING_REG(RADEON_REG_PP_TEX_SIZE_0,
|
||||
(pPix->drawable.width - 1) |
|
||||
((pPix->drawable.height - 1) << RADEON_TEX_VSIZE_SHIFT));
|
||||
OUT_RING_REG(RADEON_REG_PP_TEX_PITCH_0, txpitch - 32);
|
||||
} else {
|
||||
OUT_RING(DMA_PACKET0(RADEON_REG_PP_TXFILTER_1, 3));
|
||||
OUT_RING_REG(RADEON_REG_PP_TXFILTER_1, 0);
|
||||
OUT_RING_REG(RADEON_REG_PP_TXFORMAT_1, txformat);
|
||||
OUT_RING_REG(RADEON_REG_PP_TXOFFSET_1, txoffset);
|
||||
OUT_RING(DMA_PACKET0(RADEON_REG_PP_TEX_SIZE_1, 2));
|
||||
OUT_RING_REG(RADEON_REG_PP_TEX_SIZE_1,
|
||||
(pPix->drawable.width - 1) |
|
||||
((pPix->drawable.height - 1) << RADEON_TEX_VSIZE_SHIFT));
|
||||
OUT_RING_REG(RADEON_REG_PP_TEX_PITCH_1, txpitch - 32);
|
||||
}
|
||||
END_DMA();
|
||||
|
||||
if (pPict->transform != 0) {
|
||||
|
@ -302,14 +305,11 @@ R100PrepareComposite(int op, PicturePtr pSrcPicture, PicturePtr pMaskPicture,
|
|||
|
||||
BEGIN_DMA(12);
|
||||
|
||||
/* RADEON_REG_PP_CNTL,
|
||||
* RADEON_REG_RB3D_CNTL,
|
||||
* RADEON_REG_RB3D_COLOROFFSET
|
||||
*/
|
||||
OUT_RING(DMA_PACKET0(RADEON_REG_PP_CNTL, 3));
|
||||
OUT_RING(pp_cntl);
|
||||
OUT_RING(dst_format | RADEON_ALPHA_BLEND_ENABLE);
|
||||
OUT_RING(dst_offset);
|
||||
OUT_RING_REG(RADEON_REG_PP_CNTL, pp_cntl);
|
||||
OUT_RING_REG(RADEON_REG_RB3D_CNTL,
|
||||
dst_format | RADEON_ALPHA_BLEND_ENABLE);
|
||||
OUT_RING_REG(RADEON_REG_RB3D_COLOROFFSET, dst_offset);
|
||||
|
||||
OUT_REG(RADEON_REG_RB3D_COLORPITCH, dst_pitch >> pixel_shift);
|
||||
|
||||
|
@ -428,21 +428,29 @@ R200TextureSetup(PicturePtr pPict, PixmapPtr pPix, int unit)
|
|||
if ((txpitch & 0x1f) != 0)
|
||||
ATI_FALLBACK(("Bad texture pitch 0x%x\n", txpitch));
|
||||
|
||||
/* R200_REG_PP_TXFILTER_0,
|
||||
* R200_REG_PP_TXFORMAT_0,
|
||||
* R200_REG_PP_TXFORMAT_X_0,
|
||||
* R200_REG_PP_TXSIZE_0,
|
||||
* R200_REG_PP_TXPITCH_0
|
||||
*/
|
||||
BEGIN_DMA(6);
|
||||
OUT_RING(DMA_PACKET0(R200_REG_PP_TXFILTER_0 + 0x20 * unit, 5));
|
||||
OUT_RING(0);
|
||||
OUT_RING(txformat);
|
||||
OUT_RING(0);
|
||||
OUT_RING((pPix->drawable.width - 1) |
|
||||
((pPix->drawable.height - 1) << RADEON_TEX_VSIZE_SHIFT));
|
||||
OUT_RING(txpitch - 32);
|
||||
END_DMA();
|
||||
if (unit == 0) {
|
||||
BEGIN_DMA(6);
|
||||
OUT_RING(DMA_PACKET0(R200_REG_PP_TXFILTER_0 + 0x20 * unit, 5));
|
||||
OUT_RING_REG(R200_REG_PP_TXFILTER_0, 0);
|
||||
OUT_RING_REG(R200_REG_PP_TXFORMAT_0, txformat);
|
||||
OUT_RING_REG(R200_REG_PP_TXFORMAT_X_0, 0);
|
||||
OUT_RING_REG(R200_REG_PP_TXSIZE_0,
|
||||
(pPix->drawable.width - 1) |
|
||||
((pPix->drawable.height - 1) << RADEON_TEX_VSIZE_SHIFT));
|
||||
OUT_RING_REG(R200_REG_PP_TXPITCH_0, txpitch - 32);
|
||||
END_DMA();
|
||||
} else {
|
||||
BEGIN_DMA(6);
|
||||
OUT_RING(DMA_PACKET0(R200_REG_PP_TXFILTER_1, 5));
|
||||
OUT_RING_REG(R200_REG_PP_TXFILTER_1, 0);
|
||||
OUT_RING_REG(R200_REG_PP_TXFORMAT_1, txformat);
|
||||
OUT_RING_REG(R200_REG_PP_TXFORMAT_X_1, 0);
|
||||
OUT_RING_REG(R200_REG_PP_TXSIZE_1,
|
||||
(pPix->drawable.width - 1) |
|
||||
((pPix->drawable.height - 1) << RADEON_TEX_VSIZE_SHIFT));
|
||||
OUT_RING_REG(R200_REG_PP_TXPITCH_1, txpitch - 32);
|
||||
END_DMA();
|
||||
}
|
||||
|
||||
BEGIN_DMA(2);
|
||||
OUT_REG(R200_PP_TXOFFSET_0 + 0x18 * unit, txoffset);
|
||||
|
@ -521,16 +529,12 @@ R200PrepareComposite(int op, PicturePtr pSrcPicture, PicturePtr pMaskPicture,
|
|||
|
||||
RadeonSwitchTo3D(atis);
|
||||
|
||||
BEGIN_DMA(20);
|
||||
BEGIN_DMA(17);
|
||||
|
||||
/* RADEON_REG_PP_CNTL,
|
||||
* RADEON_REG_RB3D_CNTL,
|
||||
* RADEON_REG_RB3D_COLOROFFSET
|
||||
*/
|
||||
OUT_RING(DMA_PACKET0(RADEON_REG_PP_CNTL, 3));
|
||||
OUT_RING(pp_cntl);
|
||||
OUT_RING(dst_format | RADEON_ALPHA_BLEND_ENABLE);
|
||||
OUT_RING(dst_offset);
|
||||
OUT_RING_REG(RADEON_REG_PP_CNTL, pp_cntl);
|
||||
OUT_RING_REG(RADEON_REG_RB3D_CNTL, dst_format | RADEON_ALPHA_BLEND_ENABLE);
|
||||
OUT_RING_REG(RADEON_REG_RB3D_COLOROFFSET, dst_offset);
|
||||
|
||||
OUT_REG(R200_REG_SE_VTX_FMT_0, R200_VTX_XY);
|
||||
OUT_REG(R200_REG_SE_VTX_FMT_1,
|
||||
|
@ -567,14 +571,13 @@ R200PrepareComposite(int op, PicturePtr pSrcPicture, PicturePtr pMaskPicture,
|
|||
ablend |= R200_TXA_ARG_B_ZERO | R200_TXA_COMP_ARG_B;
|
||||
}
|
||||
|
||||
OUT_REG(R200_REG_PP_TXCBLEND_0, cblend);
|
||||
OUT_REG(R200_REG_PP_TXABLEND_0, ablend);
|
||||
OUT_REG(R200_REG_PP_TXCBLEND2_0,
|
||||
R200_TXC_CLAMP_0_1 |
|
||||
R200_TXC_OUTPUT_REG_R0);
|
||||
OUT_REG(R200_REG_PP_TXABLEND2_0,
|
||||
R200_TXA_CLAMP_0_1 |
|
||||
R200_TXA_OUTPUT_REG_R0);
|
||||
OUT_RING(DMA_PACKET0(R200_REG_PP_TXCBLEND_0, 4));
|
||||
OUT_RING_REG(R200_REG_PP_TXCBLEND_0, cblend);
|
||||
OUT_RING_REG(R200_REG_PP_TXCBLEND2_0,
|
||||
R200_TXC_CLAMP_0_1 | R200_TXC_OUTPUT_REG_R0);
|
||||
OUT_RING_REG(R200_REG_PP_TXABLEND_0, ablend);
|
||||
OUT_RING_REG(R200_REG_PP_TXABLEND2_0,
|
||||
R200_TXA_CLAMP_0_1 | R200_TXA_OUTPUT_REG_R0);
|
||||
|
||||
/* Op operator. */
|
||||
blendcntl = RadeonBlendOp[op].blend_cntl;
|
||||
|
@ -730,34 +733,28 @@ RadeonPrepareTrapezoids(PicturePtr pDstPicture, PixmapPtr pDst)
|
|||
|
||||
BEGIN_DMA(8);
|
||||
|
||||
/* RADEON_REG_PP_CNTL,
|
||||
* RADEON_REG_RB3D_CNTL,
|
||||
* RADEON_REG_RB3D_COLOROFFSET,
|
||||
* RADEON_REG_RE_WIDTH_HEIGHT,
|
||||
* RADEON_REG_RB3D_COLORPITCH
|
||||
*/
|
||||
OUT_RING(DMA_PACKET0(RADEON_REG_PP_CNTL, 5));
|
||||
OUT_RING(RADEON_TEX_BLEND_0_ENABLE);
|
||||
OUT_RING(RADEON_COLOR_FORMAT_RGB8 | RADEON_ALPHA_BLEND_ENABLE);
|
||||
OUT_RING(dst_offset);
|
||||
OUT_RING(((pDst->drawable.height - 1) << 16) |
|
||||
OUT_RING_REG(RADEON_REG_PP_CNTL, RADEON_TEX_BLEND_0_ENABLE);
|
||||
OUT_RING_REG(RADEON_REG_RB3D_CNTL,
|
||||
RADEON_COLOR_FORMAT_RGB8 | RADEON_ALPHA_BLEND_ENABLE);
|
||||
OUT_RING_REG(RADEON_REG_RB3D_COLOROFFSET, dst_offset);
|
||||
OUT_RING_REG(RADEON_REG_RE_WIDTH_HEIGHT,
|
||||
((pDst->drawable.height - 1) << 16) |
|
||||
(pDst->drawable.width - 1));
|
||||
OUT_RING(dst_pitch >> pixel_shift);
|
||||
OUT_RING_REG(RADEON_REG_RB3D_COLORPITCH, dst_pitch >> pixel_shift);
|
||||
OUT_REG(RADEON_REG_RB3D_BLENDCNTL, RadeonBlendOp[PictOpAdd].blend_cntl);
|
||||
END_DMA();
|
||||
|
||||
if (atic->is_r100) {
|
||||
BEGIN_DMA(4);
|
||||
/* RADEON_REG_PP_TXCBLEND_0,
|
||||
* RADEON_REG_PP_TXABLEND_0,
|
||||
* RADEON_REG_PP_TFACTOR_0
|
||||
*/
|
||||
OUT_RING(DMA_PACKET0(RADEON_REG_PP_TXCBLEND_0, 3));
|
||||
OUT_RING(RADEON_BLEND_CTL_ADD | RADEON_CLAMP_TX |
|
||||
OUT_RING_REG(RADEON_REG_PP_TXCBLEND_0,
|
||||
RADEON_BLEND_CTL_ADD | RADEON_CLAMP_TX |
|
||||
RADEON_COLOR_ARG_C_TFACTOR_ALPHA);
|
||||
OUT_RING(RADEON_BLEND_CTL_ADD | RADEON_CLAMP_TX |
|
||||
OUT_RING_REG(RADEON_REG_PP_TXABLEND_0,
|
||||
RADEON_BLEND_CTL_ADD | RADEON_CLAMP_TX |
|
||||
RADEON_ALPHA_ARG_C_TFACTOR_ALPHA);
|
||||
OUT_RING(0x01000000);
|
||||
OUT_RING_REG(RADEON_REG_PP_TFACTOR_0, 0x01000000);
|
||||
END_DMA();
|
||||
} else if (atic->is_r200) {
|
||||
BEGIN_DMA(14);
|
||||
|
|
Loading…
Reference in New Issue