diff --git a/src/i915_exa_render.c b/src/i915_exa_render.c index 74c85e01..7b2eada9 100644 --- a/src/i915_exa_render.c +++ b/src/i915_exa_render.c @@ -55,6 +55,8 @@ do { \ extern float scale_units[2][2]; extern Bool is_transform[2]; extern PictTransform *transform[2]; +static CARD32 mapstate[6]; +static CARD32 samplerstate[6]; struct formatinfo { int fmt; @@ -288,50 +290,27 @@ I915TextureSetup(PicturePtr pPict, PixmapPtr pPix, int unit) I830FALLBACK("Bad filter 0x%x\n", pPict->filter); } - { - CARD32 ms3; - if (pPix->drawable.bitsPerPixel == 8) - format |= MAPSURF_8BIT; - else if (pPix->drawable.bitsPerPixel == 16) - format |= MAPSURF_16BIT; - else - format |= MAPSURF_32BIT; + if (pPix->drawable.bitsPerPixel == 8) + format |= MAPSURF_8BIT; + else if (pPix->drawable.bitsPerPixel == 16) + format |= MAPSURF_16BIT; + else + format |= MAPSURF_32BIT; - BEGIN_LP_RING(6); - OUT_RING(_3DSTATE_MAP_STATE | 3); - OUT_RING(1<drawable.height - 1) << MS3_HEIGHT_SHIFT) | - ((pPix->drawable.width - 1) << MS3_WIDTH_SHIFT) | format; - if (!pI830->disableTiling) - ms3 |= MS3_USE_FENCE_REGS; - OUT_RING(ms3); - OUT_RING(((pitch / 4) - 1) << MS4_PITCH_SHIFT); - OUT_RING(MI_NOOP); - ADVANCE_LP_RING(); - } + mapstate[unit * 3 + 0] = offset; + mapstate[unit * 3 + 1] = format | + ((pPix->drawable.height - 1) << MS3_HEIGHT_SHIFT) | + ((pPix->drawable.width - 1) << MS3_WIDTH_SHIFT); + if (!pI830->disableTiling) + samplerstate[unit * 3 + 1] |= MS3_USE_FENCE_REGS; + mapstate[unit * 3 + 2] = ((pitch / 4) - 1) << MS4_PITCH_SHIFT; - { - CARD32 ss2, ss3; - BEGIN_LP_RING(6); - /* max & min mip level ? or base mip level? */ - - OUT_RING(_3DSTATE_SAMPLER_STATE | 3); - OUT_RING(1<transform != 0) { is_transform[unit] = TRUE; @@ -378,6 +357,41 @@ ErrorF("i915 prepareComposite\n"); scale_units[1][1] = -1; } + if (pMask == NULL) { + BEGIN_LP_RING(10); + OUT_RING(_3DSTATE_MAP_STATE | 3); + OUT_RING(0x00000001); /* map 0 */ + OUT_RING(mapstate[0]); + OUT_RING(mapstate[1]); + OUT_RING(mapstate[2]); + + OUT_RING(_3DSTATE_SAMPLER_STATE | 3); + OUT_RING(0x00000001); /* sampler 0 */ + OUT_RING(samplerstate[0]); + OUT_RING(samplerstate[1]); + OUT_RING(samplerstate[2]); + ADVANCE_LP_RING(); + } else { + BEGIN_LP_RING(16); + OUT_RING(_3DSTATE_MAP_STATE | 6); + OUT_RING(0x00000003); /* map 0,1 */ + OUT_RING(mapstate[0]); + OUT_RING(mapstate[1]); + OUT_RING(mapstate[2]); + OUT_RING(mapstate[3]); + OUT_RING(mapstate[4]); + OUT_RING(mapstate[5]); + + OUT_RING(_3DSTATE_SAMPLER_STATE | 6); + OUT_RING(0x00000003); /* sampler 0,1 */ + OUT_RING(samplerstate[0]); + OUT_RING(samplerstate[1]); + OUT_RING(samplerstate[2]); + OUT_RING(samplerstate[3]); + OUT_RING(samplerstate[4]); + OUT_RING(samplerstate[5]); + ADVANCE_LP_RING(); + } { CARD32 ss2;