diff --git a/src/radeon_exa_render.c b/src/radeon_exa_render.c index a433143..3a188b7 100644 --- a/src/radeon_exa_render.c +++ b/src/radeon_exa_render.c @@ -346,7 +346,7 @@ RADEONGetDrawablePixmap(DrawablePtr pDrawable) return pDrawable->pScreen->GetWindowPixmap((WindowPtr)pDrawable); else return (PixmapPtr)pDrawable; -} +} static Bool R100CheckComposite(int op, PicturePtr pSrcPicture, PicturePtr pMaskPicture, PicturePtr pDstPicture) @@ -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)); @@ -877,7 +878,7 @@ static Bool FUNC_NAME(R300TextureSetup)(PicturePtr pPict, PixmapPtr pPix, ((h - 1) << R300_TXHEIGHT_SHIFT)); if (pPict->repeat) { - ErrorF("repeat\n"); + //ErrorF("repeat\n"); if ((h != 1) && (((w * pPix->drawable.bitsPerPixel / 8 + 31) & ~31) != txpitch)) RADEON_FALLBACK(("Width %d and pitch %u not compatible for repeat\n", @@ -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")); @@ -1039,6 +1042,12 @@ static Bool FUNC_NAME(R300PrepareComposite)(int op, PicturePtr pSrcPicture, TRACE; + if (pMask) + //if (pMask && pMaskPicture->componentAlpha) + return FALSE; + + ErrorF("op: 0x%x, src: 0x%x, dst: 0x%x\n", op, pSrcPicture->format, pDstPicture->format); + if (!info->XInited3D) RADEONInit3DEngine(pScrn); @@ -1073,10 +1082,14 @@ static Bool FUNC_NAME(R300PrepareComposite)(int op, PicturePtr pSrcPicture, RADEON_SWITCH_TO_3D(); - /* setup the VAP */ + BEGIN_ACCEL(2); + OUT_ACCEL_REG(R300_TX_INVALTAGS, 0); + OUT_ACCEL_REG(R300_TX_ENABLE, txenable); + FINISH_ACCEL(); + /* setup the VAP */ if (has_tcl) { - BEGIN_ACCEL(28); + BEGIN_ACCEL(32); OUT_ACCEL_REG(R300_VAP_CNTL_STATUS, 0); OUT_ACCEL_REG(R300_VAP_PVS_STATE_FLUSH_REG, 0); OUT_ACCEL_REG(R300_VAP_CNTL, ((6 << R300_PVS_NUM_SLOTS_SHIFT) | @@ -1173,20 +1186,26 @@ static Bool FUNC_NAME(R300PrepareComposite)(int op, PicturePtr pSrcPicture, if (has_tcl) { OUT_ACCEL_REG(R300_VAP_PVS_CODE_CNTL_0, ((0 << R300_PVS_FIRST_INST_SHIFT) | - (1 << R300_PVS_XYZW_VALID_INST_SHIFT) | - (1 << R300_PVS_LAST_INST_SHIFT))); + (2 << R300_PVS_XYZW_VALID_INST_SHIFT) | + (2 << R300_PVS_LAST_INST_SHIFT))); OUT_ACCEL_REG(R300_VAP_PVS_CODE_CNTL_1, - (1 << R300_PVS_LAST_VTX_SRC_INST_SHIFT)); + (2 << R300_PVS_LAST_VTX_SRC_INST_SHIFT)); OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_INDX_REG, 0); OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG,0x00f00203); OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG,0x00d10001); OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG,0x01248001); OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG,0x01248001); + OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG,0x00f02203); OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG,0x00d10141); OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG,0x01248141); OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG,0x01248141); - +#if 1 + OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG,0x00f04203); + OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG,0x00d10141); + OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG,0x01248141); + OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG,0x01248141); +#endif OUT_ACCEL_REG(R300_VAP_PVS_FLOW_CNTL_OPC, 0); OUT_ACCEL_REG(R300_VAP_GB_VERT_CLIP_ADJ, 0x3f800000); @@ -1204,10 +1223,287 @@ static Bool FUNC_NAME(R300PrepareComposite)(int op, PicturePtr pSrcPicture, /* setup pixel shader */ if (IS_R300_VARIANT || info->ChipFamily == CHIP_FAMILY_RS690) { - BEGIN_ACCEL(16); + + // temp regs + int src_reg = 0; + int mask_reg = 1; + int srcval_reg = 2; + int srcalpha_reg = 3; + int final_reg = 4; + + // round 1 + int c1_sel_a = R300_ALU_RGB_SRC0_RGB; + int c1_sel_b = R300_ALU_RGB_1_0; + int a1_sel_a = R300_ALU_ALPHA_SRC0_A; + int a1_sel_b = R300_ALU_ALPHA_1_0; + + // round 2 + int c2_sel_a = R300_ALU_RGB_SRC0_RGB; + int c2_sel_b = R300_ALU_RGB_1_0; + int a2_sel_a = R300_ALU_ALPHA_SRC0_A; + int a2_sel_b = R300_ALU_ALPHA_1_0; + + // round 2 + int c3_sel_a = R300_ALU_RGB_SRC0_RGB; + int c3_sel_b = R300_ALU_RGB_1_0; + int a3_sel_a = R300_ALU_ALPHA_SRC0_A; + int a3_sel_b = R300_ALU_ALPHA_1_0; + + int alu_code_offset = 1; + int alu_code_size = 1; + int alu_tex_offset = 0; + int alu_tex_size = 1; + + int c_op = R300_ALU_RGB_OP_MAD; + int a_op = R300_ALU_ALPHA_OP_MAD; + int c_srcp_op = R300_ALU_RGB_SRCP_OP_1_MINUS_RGB0; + int a_srcp_op = R300_ALU_ALPHA_SRCP_OP_1_MINUS_RGB0; + CARD32 output_fmt = R300_OUT_FMT_C4_8; + +#if 1 + + // src + src_reg = 0; + // mask + mask_reg = 1; + // final + srcval_reg = 2; + srcalpha_reg = 3; + final_reg = 4; + + if (pMask && pMaskPicture->componentAlpha) { + + alu_code_offset = 2; + alu_code_size = 3; + alu_tex_offset = 0; + alu_tex_size = 2; + + //srcval.r = src->r * mask->r; + //srcval.g = src->g * mask->g; + //srcval.b = src->b * mask->b; + //srcval.a = src->a * mask->a; + + // round 1 + //src + c1_sel_a = R300_ALU_RGB_SRC0_RGB; + + if (PICT_FORMAT_A(pSrcPicture->format) == 0) + a1_sel_a = R300_ALU_ALPHA_1_0; + else + a1_sel_a = R300_ALU_ALPHA_SRC0_A; + + //mask + c1_sel_b = R300_ALU_RGB_SRC1_RGB; + + if (PICT_FORMAT_A(pMaskPicture->format) == 0) + a1_sel_b = R300_ALU_ALPHA_1_0; + else + a1_sel_b = R300_ALU_ALPHA_SRC1_A; + + //srcalpha.r = src->a * mask->r; + //srcalpha.g = src->a * mask->g; + //srcalpha.b = src->a * mask->b; + //srcalpha.a = src->a * mask->a; + + // round 2 + //src + if (PICT_FORMAT_A(pSrcPicture->format) == 0) { + c2_sel_a = R300_ALU_RGB_1_0; + a2_sel_a = R300_ALU_ALPHA_1_0; + } else { + c2_sel_a = R300_ALU_RGB_SRC0_AAA; + a2_sel_a = R300_ALU_ALPHA_SRC0_A; + } + //mask + c2_sel_b = R300_ALU_RGB_SRC1_RGB; + + if (PICT_FORMAT_A(pMaskPicture->format) == 0) + a1_sel_b = R300_ALU_ALPHA_1_0; + else + a1_sel_b = R300_ALU_ALPHA_SRC1_A; + + // round 3 + if (PICT_FORMAT_RGB(pMaskPicture->format)) { + if (RadeonBlendOp[op].src_alpha) { + c3_sel_a = R300_ALU_RGB_1_0; + a3_sel_a = R300_ALU_ALPHA_1_0; + c3_sel_b = R300_ALU_RGB_SRC1_RGB; + a3_sel_b = R300_ALU_ALPHA_SRC1_A; + } else { + c3_sel_a = R300_ALU_RGB_1_0; + a3_sel_a = R300_ALU_ALPHA_1_0; + c3_sel_b = R300_ALU_RGB_SRC0_RGB; + a3_sel_b = R300_ALU_ALPHA_SRC0_A; + } + } else { + c3_sel_a = R300_ALU_RGB_1_0; + a3_sel_a = R300_ALU_ALPHA_1_0; + c3_sel_b = R300_ALU_RGB_SRC0_RGB; + a3_sel_b = R300_ALU_ALPHA_SRC0_A; + } + + } else if (pMask) { + + alu_code_offset = 2; + alu_code_size = 1; + alu_tex_offset = 0; + alu_tex_size = 2; + + //srcval.r = src->r * mask->a; + //srcval.g = src->g * mask->a; + //srcval.b = src->b * mask->a; + //srcval.a = src->a * mask->a; + + // round 1 + //src + if (PICT_FORMAT_RGB(pSrcPicture->format) == 0) + c1_sel_a = R300_ALU_RGB_1_0; + else + c1_sel_a = R300_ALU_RGB_SRC0_RGB; + + if (PICT_FORMAT_A(pSrcPicture->format) == 0) + a1_sel_a = R300_ALU_ALPHA_1_0; + else + a1_sel_a = R300_ALU_ALPHA_SRC0_A; + + //mask + if (PICT_FORMAT_A(pMaskPicture->format) == 0) + c1_sel_b = R300_ALU_RGB_1_0; + else + c1_sel_b = R300_ALU_RGB_SRC1_AAA; + + if (PICT_FORMAT_A(pMaskPicture->format) == 0) + a1_sel_b = R300_ALU_ALPHA_1_0; + else + a1_sel_b = R300_ALU_ALPHA_SRC1_A; + + //srcalpha.r = src->a * mask->a; + //srcalpha.g = src->a * mask->a; + //srcalpha.b = src->a * mask->a; + //srcalpha.a = src->a * mask->a; + + // round 2 + //src + if (PICT_FORMAT_A(pSrcPicture->format) == 0) { + c2_sel_a = R300_ALU_RGB_1_0; + a2_sel_a = R300_ALU_ALPHA_1_0; + } else { + c2_sel_a = R300_ALU_RGB_SRC0_AAA; + a2_sel_a = R300_ALU_ALPHA_SRC0_A; + } + //mask + if (PICT_FORMAT_A(pMaskPicture->format) == 0) { + c2_sel_b = R300_ALU_RGB_1_0; + a2_sel_b = R300_ALU_ALPHA_1_0; + } else { + c2_sel_b = R300_ALU_RGB_SRC1_AAA; + a2_sel_b = R300_ALU_ALPHA_SRC1_A; + } + // round 3 + c3_sel_a = R300_ALU_RGB_1_0; + a3_sel_a = R300_ALU_ALPHA_1_0; + c3_sel_b = R300_ALU_RGB_SRC0_RGB; + a3_sel_b = R300_ALU_ALPHA_SRC0_A; + + } else { + //srcval.r = src->r; + //srcval.g = src->g; + //srcval.b = src->b; + //srcval.a = src->a; + + // round 1 + //src + if (PICT_FORMAT_RGB(pSrcPicture->format) == 0) + c1_sel_a = R300_ALU_RGB_1_0; + else + c1_sel_a = R300_ALU_RGB_SRC0_RGB; + + if (PICT_FORMAT_A(pSrcPicture->format) == 0) + a1_sel_a = R300_ALU_ALPHA_1_0; + else + a1_sel_a = R300_ALU_ALPHA_SRC0_A; + + //mask + c1_sel_b = R300_ALU_RGB_1_0; + a1_sel_b = R300_ALU_ALPHA_1_0; + + //srcalpha.r = src->a; + //srcalpha.g = src->a; + //srcalpha.b = src->a; + //srcalpha.a = src->a; + + // round 2 + //src + c2_sel_a = R300_ALU_RGB_SRC0_AAA; + + if (PICT_FORMAT_A(pSrcPicture->format) == 0) + a2_sel_a = R300_ALU_ALPHA_1_0; + else + a2_sel_a = R300_ALU_ALPHA_SRC0_A; + + //mask + c2_sel_b = R300_ALU_RGB_1_0; + a2_sel_b = R300_ALU_ALPHA_1_0; + + // round 3 + //src + c3_sel_a = R300_ALU_RGB_SRC0_RGB; + + if (PICT_FORMAT_A(pSrcPicture->format) == 0) + a3_sel_a = R300_ALU_ALPHA_1_0; + else + a3_sel_a = R300_ALU_ALPHA_SRC0_A; + + //mask + c3_sel_b = R300_ALU_RGB_1_0; + a3_sel_b = R300_ALU_ALPHA_1_0; + + } + + // shader output swizzling + switch (pDstPicture->format) { + case PICT_a8r8g8b8: + case PICT_x8r8g8b8: + case PICT_a8b8g8r8: + case PICT_x8b8g8r8: + default: + output_fmt = (R300_OUT_FMT_C4_8 | + R300_OUT_FMT_C0_SEL_BLUE | + R300_OUT_FMT_C1_SEL_GREEN | + R300_OUT_FMT_C2_SEL_RED | + R300_OUT_FMT_C3_SEL_ALPHA); + break; +#if 1 + case PICT_r5g6b5: + case PICT_a1r5g5b5: + case PICT_x1r5g5b5: + output_fmt = (R300_OUT_FMT_C_5_6_5 | + R300_OUT_FMT_C0_SEL_BLUE | + R300_OUT_FMT_C1_SEL_GREEN | + R300_OUT_FMT_C2_SEL_RED | + R300_OUT_FMT_C3_SEL_ALPHA); + break; + case PICT_a8: + output_fmt = (R300_OUT_FMT_C4_8 | + R300_OUT_FMT_C0_SEL_ALPHA); + break; +#endif + } + +#endif + + //BEGIN_ACCEL(16); + if (pMask && pMaskPicture->componentAlpha) + BEGIN_ACCEL(28); + else if (pMask) + BEGIN_ACCEL(20); + else + BEGIN_ACCEL(19); OUT_ACCEL_REG(R300_RS_COUNT, - ((2 << R300_RS_COUNT_IT_COUNT_SHIFT) | + ((4 << R300_RS_COUNT_IT_COUNT_SHIFT) | R300_RS_COUNT_HIRES_EN)); + //OUT_ACCEL_REG(R300_RS_INST_COUNT, R300_TX_OFFSET_RS(6)); + OUT_ACCEL_REG(R300_RS_INST_COUNT, R300_INST_COUNT_RS(2) | R300_TX_OFFSET_RS(6)); OUT_ACCEL_REG(R300_RS_IP_0, (R300_RS_TEX_PTR(0) | R300_RS_COL_PTR(0) | @@ -1216,15 +1512,34 @@ static Bool FUNC_NAME(R300PrepareComposite)(int op, PicturePtr pSrcPicture, R300_RS_SEL_T(R300_RS_SEL_C1) | R300_RS_SEL_R(R300_RS_SEL_K0) | R300_RS_SEL_Q(R300_RS_SEL_K1))); - OUT_ACCEL_REG(R300_RS_INST_COUNT, R300_TX_OFFSET_RS(6)); - OUT_ACCEL_REG(R300_RS_INST_0, R300_RS_INST_TEX_CN_WRITE); +#if 1 + OUT_ACCEL_REG(R300_RS_IP_1, + (R300_RS_TEX_PTR(2) | + R300_RS_COL_PTR(0) | + R300_RS_COL_FMT(R300_RS_COL_FMT_RGBA) | + R300_RS_SEL_S(R300_RS_SEL_C0) | + R300_RS_SEL_T(R300_RS_SEL_C1) | + R300_RS_SEL_R(R300_RS_SEL_K0) | + R300_RS_SEL_Q(R300_RS_SEL_K1))); +#endif + OUT_ACCEL_REG(R300_RS_INST_0, + (R300_INST_TEX_ID(0) | + R300_INST_TEX_ADDR(0) | + R300_RS_INST_TEX_CN_WRITE)); +#if 1 + OUT_ACCEL_REG(R300_RS_INST_1, + (R300_INST_TEX_ID(1) | + R300_INST_TEX_ADDR(1) | + R300_RS_INST_TEX_CN_WRITE)); +#endif OUT_ACCEL_REG(R300_US_CONFIG, (0 << R300_NLEVEL_SHIFT) | R300_FIRST_TEX); - OUT_ACCEL_REG(R300_US_PIXSIZE, 0); + //OUT_ACCEL_REG(R300_US_PIXSIZE, 0); + OUT_ACCEL_REG(R300_US_PIXSIZE, 4); OUT_ACCEL_REG(R300_US_CODE_OFFSET, - (R300_ALU_CODE_OFFSET(0) | - R300_ALU_CODE_SIZE(1) | - R300_TEX_CODE_OFFSET(0) | - R300_TEX_CODE_SIZE(1))); + (R300_ALU_CODE_OFFSET(alu_code_offset) | + R300_ALU_CODE_SIZE(alu_code_size) | + R300_TEX_CODE_OFFSET(alu_tex_offset) | + R300_TEX_CODE_SIZE(alu_tex_size))); OUT_ACCEL_REG(R300_US_CODE_ADDR_0, (R300_ALU_START(0) | R300_ALU_SIZE(0) | @@ -1246,16 +1561,31 @@ static Bool FUNC_NAME(R300PrepareComposite)(int op, PicturePtr pSrcPicture, R300_TEX_START(0) | R300_TEX_SIZE(0) | R300_RGBA_OUT)); + OUT_ACCEL_REG(R300_US_OUT_FMT_0, output_fmt); + + // Load the pSrcPicture texel OUT_ACCEL_REG(R300_US_TEX_INST_0, (R300_TEX_SRC_ADDR(0) | R300_TEX_DST_ADDR(0) | R300_TEX_ID(0) | R300_TEX_INST(R300_TEX_INST_LD))); + + if (pMask) { + // Load the pMaskPicture texel + 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))); + + } + + // round one OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR_0, - (R300_ALU_RGB_ADDR0(0) | - R300_ALU_RGB_ADDR1(0) | + (R300_ALU_RGB_ADDR0(src_reg) | + R300_ALU_RGB_ADDR1(mask_reg) | R300_ALU_RGB_ADDR2(0) | - R300_ALU_RGB_ADDRD(0) | + R300_ALU_RGB_ADDRD(srcval_reg) | R300_ALU_RGB_WMASK((R300_ALU_RGB_MASK_R | R300_ALU_RGB_MASK_G | R300_ALU_RGB_MASK_B)) | @@ -1263,33 +1593,129 @@ static Bool FUNC_NAME(R300PrepareComposite)(int op, PicturePtr pSrcPicture, R300_ALU_RGB_MASK_G | 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_MOD_A(R300_ALU_RGB_MOD_NOP) | - R300_ALU_RGB_SEL_B(R300_ALU_RGB_1_0) | - 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))); OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR_0, - (R300_ALU_ALPHA_ADDR0(0) | - R300_ALU_ALPHA_ADDR1(0) | + (R300_ALU_ALPHA_ADDR0(src_reg) | + R300_ALU_ALPHA_ADDR1(mask_reg) | R300_ALU_ALPHA_ADDR2(0) | - R300_ALU_ALPHA_ADDRD(0) | + R300_ALU_ALPHA_ADDRD(srcval_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_RGB_INST_0, + (R300_ALU_RGB_SEL_A(c1_sel_a) | + R300_ALU_RGB_MOD_A(R300_ALU_RGB_MOD_NOP) | + R300_ALU_RGB_SEL_B(c1_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_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_INST_0, - (R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_SRC0_A) | + (R300_ALU_ALPHA_SEL_A(a1_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(a1_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)); + + if (pMask && pMaskPicture->componentAlpha) { + // round two + OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR_1, + (R300_ALU_RGB_ADDR0(src_reg) | + R300_ALU_RGB_ADDR1(mask_reg) | + R300_ALU_RGB_ADDR2(0) | + R300_ALU_RGB_ADDRD(srcalpha_reg) | + R300_ALU_RGB_WMASK((R300_ALU_RGB_MASK_R | + R300_ALU_RGB_MASK_G | + R300_ALU_RGB_MASK_B)) | + R300_ALU_RGB_OMASK((R300_ALU_RGB_MASK_R | + R300_ALU_RGB_MASK_G | + R300_ALU_RGB_MASK_B)) | + R300_ALU_RGB_TARGET_A)); + OUT_ACCEL_REG(R300_US_ALU_RGB_INST_1, + (R300_ALU_RGB_SEL_A(c2_sel_a) | + R300_ALU_RGB_MOD_A(R300_ALU_RGB_MOD_NOP) | + R300_ALU_RGB_SEL_B(c2_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_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_1, + (R300_ALU_ALPHA_ADDR0(src_reg) | + R300_ALU_ALPHA_ADDR1(src_reg) | + R300_ALU_ALPHA_ADDR2(0) | + R300_ALU_ALPHA_ADDRD(srcalpha_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_1, + (R300_ALU_ALPHA_SEL_A(a2_sel_a) | + R300_ALU_ALPHA_MOD_A(R300_ALU_ALPHA_MOD_NOP) | + R300_ALU_ALPHA_SEL_B(a2_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_SRCP_OP(a_srcp_op) | + R300_ALU_ALPHA_OP(a_op) | + R300_ALU_ALPHA_OMOD(R300_ALU_ALPHA_OMOD_NONE) | + R300_ALU_ALPHA_CLAMP)); + + // round three + OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR_2, + (R300_ALU_RGB_ADDR0(srcval_reg) | + R300_ALU_RGB_ADDR1(srcalpha_reg) | + R300_ALU_RGB_ADDR2(0) | + R300_ALU_RGB_ADDRD(final_reg) | + R300_ALU_RGB_WMASK((R300_ALU_RGB_MASK_R | + R300_ALU_RGB_MASK_G | + R300_ALU_RGB_MASK_B)) | + R300_ALU_RGB_OMASK((R300_ALU_RGB_MASK_R | + R300_ALU_RGB_MASK_G | + R300_ALU_RGB_MASK_B)) | + R300_ALU_RGB_TARGET_A)); + OUT_ACCEL_REG(R300_US_ALU_RGB_INST_2, + (R300_ALU_RGB_SEL_A(c2_sel_a) | + R300_ALU_RGB_MOD_A(R300_ALU_RGB_MOD_NOP) | + R300_ALU_RGB_SEL_B(c2_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_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_2, + (R300_ALU_ALPHA_ADDR0(srcval_reg) | + R300_ALU_ALPHA_ADDR1(srcalpha_reg) | + R300_ALU_ALPHA_ADDR2(0) | + R300_ALU_ALPHA_ADDRD(final_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_2, + (R300_ALU_ALPHA_SEL_A(a2_sel_a) | + R300_ALU_ALPHA_MOD_A(R300_ALU_ALPHA_MOD_NOP) | + R300_ALU_ALPHA_SEL_B(a2_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_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); @@ -1389,16 +1815,14 @@ static Bool FUNC_NAME(R300PrepareComposite)(int op, PicturePtr pSrcPicture, FINISH_ACCEL(); } - BEGIN_ACCEL(6); - OUT_ACCEL_REG(R300_TX_INVALTAGS, 0x0); - OUT_ACCEL_REG(R300_TX_ENABLE, txenable); + BEGIN_ACCEL(4); OUT_ACCEL_REG(R300_RB3D_COLOROFFSET0, dst_offset); OUT_ACCEL_REG(R300_RB3D_COLORPITCH0, colorpitch); blendcntl = RADEONGetBlendCntl(op, pMaskPicture, pDstPicture->format); - OUT_ACCEL_REG(R300_RB3D_BLENDCNTL, blendcntl); - OUT_ACCEL_REG(R300_RB3D_ABLENDCNTL, 0); + OUT_ACCEL_REG(R300_RB3D_BLENDCNTL, blendcntl | R300_ALPHA_BLEND_ENABLE | R300_READ_ENABLE); + OUT_ACCEL_REG(R300_RB3D_ABLENDCNTL, blendcntl); #if 0 /* IN operator: Multiply src by mask components or mask alpha. diff --git a/src/radeon_reg.h b/src/radeon_reg.h index 94d5f31..a0aa486 100644 --- a/src/radeon_reg.h +++ b/src/radeon_reg.h @@ -4040,6 +4040,7 @@ # define R300_RS_COUNT_HIRES_EN (1 << 18) #define R300_RS_IP_0 0x4310 +#define R300_RS_IP_1 0x4314 # define R300_RS_TEX_PTR(x) (x << 0) # define R300_RS_COL_PTR(x) (x << 6) # define R300_RS_COL_FMT(x) (x << 9) @@ -4067,7 +4068,10 @@ # define R300_RS_W_EN (1 << 4) # define R300_TX_OFFSET_RS(x) (x << 5) #define R300_RS_INST_0 0x4330 +#define R300_RS_INST_1 0x4334 +# define R300_INST_TEX_ID(x) (x << 0) # define R300_RS_INST_TEX_CN_WRITE (1 << 3) +# define R300_INST_TEX_ADDR(x) (x << 6) #define R300_TX_INVALTAGS 0x4100 #define R300_TX_FILTER0_0 0x4400 @@ -4086,6 +4090,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 @@ -4193,7 +4198,7 @@ # define R300_OUT_FMT_C2_16_MPEG (7 << 0) # define R300_OUT_FMT_C2_4 (8 << 0) # define R300_OUT_FMT_C_3_3_2 (9 << 0) -# define R300_OUT_FMT_C_6_5_6 (10 << 0) +# define R300_OUT_FMT_C_5_6_5 (10 << 0) # define R300_OUT_FMT_C_11_11_10 (11 << 0) # define R300_OUT_FMT_C_10_11_11 (12 << 0) # define R300_OUT_FMT_C_2_10_10_10 (13 << 0) @@ -4241,6 +4246,8 @@ #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_US_TEX_INST_2 0x4628 # define R300_TEX_SRC_ADDR(x) (x << 0) # define R300_TEX_DST_ADDR(x) (x << 6) # define R300_TEX_ID(x) (x << 11) @@ -4251,6 +4258,8 @@ # define R300_TEX_INST_PROJ 3 # define R300_TEX_INST_LODBIAS 4 #define R300_US_ALU_RGB_ADDR_0 0x46c0 +#define R300_US_ALU_RGB_ADDR_1 0x46c4 +#define R300_US_ALU_RGB_ADDR_2 0x46c8 /* for ADDR0-2, values 0-31 specify a location in the pixel stack, values 32-63 specify a constant */ # define R300_ALU_RGB_ADDR0(x) (x << 0) @@ -4270,6 +4279,8 @@ # define R300_ALU_RGB_TARGET_C (2 << 29) # define R300_ALU_RGB_TARGET_D (3 << 29) #define R300_US_ALU_RGB_INST_0 0x48c0 +#define R300_US_ALU_RGB_INST_1 0x48c4 +#define R300_US_ALU_RGB_INST_2 0x48c8 # define R300_ALU_RGB_SEL_A(x) (x << 0) # define R300_ALU_RGB_SRC0_RGB 0 # define R300_ALU_RGB_SRC0_RRR 1 @@ -4339,6 +4350,8 @@ # define R300_ALU_RGB_CLAMP (1 << 30) # define R300_ALU_RGB_INSERT_NOP (1 << 31) #define R300_US_ALU_ALPHA_ADDR_0 0x47c0 +#define R300_US_ALU_ALPHA_ADDR_1 0x47c4 +#define R300_US_ALU_ALPHA_ADDR_2 0x47c8 /* for ADDR0-2, values 0-31 specify a location in the pixel stack, values 32-63 specify a constant */ # define R300_ALU_ALPHA_ADDR0(x) (x << 0) @@ -4357,6 +4370,8 @@ # define R300_ALU_ALPHA_TARGET_C (2 << 25) # define R300_ALU_ALPHA_TARGET_D (3 << 25) #define R300_US_ALU_ALPHA_INST_0 0x49c0 +#define R300_US_ALU_ALPHA_INST_1 0x49c4 +#define R300_US_ALU_ALPHA_INST_2 0x49c8 # define R300_ALU_ALPHA_SEL_A(x) (x << 0) # define R300_ALU_ALPHA_SRC0_R 0 # define R300_ALU_ALPHA_SRC0_G 1 @@ -4433,6 +4448,9 @@ #define R300_RB3D_ZTOP 0x4f14 #define R300_RB3D_ROPCNTL 0x4e18 #define R300_RB3D_BLENDCNTL 0x4e04 +# define R300_ALPHA_BLEND_ENABLE (1 << 0) +# define R300_SEPARATE_ALPHA_ENABLE (1 << 1) +# define R300_READ_ENABLE (1 << 2) #define R300_RB3D_ABLENDCNTL 0x4e08 #define R300_RB3D_DSTCACHE_CTLSTAT 0x4e4c #define R300_RB3D_COLOROFFSET0 0x4e28