[Mesa-dev] [PATCH] radeonsi: store group_size_variable in struct si_compute
Marek Olšák
maraeo at gmail.com
Fri Nov 18 22:41:55 UTC 2016
Reviewed-by: Marek Olšák <marek.olsak at amd.com>
Marek
On Fri, Nov 18, 2016 at 8:22 PM, Nicolai Hähnle <nhaehnle at gmail.com> wrote:
> From: Nicolai Hähnle <nicolai.haehnle at amd.com>
>
> 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 at lists.freedesktop.org>
> ---
> src/gallium/drivers/radeonsi/si_compute.c | 13 ++++++++-----
> 1 file changed, 8 insertions(+), 5 deletions(-)
>
> diff --git a/src/gallium/drivers/radeonsi/si_compute.c b/src/gallium/drivers/radeonsi/si_compute.c
> index f1887bb..69d57b9 100644
> --- a/src/gallium/drivers/radeonsi/si_compute.c
> +++ b/src/gallium/drivers/radeonsi/si_compute.c
> @@ -35,21 +35,22 @@
> #define MAX_GLOBAL_BUFFERS 20
>
> struct si_compute {
> unsigned ir_type;
> unsigned local_size;
> unsigned private_size;
> unsigned input_size;
> 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 {
> uint16_t header;
> uint16_t setup;
> uint16_t workgroup_size_x;
> uint16_t workgroup_size_y;
> uint16_t workgroup_size_z;
> uint16_t reserved0;
> uint32_t grid_size_x;
> @@ -140,21 +141,25 @@ static void *si_create_compute_state(
> S_00B848_SGPRS((shader->config.num_sgprs - 1) / 8) |
> S_00B848_DX10_CLAMP(1) |
> S_00B848_FLOAT_MODE(shader->config.float_mode);
>
> shader->config.rsrc2 = S_00B84C_USER_SGPR(SI_CS_NUM_USER_SGPR) |
> S_00B84C_SCRATCH_EN(scratch_enabled) |
> S_00B84C_TGID_X_EN(1) | S_00B84C_TGID_Y_EN(1) |
> 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;
> header = cso->prog;
> code = cso->prog + sizeof(struct pipe_llvm_program_header);
>
> radeon_elf_read(code, header->num_bytes, &program->shader.binary);
> if (program->use_code_object_v2) {
> const amd_kernel_code_t *code_object =
> si_compute_get_code_object(program, 0);
> @@ -600,28 +605,26 @@ static void si_setup_tgsi_grid(struct si_context *sctx,
> radeon_emit(cs, PKT3(PKT3_COPY_DATA, 4, 0));
> radeon_emit(cs, COPY_DATA_SRC_SEL(COPY_DATA_MEM) |
> COPY_DATA_DST_SEL(COPY_DATA_REG));
> radeon_emit(cs, (va + 4 * i));
> radeon_emit(cs, (va + 4 * i) >> 32);
> radeon_emit(cs, (grid_size_reg >> 2) + i);
> radeon_emit(cs, 0);
> }
> } 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]);
> }
> }
> }
>
> static void si_emit_dispatch_packets(struct si_context *sctx,
> const struct pipe_grid_info *info)
> {
> --
> 2.7.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list