diff options
author | Marek Olšák <marek.olsak@amd.com> | 2019-09-26 16:59:23 -0400 |
---|---|---|
committer | Marge Bot <eric+marge@anholt.net> | 2020-06-09 16:17:36 +0000 |
commit | c4b5fd9ab096a0bb5106b93191b13c81cc32243b (patch) | |
tree | 11fb5a8bb9e2972b92ecfdbbf6613b9fa09f73f6 | |
parent | abe89e13294d98de65207dc9e91d49494748399f (diff) |
radeonsi: honor a user-specified pitch on gfx10.3
Acked-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5383>
-rw-r--r-- | src/gallium/drivers/radeonsi/si_state.c | 26 |
1 files changed, 20 insertions, 6 deletions
diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c index b59f28e028d..3156a60fabf 100644 --- a/src/gallium/drivers/radeonsi/si_state.c +++ b/src/gallium/drivers/radeonsi/si_state.c @@ -3791,12 +3791,26 @@ static void gfx10_make_texture_descriptor( S_00A00C_BASE_LEVEL(res->nr_samples > 1 ? 0 : first_level) | S_00A00C_LAST_LEVEL(res->nr_samples > 1 ? util_logbase2(res->nr_samples) : last_level) | S_00A00C_BC_SWIZZLE(gfx9_border_color_swizzle(desc->swizzle)) | S_00A00C_TYPE(type); - /* Depth is the the last accessible layer on gfx9+. The hw doesn't need - * to know the total number of layers. - */ - state[4] = - S_00A010_DEPTH((type == V_008F1C_SQ_RSRC_IMG_3D && sampler) ? depth - 1 : last_layer) | - S_00A010_BASE_ARRAY(first_layer); + + if (res->target == PIPE_TEXTURE_1D || + res->target == PIPE_TEXTURE_2D) { + /* 1D, 2D, and 2D_MSAA can set a custom pitch for shader resources + * starting with gfx10.3 (ignored if pitch <= width). Other texture + * targets can't. CB and DB can't set a custom pitch for any target. + */ + if (screen->info.chip_class >= GFX10_3) + state[4] = S_00A010_DEPTH(tex->surface.u.gfx9.surf_pitch - 1); + else + state[4] = 0; + } else { + /* Depth is the last accessible layer on gfx9+. The hw doesn't need + * to know the total number of layers. + */ + state[4] = S_00A010_DEPTH((type == V_008F1C_SQ_RSRC_IMG_3D && sampler) ? + depth - 1 : last_layer) | + S_00A010_BASE_ARRAY(first_layer); + } + state[5] = S_00A014_ARRAY_PITCH(!!(type == V_008F1C_SQ_RSRC_IMG_3D && !sampler)) | S_00A014_MAX_MIP(res->nr_samples > 1 ? util_logbase2(res->nr_samples) : tex->buffer.b.b.last_level) | |