summaryrefslogtreecommitdiff
path: root/src/mesa/shader/prog_parameter.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/shader/prog_parameter.c')
-rw-r--r--src/mesa/shader/prog_parameter.c60
1 files changed, 38 insertions, 22 deletions
diff --git a/src/mesa/shader/prog_parameter.c b/src/mesa/shader/prog_parameter.c
index 84e92d7ed0..cdc8a20001 100644
--- a/src/mesa/shader/prog_parameter.c
+++ b/src/mesa/shader/prog_parameter.c
@@ -66,36 +66,41 @@ _mesa_free_parameter_list(struct gl_program_parameter_list *paramList)
/**
* Add a new parameter to a parameter list.
+ * Note that parameter values are usually 4-element GLfloat vectors.
+ * When size > 4 we'll allocate a sequential block of parameters to
+ * store all the values (in blocks of 4).
+ *
* \param paramList the list to add the parameter to
* \param name the parameter name, will be duplicated/copied!
* \param values initial parameter value, up to 4 GLfloats
- * \param size number of elements in 'values' vector (1..4)
+ * \param size number of elements in 'values' vector (1..4, or more)
* \param type type of parameter, such as
* \return index of new parameter in the list, or -1 if error (out of mem)
*/
GLint
_mesa_add_parameter(struct gl_program_parameter_list *paramList,
- const char *name, const GLfloat values[4], GLuint size,
+ const char *name, const GLfloat *values, GLuint size,
enum register_file type)
{
- const GLuint n = paramList->NumParameters;
+ const GLuint oldNum = paramList->NumParameters;
+ const GLuint sz4 = (size + 3) / 4; /* no. of new param slots needed */
+
+ assert(size > 0);
+ assert(size <= 16); /* XXX anything larger than a matrix??? */
- if (n == paramList->Size) {
- /* Need to grow the parameter list array */
- if (paramList->Size == 0)
- paramList->Size = 8;
- else
- paramList->Size *= 2;
+ if (oldNum + sz4 > paramList->Size) {
+ /* Need to grow the parameter list array (alloc some extra) */
+ paramList->Size = paramList->Size + 4 * sz4;
/* realloc arrays */
paramList->Parameters = (struct gl_program_parameter *)
_mesa_realloc(paramList->Parameters,
- n * sizeof(struct gl_program_parameter),
+ oldNum * sizeof(struct gl_program_parameter),
paramList->Size * sizeof(struct gl_program_parameter));
paramList->ParameterValues = (GLfloat (*)[4])
_mesa_align_realloc(paramList->ParameterValues, /* old buf */
- n * 4 * sizeof(GLfloat), /* old size */
+ oldNum * 4 * sizeof(GLfloat), /* old size */
paramList->Size * 4 *sizeof(GLfloat), /* new sz */
16);
}
@@ -108,17 +113,25 @@ _mesa_add_parameter(struct gl_program_parameter_list *paramList,
return -1;
}
else {
- paramList->NumParameters = n + 1;
+ GLuint i;
+
+ paramList->NumParameters = oldNum + sz4;
- _mesa_memset(&paramList->Parameters[n], 0,
- sizeof(struct gl_program_parameter));
+ _mesa_memset(&paramList->Parameters[oldNum], 0,
+ sz4 * sizeof(struct gl_program_parameter));
- paramList->Parameters[n].Name = name ? _mesa_strdup(name) : NULL;
- paramList->Parameters[n].Type = type;
- paramList->Parameters[n].Size = size;
- if (values)
- COPY_4V(paramList->ParameterValues[n], values);
- return (GLint) n;
+ for (i = 0; i < sz4; i++) {
+ struct gl_program_parameter *p = paramList->Parameters + oldNum + i;
+ p->Name = name ? _mesa_strdup(name) : NULL;
+ p->Type = type;
+ p->Size = size;
+ if (values) {
+ COPY_4V(paramList->ParameterValues[oldNum + i], values);
+ values += 4;
+ }
+ size -= 4;
+ }
+ return (GLint) oldNum;
}
}
@@ -203,7 +216,6 @@ _mesa_add_uniform(struct gl_program_parameter_list *paramList,
return i;
}
else {
- assert(size == 4);
i = _mesa_add_parameter(paramList, name, NULL, size, PROGRAM_UNIFORM);
return i;
}
@@ -429,8 +441,9 @@ _mesa_clone_parameter_list(const struct gl_program_parameter_list *list)
/** Not too efficient, but correct */
for (i = 0; i < list->NumParameters; i++) {
struct gl_program_parameter *p = list->Parameters + i;
+ GLuint size = MIN2(p->Size, 4);
GLint j = _mesa_add_parameter(clone, p->Name, list->ParameterValues[i],
- p->Size, p->Type);
+ size, p->Type);
ASSERT(j >= 0);
/* copy state indexes */
if (p->Type == PROGRAM_STATE_VAR) {
@@ -440,6 +453,9 @@ _mesa_clone_parameter_list(const struct gl_program_parameter_list *list)
q->StateIndexes[k] = p->StateIndexes[k];
}
}
+ else {
+ clone->Parameters[j].Size = p->Size;
+ }
}
return clone;