diff options
| author | Marek Olšák <maraeo@gmail.com> | 2010-08-01 16:42:53 +0200 | 
|---|---|---|
| committer | Marek Olšák <maraeo@gmail.com> | 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 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... */ | 
