summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers
diff options
context:
space:
mode:
authorMarek Olšák <[email protected]>2010-07-24 22:52:01 +0200
committerMarek Olšák <[email protected]>2010-07-25 10:25:21 +0200
commitc92d232061c1aef6f5f56cbd815625778db2fd8c (patch)
treeabae5bb8dc9da1d8877cf920d99e8dbef59f99fc /src/gallium/drivers
parentd779a5d16ae6a17b3fc0c097f4eb477a80e54566 (diff)
r300g: do not use TXPITCH_EN for power-of-two textures from the DDX
We were using TXPITCH_EN for textures from the DDX since ever, for nothing.
Diffstat (limited to 'src/gallium/drivers')
-rw-r--r--src/gallium/drivers/r300/r300_texture_desc.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/src/gallium/drivers/r300/r300_texture_desc.c b/src/gallium/drivers/r300/r300_texture_desc.c
index 18a2bd31fd8..becaa59bea3 100644
--- a/src/gallium/drivers/r300/r300_texture_desc.c
+++ b/src/gallium/drivers/r300/r300_texture_desc.c
@@ -210,6 +210,14 @@ static void r300_texture_3d_fix_mipmapping(struct r300_screen *screen,
}
}
+/* Get a width in pixels from a stride in bytes. */
+static unsigned stride_to_width(enum pipe_format format,
+ unsigned stride_in_bytes)
+{
+ return (stride_in_bytes / util_format_get_blocksize(format)) *
+ util_format_get_blockwidth(format);
+}
+
static void r300_setup_miptree(struct r300_screen *screen,
struct r300_texture_desc *desc)
{
@@ -246,9 +254,7 @@ static void r300_setup_miptree(struct r300_screen *screen,
desc->size_in_bytes = desc->offset_in_bytes[i] + size;
desc->layer_size_in_bytes[i] = layer_size;
desc->stride_in_bytes[i] = stride;
- desc->stride_in_pixels[i] =
- (stride / util_format_get_blocksize(base->format)) *
- util_format_get_blockwidth(base->format);
+ desc->stride_in_pixels[i] = stride_to_width(desc->b.b.format, stride);
SCREEN_DBG(screen, DBG_TEXALLOC, "r300: Texture miptree: Level %d "
"(%dx%dx%d px, pitch %d bytes) %d bytes total, macrotiled %s\n",
@@ -261,9 +267,11 @@ static void r300_setup_miptree(struct r300_screen *screen,
static void r300_setup_flags(struct r300_texture_desc *desc)
{
desc->uses_stride_addressing =
- !util_is_power_of_two(desc->b.b.width0) ||
- !util_is_power_of_two(desc->b.b.height0) ||
- desc->stride_in_bytes_override;
+ !util_is_power_of_two(desc->b.b.width0) ||
+ !util_is_power_of_two(desc->b.b.height0) ||
+ (desc->stride_in_bytes_override &&
+ stride_to_width(desc->b.b.format,
+ desc->stride_in_bytes_override) != desc->b.b.width0);
}
static void r300_setup_cbzb_flags(struct r300_screen *rscreen,