diff --git a/src/radeon_commonfuncs.c b/src/radeon_commonfuncs.c index 92e10d2..7f204b7 100644 --- a/src/radeon_commonfuncs.c +++ b/src/radeon_commonfuncs.c @@ -548,6 +548,13 @@ static void FUNC_NAME(RADEONInit3DEngine)(ScrnInfoPtr pScrn) OUT_ACCEL_REG(R300_RB3D_DSTCACHE_CTLSTAT, R300_DC_FLUSH_3D | R300_DC_FREE_3D); FINISH_ACCEL(); + BEGIN_ACCEL(2); + OUT_ACCEL_REG(R300_SC_SCISSOR0, ((0 << R300_SCISSOR_X_SHIFT) | + (0 << R300_SCISSOR_Y_SHIFT))); + OUT_ACCEL_REG(R300_SC_SCISSOR1, ((8191 << R300_SCISSOR_X_SHIFT) | + (8191 << R300_SCISSOR_Y_SHIFT))); + FINISH_ACCEL(); + BEGIN_ACCEL(5); OUT_ACCEL_REG(R300_SC_EDGERULE, 0xA5294A5); if (IS_R300_3D) { diff --git a/src/radeon_exa_render.c b/src/radeon_exa_render.c index b5f0197..af0f715 100644 --- a/src/radeon_exa_render.c +++ b/src/radeon_exa_render.c @@ -1860,14 +1860,6 @@ static Bool FUNC_NAME(R300PrepareComposite)(int op, PicturePtr pSrcPicture, FINISH_ACCEL(); } - /* Clear out scissoring */ - BEGIN_ACCEL(2); - OUT_ACCEL_REG(R300_SC_SCISSOR0, ((0 << R300_SCISSOR_X_SHIFT) | - (0 << R300_SCISSOR_Y_SHIFT))); - OUT_ACCEL_REG(R300_SC_SCISSOR1, ((8191 << R300_SCISSOR_X_SHIFT) | - (8191 << R300_SCISSOR_Y_SHIFT))); - FINISH_ACCEL(); - BEGIN_ACCEL(3); OUT_ACCEL_REG(R300_RB3D_COLOROFFSET0, dst_offset); diff --git a/src/radeon_textured_videofuncs.c b/src/radeon_textured_videofuncs.c index e324fd9..abde4a5 100644 --- a/src/radeon_textured_videofuncs.c +++ b/src/radeon_textured_videofuncs.c @@ -1475,44 +1475,6 @@ FUNC_NAME(RADEONDisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv } } - /* - * Rendering of the actual polygon is done in two different - * ways depending on chip generation: - * - * < R300: - * - * These chips can render a rectangle in one pass, so - * handling is pretty straight-forward. - * - * >= R300: - * - * These chips can accept a quad, but will render it as - * two triangles which results in a diagonal tear. Instead - * We render a single, large triangle and use the scissor - * functionality to restrict it to the desired rectangle. - */ - - if (IS_R300_3D || IS_R500_3D) { - /* - * Set up the scissor area to that of the output size. - */ - - BEGIN_ACCEL(2); - if (IS_R300_3D) { - /* R300 has an offset */ - OUT_ACCEL_REG(R300_SC_SCISSOR0, (((pPriv->drw_x + 1088) << R300_SCISSOR_X_SHIFT) | - ((pPriv->drw_y + 1088) << R300_SCISSOR_Y_SHIFT))); - OUT_ACCEL_REG(R300_SC_SCISSOR1, (((pPriv->drw_x + pPriv->dst_w + 1088 - 1) << R300_SCISSOR_X_SHIFT) | - ((pPriv->drw_y + pPriv->dst_h + 1088 - 1) << R300_SCISSOR_Y_SHIFT))); - } else { - OUT_ACCEL_REG(R300_SC_SCISSOR0, (((pPriv->drw_x) << R300_SCISSOR_X_SHIFT) | - ((pPriv->drw_y) << R300_SCISSOR_Y_SHIFT))); - OUT_ACCEL_REG(R300_SC_SCISSOR1, (((pPriv->drw_x + pPriv->dst_w - 1) << R300_SCISSOR_X_SHIFT) | - ((pPriv->drw_y + pPriv->dst_h - 1) << R300_SCISSOR_Y_SHIFT))); - } - FINISH_ACCEL(); - } - FUNC_NAME(RADEONWaitForVLine)(pScrn, pPixmap, radeon_covering_crtc_num(pScrn, pPriv->drw_x, @@ -1558,12 +1520,12 @@ FUNC_NAME(RADEONDisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv RADEON_CP_VC_CNTL_VTX_FMT_RADEON_MODE | (3 << RADEON_CP_VC_CNTL_NUM_SHIFT)); } else if (IS_R300_3D || IS_R500_3D) { - BEGIN_RING(3 * vtx_count + 4); + BEGIN_RING(4 * vtx_count + 4); OUT_RING(CP_PACKET3(R200_CP_PACKET3_3D_DRAW_IMMD_2, - 3 * vtx_count)); - OUT_RING(RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_LIST | + 4 * vtx_count)); + OUT_RING(RADEON_CP_VC_CNTL_PRIM_TYPE_QUAD_LIST | RADEON_CP_VC_CNTL_PRIM_WALK_RING | - (3 << RADEON_CP_VC_CNTL_NUM_SHIFT)); + (4 << RADEON_CP_VC_CNTL_NUM_SHIFT)); } else { BEGIN_RING(3 * vtx_count + 2); OUT_RING(CP_PACKET3(R200_CP_PACKET3_3D_DRAW_IMMD_2, @@ -1574,7 +1536,7 @@ FUNC_NAME(RADEONDisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv } #else /* ACCEL_CP */ if (IS_R300_3D || IS_R500_3D) - BEGIN_ACCEL(2 + vtx_count * 3); + BEGIN_ACCEL(2 + vtx_count * 4); else BEGIN_ACCEL(1 + vtx_count * 3); @@ -1584,9 +1546,9 @@ FUNC_NAME(RADEONDisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv RADEON_VF_RADEON_MODE | (3 << RADEON_VF_NUM_VERTICES_SHIFT))); else if (IS_R300_3D || IS_R500_3D) - OUT_ACCEL_REG(RADEON_SE_VF_CNTL, (RADEON_VF_PRIM_TYPE_TRIANGLE_LIST | + OUT_ACCEL_REG(RADEON_SE_VF_CNTL, (RADEON_VF_PRIM_TYPE_QUAD_LIST | RADEON_VF_PRIM_WALK_DATA | - (3 << RADEON_VF_NUM_VERTICES_SHIFT))); + (4 << RADEON_VF_NUM_VERTICES_SHIFT))); else OUT_ACCEL_REG(RADEON_SE_VF_CNTL, (RADEON_VF_PRIM_TYPE_RECTANGLE_LIST | RADEON_VF_PRIM_WALK_DATA | @@ -1601,28 +1563,31 @@ FUNC_NAME(RADEONDisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv VTX_OUT_FILTER((float)dstX, (float)dstY, (float)srcX / info->accel_state->texW[0], (float)srcY / info->accel_state->texH[0], (float)srcX + 0.5, (float)srcY + 0.5); - VTX_OUT_FILTER((float)dstX, (float)(dstY + dsth * 2), - (float)srcX / info->accel_state->texW[0], (float)(srcY + srch * 2) / info->accel_state->texH[0], - (float)srcX + 0.5, (float)(srcY + srch * 2) + 0.5); - VTX_OUT_FILTER((float)(dstX + dstw * 2), (float)dstY, - (float)(srcX + srcw * 2) / info->accel_state->texW[0], (float)srcY / info->accel_state->texH[0], - (float)(srcX + srcw * 2) + 0.5, (float)srcY + 0.5); + VTX_OUT_FILTER((float)dstX, (float)(dstY + dsth), + (float)srcX / info->accel_state->texW[0], (float)(srcY + srch) / info->accel_state->texH[0], + (float)srcX + 0.5, (float)srcY + srch + 0.5); + VTX_OUT_FILTER((float)dstX + dstw, (float)dstY + dsth, + (float)(srcX + srcw) / info->accel_state->texW[0], (float)(srcY + srch) / info->accel_state->texH[0], + (float)srcX + srcw + 0.5, (float)srcY + srch + 0.5); + VTX_OUT_FILTER((float)dstX + dstw, (float)dstY, + (float)(srcX + srcw) / info->accel_state->texW[0], (float)srcY / info->accel_state->texH[0], + (float)srcX + srcw + 0.5, (float)srcY + 0.5); } else { if (IS_R300_3D || IS_R500_3D) { /* - * Render a big, scissored triangle. This means - * doubling the triangle size and adjusting - * texture coordinates. + * Render a quad. */ VTX_OUT((float)dstX, (float)dstY, (float)srcX / info->accel_state->texW[0], (float)srcY / info->accel_state->texH[0]); - VTX_OUT((float)dstX, (float)(dstY + dsth * 2), - (float)srcX / info->accel_state->texW[0], (float)(srcY + srch * 2) / info->accel_state->texH[0]); - VTX_OUT((float)(dstX + dstw * 2), (float)dstY, - (float)(srcX + srcw * 2) / info->accel_state->texW[0], (float)srcY / info->accel_state->texH[0]); + VTX_OUT((float)dstX, (float)dstY + dsth, + (float)srcX / info->accel_state->texW[0], (float)(srcY + srch) / info->accel_state->texH[0]); + VTX_OUT((float)dstX + dstw, (float)dstY + dsth, + (float)(srcX + srcw) / info->accel_state->texW[0], (float)(srcY + srch) / info->accel_state->texH[0]); + VTX_OUT((float)(dstX + dstw), (float)dstY, + (float)(srcX + srcw) / info->accel_state->texW[0], (float)srcY / info->accel_state->texH[0]); } else { /* - * Just render a quad (using three coords). + * Just render a rect (using three coords). */ VTX_OUT((float)dstX, (float)(dstY + dsth), (float)srcX / info->accel_state->texW[0], (float)(srcY + srch) / info->accel_state->texH[0]);