2 * Mesa 3-D graphics library
5 * Copyright (C) 1999-2008 Brian Paul All Rights Reserved.
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:
14 * The above copyright notice and this permission notice shall be included
15 * in all copies or substantial portions of the Software.
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.
26 * \file prog_uniform.c
27 * Shader uniform functions.
31 #include "main/imports.h"
32 #include "main/mtypes.h"
33 #include "prog_uniform.h"
36 struct gl_uniform_list
*
37 _mesa_new_uniform_list(void)
39 return CALLOC_STRUCT(gl_uniform_list
);
44 _mesa_free_uniform_list(struct gl_uniform_list
*list
)
47 for (i
= 0; i
< list
->NumUniforms
; i
++) {
48 free((void *) list
->Uniforms
[i
].Name
);
56 _mesa_append_uniform(struct gl_uniform_list
*list
,
57 const char *name
, GLenum target
, GLuint progPos
)
59 const GLuint oldNum
= list
->NumUniforms
;
60 struct gl_uniform
*uniform
;
63 assert(target
== GL_VERTEX_PROGRAM_ARB
||
64 target
== GL_FRAGMENT_PROGRAM_ARB
||
65 target
== MESA_GEOMETRY_PROGRAM
);
67 index
= _mesa_lookup_uniform(list
, name
);
69 /* not found - append to list */
71 if (oldNum
+ 1 > list
->Size
) {
72 /* Need to grow the list array (alloc some extra) */
76 list
->Uniforms
= (struct gl_uniform
*)
77 _mesa_realloc(list
->Uniforms
,
78 oldNum
* sizeof(struct gl_uniform
),
79 list
->Size
* sizeof(struct gl_uniform
));
82 if (!list
->Uniforms
) {
84 list
->NumUniforms
= 0;
89 uniform
= list
->Uniforms
+ oldNum
;
91 uniform
->Name
= _mesa_strdup(name
);
92 uniform
->VertPos
= -1;
93 uniform
->FragPos
= -1;
94 uniform
->GeomPos
= -1;
95 uniform
->Initialized
= GL_FALSE
;
101 uniform
= list
->Uniforms
+ index
;
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 */
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 */
116 uniform
->FragPos
= progPos
;
118 if (uniform
->GeomPos
!= -1) {
119 /* this uniform is already in the list - that shouldn't happen */
122 uniform
->GeomPos
= progPos
;
130 * Return the location/index of the named uniform in the uniform list,
131 * or -1 if not found.
134 _mesa_lookup_uniform(const struct gl_uniform_list
*list
, const char *name
)
137 for (i
= 0; list
&& i
< list
->NumUniforms
; i
++) {
138 if (!strcmp(list
->Uniforms
[i
].Name
, name
)) {
147 _mesa_longest_uniform_name(const struct gl_uniform_list
*list
)
151 for (i
= 0; list
&& i
< list
->NumUniforms
; i
++) {
152 GLint len
= (GLint
) strlen(list
->Uniforms
[i
].Name
);
161 _mesa_print_uniforms(const struct gl_uniform_list
*list
)
164 printf("Uniform list %p:\n", (void *) list
);
165 for (i
= 0; i
< list
->NumUniforms
; i
++) {
166 printf("%d: %s %d %d %d\n",
168 list
->Uniforms
[i
].Name
,
169 list
->Uniforms
[i
].VertPos
,
170 list
->Uniforms
[i
].FragPos
,
171 list
->Uniforms
[i
].GeomPos
);