summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicolai Hähnle <nicolai.haehnle@amd.com>2016-11-18 15:18:10 +0100
committerEmil Velikov <emil.l.velikov@gmail.com>2016-11-24 16:34:41 +0000
commit3d5b40fa763acb7c1564f9b4d0785f582210927b (patch)
treea859704eadf501c8be01f4551729952830602095
parent9581776d53c963d7147666b4027dbdb55c9de95f (diff)
downloadexternal_mesa3d-3d5b40fa763acb7c1564f9b4d0785f582210927b.zip
external_mesa3d-3d5b40fa763acb7c1564f9b4d0785f582210927b.tar.gz
external_mesa3d-3d5b40fa763acb7c1564f9b4d0785f582210927b.tar.bz2
radeonsi: store group_size_variable in struct si_compute
For compute shaders, we free the selector after the shader has been compiled, so we need to save this bit somewhere else. Also, make sure that this type of bug cannot re-appear, by NULL-ing the selector pointer after we're done with it. This bug has been there since the feature was added, but was only exposed in piglit arb_compute_variable_group_size-local-size by commit 9bfee7047b70cb0aa026ca9536465762f96cb2b1 (which is totally unrelated). Cc: 13.0 <mesa-stable@lists.freedesktop.org> Reviewed-by: Marek Olšák <marek.olsak@amd.com> (cherry picked from commit 42d5e91a2ae235c007c5d17935be9bb1c4ff388e)
-rw-r--r--src/gallium/drivers/radeonsi/si_compute.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/src/gallium/drivers/radeonsi/si_compute.c b/src/gallium/drivers/radeonsi/si_compute.c
index e785106..a35187c 100644
--- a/src/gallium/drivers/radeonsi/si_compute.c
+++ b/src/gallium/drivers/radeonsi/si_compute.c
@@ -42,7 +42,8 @@ struct si_compute {
struct si_shader shader;
struct pipe_resource *global_buffers[MAX_GLOBAL_BUFFERS];
- bool use_code_object_v2;
+ unsigned use_code_object_v2 : 1;
+ unsigned variable_group_size : 1;
};
struct dispatch_packet {
@@ -147,7 +148,11 @@ static void *si_create_compute_state(
S_00B84C_TGID_Z_EN(1) | S_00B84C_TIDIG_COMP_CNT(2) |
S_00B84C_LDS_SIZE(shader->config.lds_size);
+ program->variable_group_size =
+ sel.info.properties[TGSI_PROPERTY_CS_FIXED_BLOCK_WIDTH] == 0;
+
FREE(sel.tokens);
+ program->shader.selector = NULL;
} else {
const struct pipe_llvm_program_header *header;
const char *code;
@@ -607,14 +612,12 @@ static void si_setup_tgsi_grid(struct si_context *sctx,
}
} else {
struct si_compute *program = sctx->cs_shader_state.program;
- bool variable_group_size =
- program->shader.selector->info.properties[TGSI_PROPERTY_CS_FIXED_BLOCK_WIDTH] == 0;
- radeon_set_sh_reg_seq(cs, grid_size_reg, variable_group_size ? 6 : 3);
+ radeon_set_sh_reg_seq(cs, grid_size_reg, program->variable_group_size ? 6 : 3);
radeon_emit(cs, info->grid[0]);
radeon_emit(cs, info->grid[1]);
radeon_emit(cs, info->grid[2]);
- if (variable_group_size) {
+ if (program->variable_group_size) {
radeon_emit(cs, info->block[0]);
radeon_emit(cs, info->block[1]);
radeon_emit(cs, info->block[2]);