diff options
-rw-r--r-- | src/intel/compiler/brw_fs.cpp | 15 | ||||
-rw-r--r-- | src/intel/compiler/brw_vec4_visitor.cpp | 5 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_nir_uniforms.cpp | 2 |
3 files changed, 14 insertions, 8 deletions
diff --git a/src/intel/compiler/brw_fs.cpp b/src/intel/compiler/brw_fs.cpp index c08e28d166a..f9e7385afdf 100644 --- a/src/intel/compiler/brw_fs.cpp +++ b/src/intel/compiler/brw_fs.cpp @@ -2084,14 +2084,17 @@ fs_visitor::assign_constant_locations() if (thread_local_id_index >= 0) push_constant_loc[thread_local_id_index] = num_push_constants++; - /* As the uniforms are going to be reordered, take the data from a temporary - * copy of the original param[]. + /* As the uniforms are going to be reordered, stash the old array and + * create two new arrays for push/pull params. */ - uint32_t *param = ralloc_array(NULL, uint32_t, stage_prog_data->nr_params); - memcpy(param, stage_prog_data->param, - sizeof(uint32_t) * stage_prog_data->nr_params); + uint32_t *param = stage_prog_data->param; stage_prog_data->nr_params = num_push_constants; - stage_prog_data->nr_pull_params = num_pull_constants; + stage_prog_data->param = ralloc_array(NULL, uint32_t, num_push_constants); + if (num_pull_constants > 0) { + stage_prog_data->nr_pull_params = num_pull_constants; + stage_prog_data->pull_param = ralloc_array(NULL, uint32_t, + num_pull_constants); + } /* Now that we know how many regular uniforms we'll push, reduce the * UBO push ranges so we don't exceed the 3DSTATE_CONSTANT limits. diff --git a/src/intel/compiler/brw_vec4_visitor.cpp b/src/intel/compiler/brw_vec4_visitor.cpp index ff5cd2d4334..ae516196b15 100644 --- a/src/intel/compiler/brw_vec4_visitor.cpp +++ b/src/intel/compiler/brw_vec4_visitor.cpp @@ -1782,6 +1782,11 @@ vec4_visitor::move_uniform_array_access_to_pull_constants() return; } + /* Allocate the pull_params array */ + assert(stage_prog_data->nr_pull_params == 0); + stage_prog_data->pull_param = ralloc_array(mem_ctx, uint32_t, + this->uniforms * 4); + int pull_constant_loc[this->uniforms]; memset(pull_constant_loc, -1, sizeof(pull_constant_loc)); diff --git a/src/mesa/drivers/dri/i965/brw_nir_uniforms.cpp b/src/mesa/drivers/dri/i965/brw_nir_uniforms.cpp index a3e7b12acd3..62755fda206 100644 --- a/src/mesa/drivers/dri/i965/brw_nir_uniforms.cpp +++ b/src/mesa/drivers/dri/i965/brw_nir_uniforms.cpp @@ -195,7 +195,6 @@ brw_nir_setup_glsl_uniforms(void *mem_ctx, nir_shader *shader, unsigned nr_params = shader->num_uniforms / 4; stage_prog_data->nr_params = nr_params; stage_prog_data->param = rzalloc_array(mem_ctx, uint32_t, nr_params); - stage_prog_data->pull_param = rzalloc_array(mem_ctx, uint32_t, nr_params); nir_foreach_variable(var, &shader->uniforms) { /* UBO's, atomics and samplers don't take up space in the @@ -223,7 +222,6 @@ brw_nir_setup_arb_uniforms(void *mem_ctx, nir_shader *shader, unsigned nr_params = plist->NumParameters * 4; stage_prog_data->nr_params = nr_params; stage_prog_data->param = rzalloc_array(mem_ctx, uint32_t, nr_params); - stage_prog_data->pull_param = rzalloc_array(mem_ctx, uint32_t, nr_params); /* For ARB programs, prog_to_nir generates a single "parameters" variable * for all uniform data. nir_lower_wpos_ytransform may also create an |