summaryrefslogtreecommitdiff
path: root/src/mesa/shader/program.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/shader/program.c')
-rw-r--r--src/mesa/shader/program.c57
1 files changed, 32 insertions, 25 deletions
diff --git a/src/mesa/shader/program.c b/src/mesa/shader/program.c
index 15b9021660..bc8bc1bcfa 100644
--- a/src/mesa/shader/program.c
+++ b/src/mesa/shader/program.c
@@ -352,7 +352,11 @@ void
_mesa_free_parameter_list(struct program_parameter_list *paramList)
{
_mesa_free_parameters(paramList);
+ _mesa_free(paramList->Parameters);
+ _mesa_free(paramList->ParameterValues);
_mesa_free(paramList);
+ paramList->Parameters = NULL;
+ paramList->ParameterValues = NULL;
}
@@ -365,12 +369,10 @@ _mesa_free_parameters(struct program_parameter_list *paramList)
{
GLuint i;
for (i = 0; i < paramList->NumParameters; i++) {
- _mesa_free((void *) paramList->Parameters[i].Name);
+ if (paramList->Parameters[i].Name)
+ _mesa_free((void *) paramList->Parameters[i].Name);
}
- _mesa_free(paramList->Parameters);
- _mesa_free(paramList->ParameterValues);
paramList->NumParameters = 0;
- paramList->Parameters = NULL;
}
@@ -384,24 +386,31 @@ add_parameter(struct program_parameter_list *paramList,
{
const GLuint n = paramList->NumParameters;
- paramList->Parameters = (struct program_parameter *)
- _mesa_realloc(paramList->Parameters,
- n * sizeof(struct program_parameter),
- (n + 1) * sizeof(struct program_parameter));
- paramList->ParameterValues = (GLfloat (*)[4])
- _mesa_realloc(paramList->ParameterValues,
- n * 4 * sizeof(GLfloat),
- (n + 1) * 4 * sizeof(GLfloat));
+ if (n == paramList->Size) {
+ paramList->Size *= 2;
+ if (!paramList->Size)
+ paramList->Size = 4;
+
+ paramList->Parameters = (struct program_parameter *)
+ _mesa_realloc(paramList->Parameters,
+ n * sizeof(struct program_parameter),
+ paramList->Size * sizeof(struct program_parameter));
+ paramList->ParameterValues = (GLfloat (*)[4])
+ _mesa_realloc(paramList->ParameterValues,
+ n * 4 * sizeof(GLfloat),
+ paramList->Size * 4 * sizeof(GLfloat));
+ }
if (!paramList->Parameters ||
!paramList->ParameterValues) {
/* out of memory */
paramList->NumParameters = 0;
+ paramList->Size = 0;
return -1;
}
else {
paramList->NumParameters = n + 1;
- paramList->Parameters[n].Name = _mesa_strdup(name);
+ paramList->Parameters[n].Name = name ? _mesa_strdup(name) : NULL;
paramList->Parameters[n].Type = type;
if (values)
COPY_4V(paramList->ParameterValues[n], values);
@@ -446,13 +455,7 @@ GLint
_mesa_add_unnamed_constant(struct program_parameter_list *paramList,
const GLfloat values[4])
{
- /* generate a new dummy name */
- static GLuint n = 0;
- char name[20];
- _mesa_sprintf(name, "constant%d", n);
- n++;
- /* store it */
- return add_parameter(paramList, name, values, CONSTANT);
+ return add_parameter(paramList, NULL, values, CONSTANT);
}
@@ -472,7 +475,7 @@ _mesa_add_state_reference(struct program_parameter_list *paramList,
*/
GLint a, idx;
- idx = add_parameter(paramList, "Some State", NULL, STATE);
+ idx = add_parameter(paramList, NULL, NULL, STATE);
for (a=0; a<6; a++)
paramList->Parameters[idx].StateIndexes[a] = (enum state_index) stateTokens[a];
@@ -497,14 +500,16 @@ _mesa_lookup_parameter_value(struct program_parameter_list *paramList,
if (nameLen == -1) {
/* name is null-terminated */
for (i = 0; i < paramList->NumParameters; i++) {
- if (_mesa_strcmp(paramList->Parameters[i].Name, name) == 0)
+ if (paramList->Parameters[i].Name &&
+ _mesa_strcmp(paramList->Parameters[i].Name, name) == 0)
return paramList->ParameterValues[i];
}
}
else {
/* name is not null-terminated, use nameLen */
for (i = 0; i < paramList->NumParameters; i++) {
- if (_mesa_strncmp(paramList->Parameters[i].Name, name, nameLen) == 0
+ if (paramList->Parameters[i].Name &&
+ _mesa_strncmp(paramList->Parameters[i].Name, name, nameLen) == 0
&& _mesa_strlen(paramList->Parameters[i].Name) == (size_t)nameLen)
return paramList->ParameterValues[i];
}
@@ -529,14 +534,16 @@ _mesa_lookup_parameter_index(struct program_parameter_list *paramList,
if (nameLen == -1) {
/* name is null-terminated */
for (i = 0; i < (GLint) paramList->NumParameters; i++) {
- if (_mesa_strcmp(paramList->Parameters[i].Name, name) == 0)
+ if (paramList->Parameters[i].Name &&
+ _mesa_strcmp(paramList->Parameters[i].Name, name) == 0)
return i;
}
}
else {
/* name is not null-terminated, use nameLen */
for (i = 0; i < (GLint) paramList->NumParameters; i++) {
- if (_mesa_strncmp(paramList->Parameters[i].Name, name, nameLen) == 0
+ if (paramList->Parameters[i].Name &&
+ _mesa_strncmp(paramList->Parameters[i].Name, name, nameLen) == 0
&& _mesa_strlen(paramList->Parameters[i].Name) == (size_t)nameLen)
return i;
}