summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2010-05-16 18:41:52 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2010-05-16 18:41:52 +0100
commit2c69709d8afa6e9c0990efc463df0061536585e1 (patch)
treeb0c454758f293fc6451a1c4954b5dadfd4ca5c8a
parent21b5fd427f5ed6c99276349a7ae128eea580dd72 (diff)
i830: Encode surface bpp into format
References: Bug 28135 - [855GM] Slowdown/High CPU-Usage after Git-Commit 926fbc7d90ac1d0d49d154f136f9c9ed613c98c2 https://bugs.freedesktop.org/show_bug.cgi?id=28135 The simple answer is that I had assumed that 0 was a reserved value. However, without the bbp encoded into the format 0 was used for a8r8g8b8 and r5g6b5, which are very common formats! The other possibility for the slowdown is that gtkperf is using of the now verboten xrgb formats -- but would in fact be valid if the source covers the clip and we could fixup the alpha value in the fixed function combine. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r--src/i830_render.c114
1 files changed, 53 insertions, 61 deletions
diff --git a/src/i830_render.c b/src/i830_render.c
index 57f8ecdc..d3bc18e2 100644
--- a/src/i830_render.c
+++ b/src/i830_render.c
@@ -127,16 +127,17 @@ static struct blendinfo i830_blend_op[] = {
};
static struct formatinfo i830_tex_formats[] = {
- {PICT_a8r8g8b8, MT_32BIT_ARGB8888},
- {PICT_a8b8g8r8, MT_32BIT_ABGR8888},
- {PICT_r5g6b5, MT_16BIT_RGB565},
- {PICT_a1r5g5b5, MT_16BIT_ARGB1555},
- {PICT_a8, MT_8BIT_A8},
+ {PICT_a8, MAPSURF_8BIT | MT_8BIT_A8},
+ {PICT_a8r8g8b8, MAPSURF_32BIT | MT_32BIT_ARGB8888},
+ {PICT_a8b8g8r8, MAPSURF_32BIT | MT_32BIT_ABGR8888},
+ {PICT_r5g6b5, MAPSURF_16BIT | MT_16BIT_RGB565},
+ {PICT_a1r5g5b5, MAPSURF_16BIT | MT_16BIT_ARGB1555},
+ {PICT_a4r4g4b4, MAPSURF_16BIT | MT_16BIT_ARGB4444},
};
static struct formatinfo i855_tex_formats[] = {
- {PICT_x8r8g8b8, MT_32BIT_XRGB8888},
- {PICT_x8b8g8r8, MT_32BIT_XBGR8888},
+ {PICT_x8r8g8b8, MAPSURF_32BIT | MT_32BIT_XRGB8888},
+ {PICT_x8b8g8r8, MAPSURF_32BIT | MT_32BIT_XBGR8888},
};
static Bool i830_get_dest_format(PicturePtr dest_picture, uint32_t * dst_format)
@@ -260,8 +261,6 @@ static void i830_texture_setup(PicturePtr picture, PixmapPtr pixmap, int unit)
else
texcoordtype = TEXCOORDTYPE_HOMOGENEOUS;
- format = i8xx_get_card_format(intel, picture);
-
switch (picture->repeatType) {
case RepeatNone:
wrap_mode = TEXCOORDMODE_CLAMP_BORDER;
@@ -293,58 +292,51 @@ static void i830_texture_setup(PicturePtr picture, PixmapPtr pixmap, int unit)
}
filter |= (MIPFILTER_NONE << TM0S3_MIP_FILTER_SHIFT);
- {
- if (pixmap->drawable.bitsPerPixel == 8)
- format |= MAPSURF_8BIT;
- else if (pixmap->drawable.bitsPerPixel == 16)
- format |= MAPSURF_16BIT;
- else
- format |= MAPSURF_32BIT;
-
- if (i830_pixmap_tiled(pixmap)) {
- tiling_bits = TM0S1_TILED_SURFACE;
- if (i830_get_pixmap_intel(pixmap)->tiling
- == I915_TILING_Y)
- tiling_bits |= TM0S1_TILE_WALK;
- } else
- tiling_bits = 0;
-
- ATOMIC_BATCH(10);
- OUT_BATCH(_3DSTATE_LOAD_STATE_IMMEDIATE_2 |
- LOAD_TEXTURE_MAP(unit) | 4);
- OUT_RELOC_PIXMAP(pixmap, I915_GEM_DOMAIN_SAMPLER, 0, 0);
- OUT_BATCH(((pixmap->drawable.height -
- 1) << TM0S1_HEIGHT_SHIFT) | ((pixmap->drawable.width -
- 1) <<
- TM0S1_WIDTH_SHIFT) |
- format | tiling_bits);
- OUT_BATCH((pitch / 4 - 1) << TM0S2_PITCH_SHIFT | TM0S2_MAP_2D);
- OUT_BATCH(filter);
- OUT_BATCH(0); /* default color */
- OUT_BATCH(_3DSTATE_MAP_COORD_SET_CMD | TEXCOORD_SET(unit) |
- ENABLE_TEXCOORD_PARAMS | TEXCOORDS_ARE_NORMAL |
- texcoordtype | ENABLE_ADDR_V_CNTL |
- TEXCOORD_ADDR_V_MODE(wrap_mode) |
- ENABLE_ADDR_U_CNTL | TEXCOORD_ADDR_U_MODE(wrap_mode));
- /* map texel stream */
- OUT_BATCH(_3DSTATE_MAP_COORD_SETBIND_CMD);
- if (unit == 0)
- OUT_BATCH(TEXBIND_SET0(TEXCOORDSRC_VTXSET_0) |
- TEXBIND_SET1(TEXCOORDSRC_KEEP) |
- TEXBIND_SET2(TEXCOORDSRC_KEEP) |
- TEXBIND_SET3(TEXCOORDSRC_KEEP));
- else
- OUT_BATCH(TEXBIND_SET0(TEXCOORDSRC_VTXSET_0) |
- TEXBIND_SET1(TEXCOORDSRC_VTXSET_1) |
- TEXBIND_SET2(TEXCOORDSRC_KEEP) |
- TEXBIND_SET3(TEXCOORDSRC_KEEP));
- OUT_BATCH(_3DSTATE_MAP_TEX_STREAM_CMD | (unit << 16) |
- DISABLE_TEX_STREAM_BUMP |
- ENABLE_TEX_STREAM_COORD_SET |
- TEX_STREAM_COORD_SET(unit) |
- ENABLE_TEX_STREAM_MAP_IDX | TEX_STREAM_MAP_IDX(unit));
- ADVANCE_BATCH();
- }
+ if (i830_pixmap_tiled(pixmap)) {
+ tiling_bits = TM0S1_TILED_SURFACE;
+ if (i830_get_pixmap_intel(pixmap)->tiling
+ == I915_TILING_Y)
+ tiling_bits |= TM0S1_TILE_WALK;
+ } else
+ tiling_bits = 0;
+
+ format = i8xx_get_card_format(intel, picture);
+
+ ATOMIC_BATCH(10);
+ OUT_BATCH(_3DSTATE_LOAD_STATE_IMMEDIATE_2 |
+ LOAD_TEXTURE_MAP(unit) | 4);
+ OUT_RELOC_PIXMAP(pixmap, I915_GEM_DOMAIN_SAMPLER, 0, 0);
+ OUT_BATCH(((pixmap->drawable.height -
+ 1) << TM0S1_HEIGHT_SHIFT) | ((pixmap->drawable.width -
+ 1) <<
+ TM0S1_WIDTH_SHIFT) |
+ format | tiling_bits);
+ OUT_BATCH((pitch / 4 - 1) << TM0S2_PITCH_SHIFT | TM0S2_MAP_2D);
+ OUT_BATCH(filter);
+ OUT_BATCH(0); /* default color */
+ OUT_BATCH(_3DSTATE_MAP_COORD_SET_CMD | TEXCOORD_SET(unit) |
+ ENABLE_TEXCOORD_PARAMS | TEXCOORDS_ARE_NORMAL |
+ texcoordtype | ENABLE_ADDR_V_CNTL |
+ TEXCOORD_ADDR_V_MODE(wrap_mode) |
+ ENABLE_ADDR_U_CNTL | TEXCOORD_ADDR_U_MODE(wrap_mode));
+ /* map texel stream */
+ OUT_BATCH(_3DSTATE_MAP_COORD_SETBIND_CMD);
+ if (unit == 0)
+ OUT_BATCH(TEXBIND_SET0(TEXCOORDSRC_VTXSET_0) |
+ TEXBIND_SET1(TEXCOORDSRC_KEEP) |
+ TEXBIND_SET2(TEXCOORDSRC_KEEP) |
+ TEXBIND_SET3(TEXCOORDSRC_KEEP));
+ else
+ OUT_BATCH(TEXBIND_SET0(TEXCOORDSRC_VTXSET_0) |
+ TEXBIND_SET1(TEXCOORDSRC_VTXSET_1) |
+ TEXBIND_SET2(TEXCOORDSRC_KEEP) |
+ TEXBIND_SET3(TEXCOORDSRC_KEEP));
+ OUT_BATCH(_3DSTATE_MAP_TEX_STREAM_CMD | (unit << 16) |
+ DISABLE_TEX_STREAM_BUMP |
+ ENABLE_TEX_STREAM_COORD_SET |
+ TEX_STREAM_COORD_SET(unit) |
+ ENABLE_TEX_STREAM_MAP_IDX | TEX_STREAM_MAP_IDX(unit));
+ ADVANCE_BATCH();
}
Bool