mesa: track ParameterValues size separately

This is needed for multi-slot parameters.

Reviewed-by: Zoltán Böszörményi <zboszor@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6946>
This commit is contained in:
Marek Olšák 2020-11-20 18:12:17 -05:00 committed by Marge Bot
parent 25e242155b
commit 158351007e
7 changed files with 28 additions and 18 deletions

View File

@ -659,7 +659,7 @@ add_parameter(struct gl_uniform_storage *uniform,
struct gl_program_parameter_list *params = state->params; struct gl_program_parameter_list *params = state->params;
int base_index = params->NumParameters; 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) { if (ctx->Const.PackedDriverUniformStorage) {
for (unsigned i = 0; i < num_params; i++) { for (unsigned i = 0; i < num_params; i++) {

View File

@ -1054,7 +1054,7 @@ read_shader_parameters(struct blob_reader *metadata,
uint32_t i = 0; uint32_t i = 0;
uint32_t num_parameters = blob_read_uint32(metadata); 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) { while (i < num_parameters) {
gl_register_file type = (gl_register_file) blob_read_uint32(metadata); gl_register_file type = (gl_register_file) blob_read_uint32(metadata);
const char *name = blob_read_string(metadata); const char *name = blob_read_string(metadata);

View File

@ -2391,7 +2391,7 @@ add_uniform_to_shader::visit_field(const glsl_type *type, const char *name,
if (is_dual_slot) if (is_dual_slot)
num_params *= 2; num_params *= 2;
_mesa_reserve_parameter_storage(params, num_params); _mesa_reserve_parameter_storage(params, num_params, num_params);
index = params->NumParameters; index = params->NumParameters;
if (ctx->Const.PackedDriverUniformStorage) { if (ctx->Const.PackedDriverUniformStorage) {

View File

@ -145,7 +145,7 @@ _mesa_new_parameter_list_sized(unsigned size)
if ((p != NULL) && (size != 0)) { 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)) { if ((p->Parameters == NULL) || (p->ParameterValues == NULL)) {
free(p->Parameters); free(p->Parameters);
@ -181,17 +181,20 @@ _mesa_free_parameter_list(struct gl_program_parameter_list *paramList)
* if needed. * if needed.
* *
* \param paramList where to reserve parameter slots * \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 void
_mesa_reserve_parameter_storage(struct gl_program_parameter_list *paramList, _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 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) */ /* Need to grow the parameter list array (alloc some extra) */
paramList->Size = paramList->Size + 4 * reserve_slots; paramList->Size += 4 * reserve_params;
/* realloc arrays */ /* realloc arrays */
paramList->Parameters = paramList->Parameters =
@ -201,11 +204,15 @@ _mesa_reserve_parameter_storage(struct gl_program_parameter_list *paramList,
paramList->ParameterValueOffset = paramList->ParameterValueOffset =
realloc(paramList->ParameterValueOffset, realloc(paramList->ParameterValueOffset,
paramList->Size * sizeof(unsigned)); paramList->Size * sizeof(unsigned));
}
if (oldValNum + reserve_values > paramList->SizeValues) {
paramList->SizeValues += 4 * reserve_values;
paramList->ParameterValues = (gl_constant_value *) paramList->ParameterValues = (gl_constant_value *)
align_realloc(paramList->ParameterValues, /* old buf */ align_realloc(paramList->ParameterValues, /* old buf */
oldNum * 4 * sizeof(gl_constant_value),/* old sz */ 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); 16);
} }
} }
@ -237,26 +244,27 @@ _mesa_add_parameter(struct gl_program_parameter_list *paramList,
assert(0 < size && size <=4); assert(0 < size && size <=4);
const GLuint oldNum = paramList->NumParameters; const GLuint oldNum = paramList->NumParameters;
unsigned oldValNum = paramList->NumParameterValues; unsigned oldValNum = paramList->NumParameterValues;
const unsigned padded_size = pad_and_align ? align(size, 4) : size;
if (pad_and_align) if (pad_and_align)
oldValNum = align(oldValNum, 4); /* pad start to a vec4 boundary */ oldValNum = align(oldValNum, 4); /* pad start to a vec4 boundary */
else if (_mesa_gl_datatype_is_64bit(datatype)) else if (_mesa_gl_datatype_is_64bit(datatype))
oldValNum = align(oldValNum, 2); /* pad start to 64-bit */ 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 || if (!paramList->Parameters || !paramList->ParameterValueOffset ||
!paramList->ParameterValues) { !paramList->ParameterValues) {
/* out of memory */ /* out of memory */
paramList->NumParameters = 0; paramList->NumParameters = 0;
paramList->Size = 0; paramList->Size = 0;
paramList->SizeValues = 0;
return -1; return -1;
} }
paramList->NumParameters = oldNum + 1; paramList->NumParameters = oldNum + 1;
unsigned pad = pad_and_align ? align(size, 4) : size; paramList->NumParameterValues = oldValNum + padded_size;
paramList->NumParameterValues = oldValNum + pad;
memset(&paramList->Parameters[oldNum], 0, memset(&paramList->Parameters[oldNum], 0,
sizeof(struct gl_program_parameter)); 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 */ /* Zero out padding (if any) to avoid valgrind errors */
for (; j < pad; j++) { for (; j < padded_size; j++) {
paramList->ParameterValues[oldValNum + j].f = 0; paramList->ParameterValues[oldValNum + j].f = 0;
} }
} }
} else { } else {
for (unsigned j = 0; j < 4; j++) { for (unsigned j = 0; j < padded_size; j++) {
paramList->ParameterValues[oldValNum + j].f = 0; paramList->ParameterValues[oldValNum + j].f = 0;
} }
} }

View File

@ -133,7 +133,8 @@ struct gl_program_parameter
*/ */
struct gl_program_parameter_list 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 */ GLuint NumParameters; /**< number of used parameters in array */
unsigned NumParameterValues; /**< number of used parameter values array */ unsigned NumParameterValues; /**< number of used parameter values array */
struct gl_program_parameter *Parameters; /**< Array [Size] */ struct gl_program_parameter *Parameters; /**< Array [Size] */
@ -155,7 +156,8 @@ _mesa_free_parameter_list(struct gl_program_parameter_list *paramList);
extern void extern void
_mesa_reserve_parameter_storage(struct gl_program_parameter_list *paramList, _mesa_reserve_parameter_storage(struct gl_program_parameter_list *paramList,
unsigned reserve_slots); unsigned reserve_params,
unsigned reserve_values);
extern GLint extern GLint
_mesa_add_parameter(struct gl_program_parameter_list *paramList, _mesa_add_parameter(struct gl_program_parameter_list *paramList,

View File

@ -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. * storage is only associated with the original parameter list.
* This should be enough for Bitmap and DrawPixels constants. * 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 /* This has to be done last. Any operation the can cause
* prog->ParameterValues to get reallocated (e.g., anything that adds a * prog->ParameterValues to get reallocated (e.g., anything that adds a

View File

@ -7166,7 +7166,7 @@ get_mesa_program_tgsi(struct gl_context *ctx,
* storage is only associated with the original parameter list. * storage is only associated with the original parameter list.
* This should be enough for Bitmap and DrawPixels constants. * 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 /* This has to be done last. Any operation the can cause
* prog->ParameterValues to get reallocated (e.g., anything that adds a * prog->ParameterValues to get reallocated (e.g., anything that adds a