diff options
author | Marek Olšák <[email protected]> | 2019-08-12 13:50:00 -0400 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2019-08-19 17:23:38 -0400 |
commit | 43f8b5642b14f77c4028c72e685e61feba29a3d4 (patch) | |
tree | aa93b144749ff6bcf8262e0271110df0ec19d437 /src | |
parent | c315cb509dfd13cfc6ae7a620f50a8552609bf42 (diff) |
radeonsi: allocate and resize global_buffers as needed
Reviewed-by: Pierre-Eric Pelloux-Prayer <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/gallium/drivers/radeonsi/si_compute.c | 23 | ||||
-rw-r--r-- | src/gallium/drivers/radeonsi/si_compute.h | 6 |
2 files changed, 24 insertions, 5 deletions
diff --git a/src/gallium/drivers/radeonsi/si_compute.c b/src/gallium/drivers/radeonsi/si_compute.c index 624b99022cd..ad211ec0a41 100644 --- a/src/gallium/drivers/radeonsi/si_compute.c +++ b/src/gallium/drivers/radeonsi/si_compute.c @@ -318,7 +318,22 @@ static void si_set_global_binding( struct si_context *sctx = (struct si_context*)ctx; struct si_compute *program = sctx->cs_shader_state.program; - assert(first + n <= MAX_GLOBAL_BUFFERS); + if (first + n > program->max_global_buffers) { + unsigned old_max = program->max_global_buffers; + program->max_global_buffers = first + n; + program->global_buffers = + realloc(program->global_buffers, + program->max_global_buffers * + sizeof(program->global_buffers[0])); + if (!program->global_buffers) { + fprintf(stderr, "radeonsi: failed to allocate compute global_buffers\n"); + return; + } + + memset(&program->global_buffers[old_max], 0, + (program->max_global_buffers - old_max) * + sizeof(program->global_buffers[0])); + } if (!resources) { for (i = 0; i < n; i++) { @@ -912,7 +927,7 @@ static void si_launch_grid( return; /* Global buffers */ - for (i = 0; i < MAX_GLOBAL_BUFFERS; i++) { + for (i = 0; i < program->max_global_buffers; i++) { struct si_resource *buffer = si_resource(program->global_buffers[i]); if (!buffer) { @@ -952,6 +967,10 @@ void si_destroy_compute(struct si_compute *program) util_queue_fence_destroy(&sel->ready); } + for (unsigned i = 0; i < program->max_global_buffers; i++) + pipe_resource_reference(&program->global_buffers[i], NULL); + FREE(program->global_buffers); + si_shader_destroy(&program->shader); ralloc_free(program->sel.nir); FREE(program); diff --git a/src/gallium/drivers/radeonsi/si_compute.h b/src/gallium/drivers/radeonsi/si_compute.h index 86021178533..5e2883d9e83 100644 --- a/src/gallium/drivers/radeonsi/si_compute.h +++ b/src/gallium/drivers/radeonsi/si_compute.h @@ -29,8 +29,6 @@ #include "si_shader.h" -#define MAX_GLOBAL_BUFFERS 32 - struct si_compute { struct si_shader_selector sel; struct si_shader shader; @@ -40,7 +38,9 @@ struct si_compute { unsigned private_size; unsigned input_size; - struct pipe_resource *global_buffers[MAX_GLOBAL_BUFFERS]; + int max_global_buffers; + struct pipe_resource **global_buffers; + bool reads_variable_block_size; unsigned num_cs_user_data_dwords; }; |