summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarek Olšák <maraeo@gmail.com>2010-08-01 16:42:53 +0200
committerMarek Olšák <maraeo@gmail.com>2010-08-01 22:16:57 +0200
commita87cedbde0f6f1335691c524d539552f5c056215 (patch)
treef83c3ea7855969a534bf58b4f4ad4d9ab03e39eb
parent9846b0627149e221c9fbd7c3379e33fb68e68511 (diff)
r300g: fix microtiling on RS6xx
Getting tiling right has always been tricky. There are so many subtle details...
-rw-r--r--src/gallium/drivers/r300/r300_texture_desc.c22
1 files changed, 18 insertions, 4 deletions
diff --git a/src/gallium/drivers/r300/r300_texture_desc.c b/src/gallium/drivers/r300/r300_texture_desc.c
index 343089bf2c..5d690e8c33 100644
--- a/src/gallium/drivers/r300/r300_texture_desc.c
+++ b/src/gallium/drivers/r300/r300_texture_desc.c
@@ -136,13 +136,27 @@ static unsigned r300_texture_get_stride(struct r300_screen *screen,
stride = util_format_get_stride(desc->b.b.format, width);
- /* Some IGPs need a minimum stride of 64 bytes, hmm...
- * This doesn't seem to apply to tiled textures, according to r300c. */
- if (!desc->microtile && !desc->macrotile[level] &&
+ /* Some IGPs need a minimum stride of 64 bytes, hmm... */
+ if (!desc->macrotile[level] &&
(screen->caps.family == CHIP_FAMILY_RS600 ||
screen->caps.family == CHIP_FAMILY_RS690 ||
screen->caps.family == CHIP_FAMILY_RS740)) {
- return stride < 64 ? 64 : stride;
+ unsigned min_stride;
+
+ if (desc->microtile) {
+ unsigned tile_height =
+ r300_get_pixel_alignment(desc->b.b.format,
+ desc->b.b.nr_samples,
+ desc->microtile,
+ desc->macrotile[level],
+ DIM_HEIGHT);
+
+ min_stride = 64 / tile_height;
+ } else {
+ min_stride = 64;
+ }
+
+ return stride < min_stride ? min_stride : stride;
}
/* The alignment to 32 bytes is sort of implied by the layout... */