summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Airlie <[email protected]>2019-08-27 15:30:15 +1000
committerDave Airlie <[email protected]>2019-09-04 15:22:20 +1000
commit6453a22612d71d9b9031025f0cca16dc11fb1db8 (patch)
tree470321537ceef5eb62ca31eb179a8a3dac207983
parent4e709705076324ddc69e26619620752dc3ea094b (diff)
llvmpipe: add local memory allocation path
Reviewed-by: Roland Scheidegger <[email protected]>
-rw-r--r--src/gallium/drivers/llvmpipe/lp_state_cs.c9
-rw-r--r--src/gallium/drivers/llvmpipe/lp_state_cs.h3
2 files changed, 12 insertions, 0 deletions
diff --git a/src/gallium/drivers/llvmpipe/lp_state_cs.c b/src/gallium/drivers/llvmpipe/lp_state_cs.c
index a04313891f3..1645a185cb2 100644
--- a/src/gallium/drivers/llvmpipe/lp_state_cs.c
+++ b/src/gallium/drivers/llvmpipe/lp_state_cs.c
@@ -48,6 +48,7 @@
struct lp_cs_job_info {
unsigned grid_size[3];
unsigned block_size[3];
+ unsigned req_local_mem;
struct lp_cs_exec *current;
};
@@ -395,6 +396,7 @@ llvmpipe_create_compute_state(struct pipe_context *pipe,
assert(templ->ir_type == PIPE_SHADER_IR_TGSI);
shader->base.tokens = tgsi_dup_tokens(templ->prog);
+ shader->req_local_mem = templ->req_local_mem;
lp_build_tgsi_info(shader->base.tokens, &shader->info);
make_empty_list(&shader->variants);
@@ -1120,6 +1122,12 @@ cs_exec_fn(void *init_data, int iter_idx, struct lp_cs_local_mem *lmem)
memset(&thread_data, 0, sizeof(thread_data));
+ if (lmem->local_size < job_info->req_local_mem) {
+ lmem->local_size = job_info->req_local_mem;
+ lmem->local_mem_ptr = realloc(lmem->local_mem_ptr, lmem->local_size);
+ }
+ thread_data.shared = lmem->local_mem_ptr;
+
unsigned grid_z = iter_idx / (job_info->grid_size[0] * job_info->grid_size[1]);
unsigned grid_y = (iter_idx - (grid_z * (job_info->grid_size[0] * job_info->grid_size[1]))) / job_info->grid_size[0];
unsigned grid_x = (iter_idx - (grid_z * (job_info->grid_size[0] * job_info->grid_size[1])) - (grid_y * job_info->grid_size[0]));
@@ -1175,6 +1183,7 @@ static void llvmpipe_launch_grid(struct pipe_context *pipe,
job_info.block_size[0] = info->block[0];
job_info.block_size[1] = info->block[1];
job_info.block_size[2] = info->block[2];
+ job_info.req_local_mem = llvmpipe->cs->req_local_mem;
job_info.current = &llvmpipe->csctx->cs.current;
int num_tasks = job_info.grid_size[2] * job_info.grid_size[1] * job_info.grid_size[0];
diff --git a/src/gallium/drivers/llvmpipe/lp_state_cs.h b/src/gallium/drivers/llvmpipe/lp_state_cs.h
index 481a129ab6e..4bc434edd28 100644
--- a/src/gallium/drivers/llvmpipe/lp_state_cs.h
+++ b/src/gallium/drivers/llvmpipe/lp_state_cs.h
@@ -81,6 +81,9 @@ struct lp_compute_shader {
struct lp_cs_variant_list_item variants;
struct lp_tgsi_info info;
+
+ uint32_t req_local_mem;
+
/* For debugging/profiling purposes */
unsigned variant_key_size;
unsigned no;