diff options
author | Marek Olšák <[email protected]> | 2010-08-01 16:42:53 +0200 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2010-08-01 22:16:57 +0200 |
commit | a87cedbde0f6f1335691c524d539552f5c056215 (patch) | |
tree | f83c3ea7855969a534bf58b4f4ad4d9ab03e39eb | |
parent | 9846b0627149e221c9fbd7c3379e33fb68e68511 (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.c | 22 |
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 343089bf2c5..5d690e8c332 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... */ |