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;
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++) {

View File

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

View File

@ -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) {

View File

@ -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(&paramList->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;
}
}

View File

@ -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,

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.
* 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

View File

@ -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