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.
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));
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
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