From 158351007e078a1e2068dee1e3913f9ff973cf49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Fri, 20 Nov 2020 18:12:17 -0500 Subject: [PATCH] mesa: track ParameterValues size separately MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is needed for multi-slot parameters. Reviewed-by: Zoltán Böszörményi Part-of: --- src/compiler/glsl/gl_nir_link_uniforms.c | 2 +- src/compiler/glsl/serialize.cpp | 2 +- src/mesa/program/ir_to_mesa.cpp | 2 +- src/mesa/program/prog_parameter.c | 30 ++++++++++++++-------- src/mesa/program/prog_parameter.h | 6 +++-- src/mesa/state_tracker/st_glsl_to_nir.cpp | 2 +- src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 2 +- 7 files changed, 28 insertions(+), 18 deletions(-) diff --git a/src/compiler/glsl/gl_nir_link_uniforms.c b/src/compiler/glsl/gl_nir_link_uniforms.c index cd26cb33fce..005f99273c2 100644 --- a/src/compiler/glsl/gl_nir_link_uniforms.c +++ b/src/compiler/glsl/gl_nir_link_uniforms.c @@ -659,7 +659,7 @@ add_parameter(struct gl_uniform_storage *uniform, struct gl_program_parameter_list *params = state->params; int base_index = params->NumParameters; - _mesa_reserve_parameter_storage(params, num_params); + _mesa_reserve_parameter_storage(params, num_params, num_params); if (ctx->Const.PackedDriverUniformStorage) { for (unsigned i = 0; i < num_params; i++) { diff --git a/src/compiler/glsl/serialize.cpp b/src/compiler/glsl/serialize.cpp index 2f68d1b9785..fefef8ff28a 100644 --- a/src/compiler/glsl/serialize.cpp +++ b/src/compiler/glsl/serialize.cpp @@ -1054,7 +1054,7 @@ read_shader_parameters(struct blob_reader *metadata, uint32_t i = 0; uint32_t num_parameters = blob_read_uint32(metadata); - _mesa_reserve_parameter_storage(params, num_parameters); + _mesa_reserve_parameter_storage(params, num_parameters, num_parameters); while (i < num_parameters) { gl_register_file type = (gl_register_file) blob_read_uint32(metadata); const char *name = blob_read_string(metadata); diff --git a/src/mesa/program/ir_to_mesa.cpp b/src/mesa/program/ir_to_mesa.cpp index dc89284ba05..8acbb64bd2b 100644 --- a/src/mesa/program/ir_to_mesa.cpp +++ b/src/mesa/program/ir_to_mesa.cpp @@ -2391,7 +2391,7 @@ add_uniform_to_shader::visit_field(const glsl_type *type, const char *name, if (is_dual_slot) num_params *= 2; - _mesa_reserve_parameter_storage(params, num_params); + _mesa_reserve_parameter_storage(params, num_params, num_params); index = params->NumParameters; if (ctx->Const.PackedDriverUniformStorage) { diff --git a/src/mesa/program/prog_parameter.c b/src/mesa/program/prog_parameter.c index 9246031e66c..ea8965e54fa 100644 --- a/src/mesa/program/prog_parameter.c +++ b/src/mesa/program/prog_parameter.c @@ -145,7 +145,7 @@ _mesa_new_parameter_list_sized(unsigned size) if ((p != NULL) && (size != 0)) { - _mesa_reserve_parameter_storage(p, size); + _mesa_reserve_parameter_storage(p, size, size); if ((p->Parameters == NULL) || (p->ParameterValues == NULL)) { free(p->Parameters); @@ -181,17 +181,20 @@ _mesa_free_parameter_list(struct gl_program_parameter_list *paramList) * if needed. * * \param paramList where to reserve parameter slots - * \param reserve_slots number of slots to reserve + * \param reserve_params number of parameter description slots + * \param reserve_values number of parameter vec4 slots */ void _mesa_reserve_parameter_storage(struct gl_program_parameter_list *paramList, - unsigned reserve_slots) + unsigned reserve_params, + unsigned reserve_values) { const GLuint oldNum = paramList->NumParameters; + const unsigned oldValNum = paramList->NumParameterValues; - if (oldNum + reserve_slots > paramList->Size) { + if (oldNum + reserve_params > paramList->Size) { /* Need to grow the parameter list array (alloc some extra) */ - paramList->Size = paramList->Size + 4 * reserve_slots; + paramList->Size += 4 * reserve_params; /* realloc arrays */ paramList->Parameters = @@ -201,11 +204,15 @@ _mesa_reserve_parameter_storage(struct gl_program_parameter_list *paramList, paramList->ParameterValueOffset = realloc(paramList->ParameterValueOffset, paramList->Size * sizeof(unsigned)); + } + + if (oldValNum + reserve_values > paramList->SizeValues) { + paramList->SizeValues += 4 * reserve_values; paramList->ParameterValues = (gl_constant_value *) align_realloc(paramList->ParameterValues, /* old buf */ oldNum * 4 * sizeof(gl_constant_value),/* old sz */ - paramList->Size*4*sizeof(gl_constant_value),/*new*/ + paramList->SizeValues * 4 * sizeof(gl_constant_value),/*new*/ 16); } } @@ -237,26 +244,27 @@ _mesa_add_parameter(struct gl_program_parameter_list *paramList, assert(0 < size && size <=4); const GLuint oldNum = paramList->NumParameters; unsigned oldValNum = paramList->NumParameterValues; + const unsigned padded_size = pad_and_align ? align(size, 4) : size; if (pad_and_align) oldValNum = align(oldValNum, 4); /* pad start to a vec4 boundary */ else if (_mesa_gl_datatype_is_64bit(datatype)) oldValNum = align(oldValNum, 2); /* pad start to 64-bit */ - _mesa_reserve_parameter_storage(paramList, 1); + _mesa_reserve_parameter_storage(paramList, 1, 1); if (!paramList->Parameters || !paramList->ParameterValueOffset || !paramList->ParameterValues) { /* out of memory */ paramList->NumParameters = 0; paramList->Size = 0; + paramList->SizeValues = 0; return -1; } paramList->NumParameters = oldNum + 1; - unsigned pad = pad_and_align ? align(size, 4) : size; - paramList->NumParameterValues = oldValNum + pad; + paramList->NumParameterValues = oldValNum + padded_size; memset(¶mList->Parameters[oldNum], 0, sizeof(struct gl_program_parameter)); @@ -281,12 +289,12 @@ _mesa_add_parameter(struct gl_program_parameter_list *paramList, } /* Zero out padding (if any) to avoid valgrind errors */ - for (; j < pad; j++) { + for (; j < padded_size; j++) { paramList->ParameterValues[oldValNum + j].f = 0; } } } else { - for (unsigned j = 0; j < 4; j++) { + for (unsigned j = 0; j < padded_size; j++) { paramList->ParameterValues[oldValNum + j].f = 0; } } diff --git a/src/mesa/program/prog_parameter.h b/src/mesa/program/prog_parameter.h index 1fb0c5b7d1f..7784436b671 100644 --- a/src/mesa/program/prog_parameter.h +++ b/src/mesa/program/prog_parameter.h @@ -133,7 +133,8 @@ struct gl_program_parameter */ struct gl_program_parameter_list { - GLuint Size; /**< allocated size of Parameters, ParameterValues */ + unsigned Size; /**< allocated size of Parameters */ + unsigned SizeValues; /**< alllocate size of ParameterValues */ GLuint NumParameters; /**< number of used parameters in array */ unsigned NumParameterValues; /**< number of used parameter values array */ struct gl_program_parameter *Parameters; /**< Array [Size] */ @@ -155,7 +156,8 @@ _mesa_free_parameter_list(struct gl_program_parameter_list *paramList); extern void _mesa_reserve_parameter_storage(struct gl_program_parameter_list *paramList, - unsigned reserve_slots); + unsigned reserve_params, + unsigned reserve_values); extern GLint _mesa_add_parameter(struct gl_program_parameter_list *paramList, diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp index d483d526cc9..1f5de083dfc 100644 --- a/src/mesa/state_tracker/st_glsl_to_nir.cpp +++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp @@ -467,7 +467,7 @@ st_glsl_to_nir_post_opts(struct st_context *st, struct gl_program *prog, * storage is only associated with the original parameter list. * This should be enough for Bitmap and DrawPixels constants. */ - _mesa_reserve_parameter_storage(prog->Parameters, 8); + _mesa_reserve_parameter_storage(prog->Parameters, 8, 8); /* This has to be done last. Any operation the can cause * prog->ParameterValues to get reallocated (e.g., anything that adds a diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp index 3dc685e71f7..1fb6f627bb7 100644 --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp @@ -7166,7 +7166,7 @@ get_mesa_program_tgsi(struct gl_context *ctx, * storage is only associated with the original parameter list. * This should be enough for Bitmap and DrawPixels constants. */ - _mesa_reserve_parameter_storage(prog->Parameters, 8); + _mesa_reserve_parameter_storage(prog->Parameters, 8, 8); /* This has to be done last. Any operation the can cause * prog->ParameterValues to get reallocated (e.g., anything that adds a