mesa: rework _mesa_add_parameter() to only add a single param

This is more inline with what the functions name suggests it should
do, and makes the code much easier to follow.

This will also make adding uniform packing support much simpler.

Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
This commit is contained in:
Timothy Arceri
2017-06-16 09:56:56 +10:00
parent f8a54c489d
commit a39a3b4b76
3 changed files with 41 additions and 39 deletions

View File

@@ -985,7 +985,7 @@ write_shader_parameters(struct blob *metadata,
blob_write_bytes(metadata, param->StateIndexes,
sizeof(param->StateIndexes));
i += (param->Size + 3) / 4;
i++;
}
blob_write_bytes(metadata, params->ParameterValues,
@@ -1014,7 +1014,7 @@ read_shader_parameters(struct blob_reader *metadata,
_mesa_add_parameter(params, type, name, size, data_type,
NULL, state_indexes);
i += (size + 3) / 4;
i++;
}
blob_copy_bytes(metadata, (uint8_t *) params->ParameterValues,

View File

@@ -2431,12 +2431,25 @@ add_uniform_to_shader::visit_field(const glsl_type *type, const char *name,
if (type->contains_opaque() && !var->data.bindless)
return;
/* Add the uniform to the param list */
assert(_mesa_lookup_parameter_index(params, name) < 0);
int index = _mesa_lookup_parameter_index(params, name);
unsigned size = storage_type_size(type, var->data.bindless) * 4;
unsigned num_params = type->arrays_of_arrays_size();
num_params = MAX2(num_params, 1);
num_params *= type->without_array()->matrix_columns;
int index = _mesa_add_parameter(params, PROGRAM_UNIFORM, name, size,
bool is_dual_slot = type->without_array()->is_dual_slot();
if (is_dual_slot)
num_params *= 2;
_mesa_reserve_parameter_storage(params, num_params);
index = params->NumParameters;
for (unsigned i = 0; i < num_params; i++) {
unsigned comps = 4;
_mesa_add_parameter(params, PROGRAM_UNIFORM, name, comps,
type->gl_type, NULL, NULL);
}
/* The first part of the uniform that's processed determines the base
* location of the whole uniform (for structures).

View File

@@ -234,12 +234,10 @@ _mesa_add_parameter(struct gl_program_parameter_list *paramList,
const gl_constant_value *values,
const gl_state_index state[STATE_LENGTH])
{
assert(0 < size && size <=4);
const GLuint oldNum = paramList->NumParameters;
const GLuint sz4 = (size + 3) / 4; /* no. of new param slots needed */
assert(size > 0);
_mesa_reserve_parameter_storage(paramList, sz4);
_mesa_reserve_parameter_storage(paramList, 1);
if (!paramList->Parameters ||
!paramList->ParameterValues) {
@@ -249,44 +247,35 @@ _mesa_add_parameter(struct gl_program_parameter_list *paramList,
return -1;
}
GLuint i, j;
paramList->NumParameters = oldNum + sz4;
paramList->NumParameters = oldNum + 1;
memset(&paramList->Parameters[oldNum], 0,
sz4 * sizeof(struct gl_program_parameter));
sizeof(struct gl_program_parameter));
for (i = 0; i < sz4; i++) {
struct gl_program_parameter *p = paramList->Parameters + oldNum + i;
struct gl_program_parameter *p = paramList->Parameters + oldNum;
p->Name = strdup(name ? name : "");
p->Type = type;
p->Size = size;
p->DataType = datatype;
if (values) {
if (size >= 4) {
COPY_4V(paramList->ParameterValues[oldNum + i], values);
COPY_4V(paramList->ParameterValues[oldNum], values);
} else {
/* copy 1, 2 or 3 values */
assert(size < 4);
for (j = 0; j < size; j++) {
paramList->ParameterValues[oldNum + i][j].f = values[j].f;
}
/* fill in remaining positions with zeros */
for (; j < 4; j++) {
paramList->ParameterValues[oldNum + i][j].f = 0.0f;
for (unsigned j = 0; j < size; j++) {
paramList->ParameterValues[oldNum][j].f = values[j].f;
}
}
values += 4;
} else {
/* silence valgrind */
for (j = 0; j < 4; j++)
paramList->ParameterValues[oldNum + i][j].f = 0;
for (unsigned j = 0; j < 4; j++) {
paramList->ParameterValues[oldNum][j].f = 0;
}
size -= 4;
}
if (state) {
for (i = 0; i < STATE_LENGTH; i++)
for (unsigned i = 0; i < STATE_LENGTH; i++)
paramList->Parameters[oldNum].StateIndexes[i] = state[i];
}