mesa: Silence gcc warning "missing initializer for member".
[mesa.git] / src / mesa / program / prog_uniform.c
1 /*
2 * Mesa 3-D graphics library
3 * Version: 7.1
4 *
5 * Copyright (C) 1999-2008 Brian Paul All Rights Reserved.
6 *
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the "Software"),
9 * to deal in the Software without restriction, including without limitation
10 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 * and/or sell copies of the Software, and to permit persons to whom the
12 * Software is furnished to do so, subject to the following conditions:
13 *
14 * The above copyright notice and this permission notice shall be included
15 * in all copies or substantial portions of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 */
24
25 /**
26 * \file prog_uniform.c
27 * Shader uniform functions.
28 * \author Brian Paul
29 */
30
31 #include "main/imports.h"
32 #include "main/mtypes.h"
33 #include "prog_uniform.h"
34
35
36 struct gl_uniform_list *
37 _mesa_new_uniform_list(void)
38 {
39 return CALLOC_STRUCT(gl_uniform_list);
40 }
41
42
43 void
44 _mesa_free_uniform_list(struct gl_uniform_list *list)
45 {
46 GLuint i;
47 for (i = 0; i < list->NumUniforms; i++) {
48 free((void *) list->Uniforms[i].Name);
49 }
50 free(list->Uniforms);
51 free(list);
52 }
53
54
55 struct gl_uniform *
56 _mesa_append_uniform(struct gl_uniform_list *list,
57 const char *name, GLenum target, GLuint progPos)
58 {
59 const GLuint oldNum = list->NumUniforms;
60 struct gl_uniform *uniform;
61 GLint index;
62
63 assert(target == GL_VERTEX_PROGRAM_ARB ||
64 target == GL_FRAGMENT_PROGRAM_ARB ||
65 target == MESA_GEOMETRY_PROGRAM);
66
67 index = _mesa_lookup_uniform(list, name);
68 if (index < 0) {
69 /* not found - append to list */
70
71 if (oldNum + 1 > list->Size) {
72 /* Need to grow the list array (alloc some extra) */
73 list->Size += 4;
74
75 /* realloc arrays */
76 list->Uniforms = (struct gl_uniform *)
77 _mesa_realloc(list->Uniforms,
78 oldNum * sizeof(struct gl_uniform),
79 list->Size * sizeof(struct gl_uniform));
80 }
81
82 if (!list->Uniforms) {
83 /* out of memory */
84 list->NumUniforms = 0;
85 list->Size = 0;
86 return GL_FALSE;
87 }
88
89 uniform = list->Uniforms + oldNum;
90
91 uniform->Name = _mesa_strdup(name);
92 uniform->VertPos = -1;
93 uniform->FragPos = -1;
94 uniform->GeomPos = -1;
95 uniform->Initialized = GL_FALSE;
96
97 list->NumUniforms++;
98 }
99 else {
100 /* found */
101 uniform = list->Uniforms + index;
102 }
103
104 /* update position for the vertex or fragment program */
105 if (target == GL_VERTEX_PROGRAM_ARB) {
106 if (uniform->VertPos != -1) {
107 /* this uniform is already in the list - that shouldn't happen */
108 return GL_FALSE;
109 }
110 uniform->VertPos = progPos;
111 } else if (target == GL_FRAGMENT_PROGRAM_ARB) {
112 if (uniform->FragPos != -1) {
113 /* this uniform is already in the list - that shouldn't happen */
114 return GL_FALSE;
115 }
116 uniform->FragPos = progPos;
117 } else {
118 if (uniform->GeomPos != -1) {
119 /* this uniform is already in the list - that shouldn't happen */
120 return GL_FALSE;
121 }
122 uniform->GeomPos = progPos;
123 }
124
125 return uniform;
126 }
127
128
129 /**
130 * Return the location/index of the named uniform in the uniform list,
131 * or -1 if not found.
132 */
133 GLint
134 _mesa_lookup_uniform(const struct gl_uniform_list *list, const char *name)
135 {
136 GLuint i;
137 for (i = 0; list && i < list->NumUniforms; i++) {
138 if (!strcmp(list->Uniforms[i].Name, name)) {
139 return i;
140 }
141 }
142 return -1;
143 }
144
145
146 GLint
147 _mesa_longest_uniform_name(const struct gl_uniform_list *list)
148 {
149 GLint max = 0;
150 GLuint i;
151 for (i = 0; list && i < list->NumUniforms; i++) {
152 GLint len = (GLint) strlen(list->Uniforms[i].Name);
153 if (len > max)
154 max = len;
155 }
156 return max;
157 }
158
159
160 void
161 _mesa_print_uniforms(const struct gl_uniform_list *list)
162 {
163 GLuint i;
164 printf("Uniform list %p:\n", (void *) list);
165 for (i = 0; i < list->NumUniforms; i++) {
166 printf("%d: %s %d %d %d\n",
167 i,
168 list->Uniforms[i].Name,
169 list->Uniforms[i].VertPos,
170 list->Uniforms[i].FragPos,
171 list->Uniforms[i].GeomPos);
172 }
173 }