1c0025eb1a3d421c0355a21db9d8ea2bd81278460David Li// all allocations need to use hieralloc
2c0025eb1a3d421c0355a21db9d8ea2bd81278460David Li#include "prog_parameter.h"
3c0025eb1a3d421c0355a21db9d8ea2bd81278460David Li
4c0025eb1a3d421c0355a21db9d8ea2bd81278460David Li#include "src/glsl/ir.h"
5c0025eb1a3d421c0355a21db9d8ea2bd81278460David Li
6c0025eb1a3d421c0355a21db9d8ea2bd81278460David Liextern GLint _mesa_add_parameter(struct gl_program_parameter_list * paramList,
7c0025eb1a3d421c0355a21db9d8ea2bd81278460David Li                                    const char * name)
8c0025eb1a3d421c0355a21db9d8ea2bd81278460David Li{
9d274f94df69a016386195efcf0640802c7d7d2dcDavid Li   int index = _mesa_get_parameter(paramList, name);
10d274f94df69a016386195efcf0640802c7d7d2dcDavid Li   if (index >= 0)
11d274f94df69a016386195efcf0640802c7d7d2dcDavid Li      return index;
12d274f94df69a016386195efcf0640802c7d7d2dcDavid Li
13c0025eb1a3d421c0355a21db9d8ea2bd81278460David Li   paramList->NumParameters++;
14c0025eb1a3d421c0355a21db9d8ea2bd81278460David Li   if (paramList->NumParameters > paramList->Size) {
15c0025eb1a3d421c0355a21db9d8ea2bd81278460David Li      paramList->Size = paramList->NumParameters + 4;
16c0025eb1a3d421c0355a21db9d8ea2bd81278460David Li      paramList->Parameters = hieralloc_realloc(paramList, paramList->Parameters,
17c0025eb1a3d421c0355a21db9d8ea2bd81278460David Li                              gl_program_parameter, paramList->Size);
18c0025eb1a3d421c0355a21db9d8ea2bd81278460David Li   }
19c0025eb1a3d421c0355a21db9d8ea2bd81278460David Li
20c0025eb1a3d421c0355a21db9d8ea2bd81278460David Li   gl_program_parameter * param = paramList->Parameters + paramList->NumParameters - 1;
21c0025eb1a3d421c0355a21db9d8ea2bd81278460David Li   memset(param, 0, sizeof(*param));
22c0025eb1a3d421c0355a21db9d8ea2bd81278460David Li   param->Name = hieralloc_strdup(paramList, name);
23c0025eb1a3d421c0355a21db9d8ea2bd81278460David Li   param->BindLocation = -1;
24c0025eb1a3d421c0355a21db9d8ea2bd81278460David Li   param->Location = -1;
25c0025eb1a3d421c0355a21db9d8ea2bd81278460David Li
26c0025eb1a3d421c0355a21db9d8ea2bd81278460David Li   return paramList->NumParameters - 1;
27c0025eb1a3d421c0355a21db9d8ea2bd81278460David Li}
28c0025eb1a3d421c0355a21db9d8ea2bd81278460David Li
29c0025eb1a3d421c0355a21db9d8ea2bd81278460David Liextern GLint _mesa_get_parameter(const struct gl_program_parameter_list * paramList,
30c0025eb1a3d421c0355a21db9d8ea2bd81278460David Li                                    const char * name)
31c0025eb1a3d421c0355a21db9d8ea2bd81278460David Li{
32c0025eb1a3d421c0355a21db9d8ea2bd81278460David Li   for (unsigned i = 0; i < paramList->NumParameters; i++)
33c0025eb1a3d421c0355a21db9d8ea2bd81278460David Li      if (!strcmp(name, paramList->Parameters[i].Name))
34c0025eb1a3d421c0355a21db9d8ea2bd81278460David Li         return i;
35c0025eb1a3d421c0355a21db9d8ea2bd81278460David Li   return -1;
36c0025eb1a3d421c0355a21db9d8ea2bd81278460David Li}
37