diff options
Diffstat (limited to 'src/i915_render.c')
-rw-r--r-- | src/i915_render.c | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/src/i915_render.c b/src/i915_render.c index 8ac1b78e..9c6da095 100644 --- a/src/i915_render.c +++ b/src/i915_render.c @@ -320,6 +320,7 @@ i915_prepare_composite(int op, PicturePtr pSrcPicture, uint32_t blendctl; int out_reg = FS_OC; FS_LOCALS(20); + Bool is_affine_src, is_affine_mask; IntelEmitInvarientState(pScrn); *pI830->last_3d = LAST_3D_RENDER; @@ -339,6 +340,8 @@ i915_prepare_composite(int op, PicturePtr pSrcPicture, pI830->scale_units[1][0] = -1; pI830->scale_units[1][1] = -1; } + is_affine_src = i830_transform_is_affine (pI830->transform[0]); + is_affine_mask = i830_transform_is_affine (pI830->transform[1]); if (pMask == NULL) { BEGIN_BATCH(10); @@ -389,9 +392,9 @@ i915_prepare_composite(int op, PicturePtr pSrcPicture, OUT_BATCH(_3DSTATE_LOAD_STATE_IMMEDIATE_1 | I1_LOAD_S(2) | I1_LOAD_S(4) | I1_LOAD_S(5) | I1_LOAD_S(6) | 3); - ss2 = S2_TEXCOORD_FMT(0, TEXCOORDFMT_2D); + ss2 = S2_TEXCOORD_FMT(0, is_affine_src ? TEXCOORDFMT_2D : TEXCOORDFMT_4D); if (pMask) - ss2 |= S2_TEXCOORD_FMT(1, TEXCOORDFMT_2D); + ss2 |= S2_TEXCOORD_FMT(1, is_affine_mask ? TEXCOORDFMT_2D : TEXCOORDFMT_4D); else ss2 |= S2_TEXCOORD_FMT(1, TEXCOORDFMT_NOT_PRESENT); ss2 |= S2_TEXCOORD_FMT(2, TEXCOORDFMT_NOT_PRESENT); @@ -435,7 +438,12 @@ i915_prepare_composite(int op, PicturePtr pSrcPicture, i915_fs_dcl(FS_T1); /* Load the pSrcPicture texel */ - i915_fs_texld(FS_R0, FS_S0, FS_T0); + if (is_affine_src) { + i915_fs_texld(FS_R0, FS_S0, FS_T0); + } else { + i915_fs_texldp(FS_R0, FS_S0, FS_T0); + } + /* If the texture lacks an alpha channel, force the alpha to 1. */ if (PICT_FORMAT_A(pSrcPicture->format) == 0) i915_fs_mov_masked(FS_R0, MASK_W, i915_fs_operand_one()); @@ -445,7 +453,11 @@ i915_prepare_composite(int op, PicturePtr pSrcPicture, i915_fs_mov(out_reg, i915_fs_operand_reg(FS_R0)); } else { /* Load the pMaskPicture texel */ - i915_fs_texld(FS_R1, FS_S1, FS_T1); + if (is_affine_mask) { + i915_fs_texld(FS_R1, FS_S1, FS_T1); + } else { + i915_fs_texldp(FS_R1, FS_S1, FS_T1); + } /* If the texture lacks an alpha channel, force the alpha to 1. */ if (PICT_FORMAT_A(pMaskPicture->format) == 0) i915_fs_mov_masked(FS_R1, MASK_W, i915_fs_operand_one()); |