diff options
Diffstat (limited to 'src/gallium/drivers/r300/r300_texture_desc.c')
-rw-r--r-- | src/gallium/drivers/r300/r300_texture_desc.c | 37 |
1 files changed, 19 insertions, 18 deletions
diff --git a/src/gallium/drivers/r300/r300_texture_desc.c b/src/gallium/drivers/r300/r300_texture_desc.c index 04d439bcc1f..9493eb19c28 100644 --- a/src/gallium/drivers/r300/r300_texture_desc.c +++ b/src/gallium/drivers/r300/r300_texture_desc.c @@ -53,37 +53,28 @@ unsigned r300_get_pixel_alignment(enum pipe_format format, {{ 64, 8}, {32, 16}, { 0, 0}}, /* 32 bits per pixel */ {{ 32, 8}, {16, 16}, { 0, 0}}, /* 64 bits per pixel */ {{ 16, 8}, { 0, 0}, { 0, 0}} /* 128 bits per pixel */ } }; - static const unsigned aa_block[2] = {4, 8}; unsigned tile = 0; unsigned pixsize = util_format_get_blocksize(format); assert(macrotile <= RADEON_LAYOUT_TILED); assert(microtile <= RADEON_LAYOUT_SQUARETILED); assert(pixsize <= 16); assert(dim <= DIM_HEIGHT); - if (num_samples > 1) { - /* Multisampled textures have their own alignment scheme. */ - if (pixsize == 4) - tile = aa_block[dim]; - /* XXX FP16 AA. */ - } else { - /* Standard alignment. */ - tile = table[macrotile][util_logbase2(pixsize)][microtile][dim]; - if (macrotile == 0 && is_rs690 && dim == DIM_WIDTH) { - int align; - int h_tile; - h_tile = table[macrotile][util_logbase2(pixsize)][microtile][DIM_HEIGHT]; - align = 64 / (pixsize * h_tile); - if (tile < align) - tile = align; - } + tile = table[macrotile][util_logbase2(pixsize)][microtile][dim]; + if (macrotile == 0 && is_rs690 && dim == DIM_WIDTH) { + int align; + int h_tile; + h_tile = table[macrotile][util_logbase2(pixsize)][microtile][DIM_HEIGHT]; + align = 64 / (pixsize * h_tile); + if (tile < align) + tile = align; } assert(tile); return tile; } @@ -92,12 +83,16 @@ static boolean r300_texture_macro_switch(struct r300_resource *tex, unsigned level, boolean rv350_mode, enum r300_dim dim) { unsigned tile, texdim; + if (tex->b.b.nr_samples > 1) { + return TRUE; + } + tile = r300_get_pixel_alignment(tex->b.b.format, tex->b.b.nr_samples, tex->tex.microtile, RADEON_LAYOUT_TILED, dim, 0); if (dim == DIM_WIDTH) { texdim = u_minify(tex->tex.width0, level); } else { texdim = u_minify(tex->tex.height0, level); @@ -245,13 +240,13 @@ static void r300_setup_miptree(struct r300_screen *screen, nblocksy = r300_texture_get_nblocksy(tex, i, &aligned_for_cbzb); else nblocksy = r300_texture_get_nblocksy(tex, i, NULL); layer_size = stride * nblocksy; - if (base->nr_samples) { + if (base->nr_samples > 1) { layer_size *= base->nr_samples; } if (base->target == PIPE_TEXTURE_CUBE) size = layer_size * 6; else @@ -420,12 +415,18 @@ static void r300_setup_tiling(struct r300_screen *screen, { enum pipe_format format = tex->b.b.format; boolean rv350_mode = screen->caps.family >= CHIP_FAMILY_R350; boolean is_zb = util_format_is_depth_or_stencil(format); boolean dbg_no_tiling = SCREEN_DBG_ON(screen, DBG_NO_TILING); + if (tex->b.b.nr_samples > 1) { + tex->tex.microtile = RADEON_LAYOUT_TILED; + tex->tex.macrotile[0] = RADEON_LAYOUT_TILED; + return; + } + tex->tex.microtile = RADEON_LAYOUT_LINEAR; tex->tex.macrotile[0] = RADEON_LAYOUT_LINEAR; if (!util_format_is_plain(format)) { return; } |