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:
parent
25e242155b
commit
158351007e
|
@ -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++) {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue