diff --git a/src/gallium/drivers/radeonsi/si_compute_blit.c b/src/gallium/drivers/radeonsi/si_compute_blit.c index 92598731579..39fdbedd592 100644 --- a/src/gallium/drivers/radeonsi/si_compute_blit.c +++ b/src/gallium/drivers/radeonsi/si_compute_blit.c @@ -693,9 +693,10 @@ void gfx9_clear_dcc_msaa(struct si_context *sctx, struct pipe_resource *res, uin /* These variables identify the shader variant. */ unsigned swizzle_mode = tex->surface.u.gfx9.swizzle_mode; unsigned bpe_log2 = util_logbase2(tex->surface.bpe); - bool samples8 = tex->buffer.b.b.nr_storage_samples == 8; + unsigned log2_samples = util_logbase2(tex->buffer.b.b.nr_samples); + bool fragments8 = tex->buffer.b.b.nr_storage_samples == 8; bool is_array = tex->buffer.b.b.array_size > 1; - void **shader = &sctx->cs_clear_dcc_msaa[swizzle_mode][bpe_log2][samples8][is_array]; + void **shader = &sctx->cs_clear_dcc_msaa[swizzle_mode][bpe_log2][fragments8][log2_samples - 2][is_array]; if (!*shader) *shader = gfx9_create_clear_dcc_msaa_cs(sctx, tex); diff --git a/src/gallium/drivers/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c index cbfefc37053..3556c8a074d 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.c +++ b/src/gallium/drivers/radeonsi/si_pipe.c @@ -272,8 +272,10 @@ static void si_destroy_context(struct pipe_context *context) for (unsigned j = 0; j < ARRAY_SIZE(sctx->cs_clear_dcc_msaa[i]); j++) { for (unsigned k = 0; k < ARRAY_SIZE(sctx->cs_clear_dcc_msaa[i][j]); k++) { for (unsigned l = 0; l < ARRAY_SIZE(sctx->cs_clear_dcc_msaa[i][j][k]); l++) { - if (sctx->cs_clear_dcc_msaa[i][j][k][l]) - sctx->b.delete_compute_state(&sctx->b, sctx->cs_clear_dcc_msaa[i][j][k][l]); + for (unsigned m = 0; m < ARRAY_SIZE(sctx->cs_clear_dcc_msaa[i][j][k][l]); m++) { + if (sctx->cs_clear_dcc_msaa[i][j][k][l][m]) + sctx->b.delete_compute_state(&sctx->b, sctx->cs_clear_dcc_msaa[i][j][k][l][m]); + } } } } diff --git a/src/gallium/drivers/radeonsi/si_pipe.h b/src/gallium/drivers/radeonsi/si_pipe.h index fe1f81fad57..60a26230986 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.h +++ b/src/gallium/drivers/radeonsi/si_pipe.h @@ -1320,7 +1320,8 @@ struct si_context { /* Shaders. */ /* TODO: move other shaders here too */ - void *cs_clear_dcc_msaa[32][5][2][2]; /* [swizzle_mode][log2(bpe)][samples == 8][is_array] */ + /* Only used for DCC MSAA clears with 4-8 fragments and 4-16 samples. */ + void *cs_clear_dcc_msaa[32][5][2][3][2]; /* [swizzle_mode][log2(bpe)][fragments == 8][log2(samples)-2][is_array] */ }; /* si_blit.c */