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;
|
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++) {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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(¶mList->Parameters[oldNum], 0,
|
memset(¶mList->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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue