diff --git a/src/radeon_exa_render.c b/src/radeon_exa_render.c index a433143..59b7d01 100644 --- a/src/radeon_exa_render.c +++ b/src/radeon_exa_render.c @@ -814,6 +814,7 @@ static Bool R300CheckCompositeTexture(PicturePtr pPict, int unit) int h = pPict->pDrawable->height; int i; + /* fixme for 5xx */ if ((w > 0x7ff) || (h > 0x7ff)) RADEON_FALLBACK(("Picture w/h too large (%dx%d)\n", w, h)); @@ -892,6 +893,8 @@ static Bool FUNC_NAME(R300TextureSetup)(PicturePtr pPict, PixmapPtr pPix, txfilter = (R300_TX_CLAMP_S(R300_TX_CLAMP_CLAMP_LAST) | R300_TX_CLAMP_T(R300_TX_CLAMP_CLAMP_LAST)); + txfilter |= (unit << R300_TX_ID_SHIFT); + switch (pPict->filter) { case PictFilterNearest: txfilter |= (R300_TX_MAG_FILTER_NEAREST | R300_TX_MIN_FILTER_NEAREST); @@ -940,7 +943,7 @@ static Bool R300CheckComposite(int op, PicturePtr pSrcPicture, PicturePtr pMaskP if (op >= sizeof(RadeonBlendOp) / sizeof(RadeonBlendOp[0])) RADEON_FALLBACK(("Unsupported Composite op 0x%x\n", op)); -#if 1 +#if 0 /* Throw out cases that aren't going to be our rotation first */ if (pMaskPicture != NULL || op != PictOpSrc || pSrcPicture->pDrawable == NULL) RADEON_FALLBACK(("Junk driver\n")); @@ -1204,7 +1207,59 @@ static Bool FUNC_NAME(R300PrepareComposite)(int op, PicturePtr pSrcPicture, /* setup pixel shader */ if (IS_R300_VARIANT || info->ChipFamily == CHIP_FAMILY_RS690) { - BEGIN_ACCEL(16); + int c_src_reg0 = 0; + int c_src_reg1 = 0; + int c_dst_reg = 0; + int a_src_reg0 = 0; + int a_src_reg1 = 0; + int a_dst_reg = 0; + int c_op = R300_ALU_RGB_OP_MAD; + int a_op = R300_ALU_ALPHA_OP_MAD; + int c_sel_a = R300_ALU_RGB_SRC0_RGB; + int c_sel_b = R300_ALU_RGB_1_0; + int a_sel_a = R300_ALU_ALPHA_SRC0_A; + int a_sel_b = R300_ALU_ALPHA_1_0; + int c_srcp_op = R300_ALU_RGB_SRCP_OP_1_MINUS_RGB0; + int a_srcp_op = R300_ALU_ALPHA_SRCP_OP_1_MINUS_RGB0; + +#if 1 + if (pDstPicture->format == PICT_a8 || + (pMask && pMaskPicture->componentAlpha && RadeonBlendOp[op].src_alpha)) { + //cblend |= R200_TXC_ARG_A_R0_ALPHA; + c_sel_a = R300_ALU_RGB_SRC0_AAA; + } else if (pSrcPicture->format == PICT_a8) + //cblend |= R200_TXC_ARG_A_ZERO; + c_sel_a = R300_ALU_RGB_0_0; + else + //cblend |= R200_TXC_ARG_A_R0_COLOR; + c_sel_a = R300_ALU_RGB_SRC0_RGB; + //ablend |= R200_TXA_ARG_A_R0_ALPHA; + a_sel_a = R300_ALU_ALPHA_SRC0_A; + + if (pMask) { + c_src_reg1 = 1; + a_src_reg1 = 1; + if (pMaskPicture->componentAlpha && + pDstPicture->format != PICT_a8) { + //cblend |= R200_TXC_ARG_B_R1_COLOR; + c_sel_b = R300_ALU_RGB_SRC1_RGB; + } else { + //cblend |= R200_TXC_ARG_B_R1_ALPHA; + c_sel_b = R300_ALU_RGB_SRC1_AAA; + } + //ablend |= R200_TXA_ARG_B_R1_ALPHA; + a_sel_b = R300_ALU_ALPHA_SRC1_A; + } else { + //cblend |= R200_TXC_ARG_B_ZERO | R200_TXC_COMP_ARG_B; + c_sel_b = R300_ALU_RGB_1_0; + //ablend |= R200_TXA_ARG_B_ZERO | R200_TXA_COMP_ARG_B; + a_sel_b = R300_ALU_ALPHA_1_0; + } + +#endif + + //BEGIN_ACCEL(16); + BEGIN_ACCEL(17); OUT_ACCEL_REG(R300_RS_COUNT, ((2 << R300_RS_COUNT_IT_COUNT_SHIFT) | R300_RS_COUNT_HIRES_EN)); @@ -1251,11 +1306,16 @@ static Bool FUNC_NAME(R300PrepareComposite)(int op, PicturePtr pSrcPicture, R300_TEX_DST_ADDR(0) | R300_TEX_ID(0) | R300_TEX_INST(R300_TEX_INST_LD))); + OUT_ACCEL_REG(R300_US_TEX_INST_1, + (R300_TEX_SRC_ADDR(1) | + R300_TEX_DST_ADDR(1) | + R300_TEX_ID(1) | + R300_TEX_INST(R300_TEX_INST_LD))); OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR_0, - (R300_ALU_RGB_ADDR0(0) | - R300_ALU_RGB_ADDR1(0) | + (R300_ALU_RGB_ADDR0(c_src_reg0) | + R300_ALU_RGB_ADDR1(c_src_reg1) | R300_ALU_RGB_ADDR2(0) | - R300_ALU_RGB_ADDRD(0) | + R300_ALU_RGB_ADDRD(c_dst_reg) | R300_ALU_RGB_WMASK((R300_ALU_RGB_MASK_R | R300_ALU_RGB_MASK_G | R300_ALU_RGB_MASK_B)) | @@ -1264,32 +1324,36 @@ static Bool FUNC_NAME(R300PrepareComposite)(int op, PicturePtr pSrcPicture, R300_ALU_RGB_MASK_B)) | R300_ALU_RGB_TARGET_A)); OUT_ACCEL_REG(R300_US_ALU_RGB_INST_0, - (R300_ALU_RGB_SEL_A(R300_ALU_RGB_SRC0_RGB) | + (R300_ALU_RGB_SEL_A(c_sel_a) | R300_ALU_RGB_MOD_A(R300_ALU_RGB_MOD_NOP) | - R300_ALU_RGB_SEL_B(R300_ALU_RGB_1_0) | + R300_ALU_RGB_SEL_B(c_sel_b) | R300_ALU_RGB_MOD_B(R300_ALU_RGB_MOD_NOP) | R300_ALU_RGB_SEL_C(R300_ALU_RGB_0_0) | R300_ALU_RGB_MOD_C(R300_ALU_RGB_MOD_NOP) | - R300_ALU_RGB_OP(R300_ALU_RGB_OP_MAD) | - R300_ALU_RGB_OMOD(R300_ALU_RGB_OMOD_NONE))); + R300_ALU_RGB_SRCP_OP(c_srcp_op) | + R300_ALU_RGB_OP(c_op) | + R300_ALU_RGB_OMOD(R300_ALU_RGB_OMOD_NONE) | + R300_ALU_RGB_CLAMP)); OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR_0, - (R300_ALU_ALPHA_ADDR0(0) | - R300_ALU_ALPHA_ADDR1(0) | + (R300_ALU_ALPHA_ADDR0(a_src_reg0) | + R300_ALU_ALPHA_ADDR1(a_src_reg1) | R300_ALU_ALPHA_ADDR2(0) | - R300_ALU_ALPHA_ADDRD(0) | + R300_ALU_ALPHA_ADDRD(a_dst_reg) | R300_ALU_ALPHA_WMASK(R300_ALU_ALPHA_MASK_A) | R300_ALU_ALPHA_OMASK(R300_ALU_ALPHA_MASK_A) | R300_ALU_ALPHA_TARGET_A | R300_ALU_ALPHA_OMASK_W(R300_ALU_ALPHA_MASK_NONE))); OUT_ACCEL_REG(R300_US_ALU_ALPHA_INST_0, - (R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_SRC0_A) | + (R300_ALU_ALPHA_SEL_A(a_sel_a) | R300_ALU_ALPHA_MOD_A(R300_ALU_ALPHA_MOD_NOP) | - R300_ALU_ALPHA_SEL_B(R300_ALU_ALPHA_1_0) | + R300_ALU_ALPHA_SEL_B(a_sel_b) | R300_ALU_ALPHA_MOD_B(R300_ALU_ALPHA_MOD_NOP) | R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_0_0) | R300_ALU_ALPHA_MOD_C(R300_ALU_ALPHA_MOD_NOP) | - R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_MAD) | - R300_ALU_ALPHA_OMOD(R300_ALU_ALPHA_OMOD_NONE))); + R300_ALU_ALPHA_SRCP_OP(a_srcp_op) | + R300_ALU_ALPHA_OP(a_op) | + R300_ALU_ALPHA_OMOD(R300_ALU_ALPHA_OMOD_NONE) | + R300_ALU_ALPHA_CLAMP)); FINISH_ACCEL(); } else { BEGIN_ACCEL(23); @@ -1390,7 +1454,7 @@ static Bool FUNC_NAME(R300PrepareComposite)(int op, PicturePtr pSrcPicture, } BEGIN_ACCEL(6); - OUT_ACCEL_REG(R300_TX_INVALTAGS, 0x0); + OUT_ACCEL_REG(R300_TX_INVALTAGS, 0); OUT_ACCEL_REG(R300_TX_ENABLE, txenable); OUT_ACCEL_REG(R300_RB3D_COLOROFFSET0, dst_offset); diff --git a/src/radeon_reg.h b/src/radeon_reg.h index 94d5f31..3a04ff6 100644 --- a/src/radeon_reg.h +++ b/src/radeon_reg.h @@ -4086,6 +4086,7 @@ # define R300_TX_MIN_FILTER_NEAREST (1 << 11) # define R300_TX_MAG_FILTER_LINEAR (2 << 9) # define R300_TX_MIN_FILTER_LINEAR (2 << 11) +# define R300_TX_ID_SHIFT 28 #define R300_TX_FILTER1_0 0x4440 #define R300_TX_FORMAT0_0 0x4480 # define R300_TXWIDTH_SHIFT 0 @@ -4241,6 +4242,7 @@ #define R300_US_CODE_ADDR_2 0x4618 #define R300_US_CODE_ADDR_3 0x461c #define R300_US_TEX_INST_0 0x4620 +#define R300_US_TEX_INST_1 0x4624 # define R300_TEX_SRC_ADDR(x) (x << 0) # define R300_TEX_DST_ADDR(x) (x << 6) # define R300_TEX_ID(x) (x << 11)