blob: fee259a9f38582ae0a9ea67ee5efe6511c40fe5a [file] [log] [blame]
Michal Krol1d7f7192005-03-25 12:12:50 +00001/*
2 * Mesa 3-D graphics library
Michal Krol07135702006-03-21 10:37:40 +00003 * Version: 6.5
Michal Krol1d7f7192005-03-25 12:12:50 +00004 *
Michal Krol07135702006-03-21 10:37:40 +00005 * Copyright (C) 2004-2006 Brian Paul All Rights Reserved.
Michal Krol1d7f7192005-03-25 12:12:50 +00006 *
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 shaderobjects.c
27 * ARB_shader_objects state management functions
28 * \author Michal Krol
29 */
30
Michal Krolc1fe4692004-10-27 17:09:10 +000031
32#include "glheader.h"
Michal Krol9ac96052006-02-27 14:41:41 +000033#include "context.h"
34#include "hash.h"
Michal Krol1d7f7192005-03-25 12:12:50 +000035#include "shaderobjects.h"
Michal Krol6324f732005-01-13 14:12:50 +000036#include "shaderobjects_3dlabs.h"
Michal Krol1d7f7192005-03-25 12:12:50 +000037
38
Michal Krol9ac96052006-02-27 14:41:41 +000039#define I_UNKNOWN struct gl2_unknown_intf **
40#define I_GENERIC struct gl2_generic_intf **
41#define I_CONTAINER struct gl2_container_intf **
42#define I_PROGRAM struct gl2_program_intf **
43#define I_SHADER struct gl2_shader_intf **
44
45#define RELEASE_GENERIC(x)\
46 (**x)._unknown.Release ((I_UNKNOWN) x)
47
48#define RELEASE_CONTAINER(x)\
49 (**x)._generic._unknown.Release ((I_UNKNOWN) x)
50
51#define RELEASE_PROGRAM(x)\
52 (**x)._container._generic._unknown.Release ((I_UNKNOWN) x)
53
54#define RELEASE_SHADER(x)\
55 (**x)._generic._unknown.Release ((I_UNKNOWN) x);
56
57#define _LOOKUP_HANDLE(handle, function)\
58 I_UNKNOWN unk;\
59 _glthread_LOCK_MUTEX (ctx->Shared->Mutex);\
60 unk = (I_UNKNOWN) _mesa_HashLookup (ctx->Shared->GL2Objects, handle);\
61 _glthread_UNLOCK_MUTEX (ctx->Shared->Mutex);\
62 if (unk == NULL) {\
63 _mesa_error (ctx, GL_INVALID_VALUE, function);\
64 break;\
65 }
66
67#define _QUERY_INTERFACE(x, type, uuid, function)\
68 x = (type) (**unk).QueryInterface (unk, uuid);\
69 if (x == NULL) {\
70 _mesa_error (ctx, GL_INVALID_OPERATION, function);\
71 break;\
72 }
73
74#define GET_GENERIC(x, handle, function)\
75 I_GENERIC x = NULL;\
76 do {\
77 _LOOKUP_HANDLE(handle, function);\
78 _QUERY_INTERFACE(x, I_GENERIC, UIID_GENERIC, function);\
79 } while (0)
80
81#define GET_CONTAINER(x, handle, function)\
82 I_CONTAINER x = NULL;\
83 do {\
84 _LOOKUP_HANDLE(handle, function);\
85 _QUERY_INTERFACE(x, I_CONTAINER, UIID_CONTAINER, function);\
86 } while (0)
87
88#define GET_PROGRAM(x, handle, function)\
89 I_PROGRAM x = NULL;\
90 do {\
91 _LOOKUP_HANDLE(handle, function);\
92 _QUERY_INTERFACE(x, I_PROGRAM, UIID_PROGRAM, function);\
93 } while (0)
94
95#define GET_SHADER(x, handle, function)\
96 I_SHADER x = NULL;\
97 do {\
98 _LOOKUP_HANDLE(handle, function);\
99 _QUERY_INTERFACE(x, I_SHADER, UIID_SHADER, function);\
100 } while (0)
101
Michal Krold55de652006-04-18 10:30:29 +0000102#define _LINKED_PROGRAM(x, function, release)\
Michal Krol9ac96052006-02-27 14:41:41 +0000103 if ((**x).GetLinkStatus (x) == GL_FALSE) {\
Michal Krold55de652006-04-18 10:30:29 +0000104 if (release) RELEASE_PROGRAM(x);\
Michal Krol9ac96052006-02-27 14:41:41 +0000105 _mesa_error (ctx, GL_INVALID_OPERATION, function);\
106 break;\
107 }
108
109#define GET_LINKED_PROGRAM(x, handle, function)\
110 I_PROGRAM x = NULL;\
111 do {\
112 _LOOKUP_HANDLE(handle, function);\
113 _QUERY_INTERFACE(x, I_PROGRAM, UIID_PROGRAM, function);\
Michal Krold55de652006-04-18 10:30:29 +0000114 _LINKED_PROGRAM(x, function, GL_TRUE);\
Michal Krol9ac96052006-02-27 14:41:41 +0000115 } while (0)
116
117#define _CURRENT_PROGRAM(x, function)\
118 if (ctx->ShaderObjects.CurrentProgram == NULL) {\
119 _mesa_error (ctx, GL_INVALID_OPERATION, function);\
120 break;\
121 }\
122 x = ctx->ShaderObjects.CurrentProgram;
123
124#define GET_CURRENT_LINKED_PROGRAM(x, function)\
125 I_PROGRAM x = NULL;\
126 do {\
127 _CURRENT_PROGRAM(x, function);\
Michal Krold55de652006-04-18 10:30:29 +0000128 _LINKED_PROGRAM(x, function, GL_FALSE);\
Michal Krol9ac96052006-02-27 14:41:41 +0000129 } while (0)
130
Michal Krold55de652006-04-18 10:30:29 +0000131#define IS_NAME_WITH_GL_PREFIX(x) ((x)[0] == 'g' && (x)[1] == 'l' && (x)[2] == '_')
132
Michal Krol9ac96052006-02-27 14:41:41 +0000133
134GLvoid GLAPIENTRY
Michal Krol6324f732005-01-13 14:12:50 +0000135_mesa_DeleteObjectARB (GLhandleARB obj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000136{
137 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000138 GET_GENERIC(gen, obj, "glDeleteObjectARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000139
Michal Krol9ac96052006-02-27 14:41:41 +0000140 if (gen != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000141 {
Michal Krol9ac96052006-02-27 14:41:41 +0000142 (**gen).Delete (gen);
143 RELEASE_GENERIC(gen);
Michal Krol1d7f7192005-03-25 12:12:50 +0000144 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000145}
146
147GLhandleARB GLAPIENTRY
Michal Krol6324f732005-01-13 14:12:50 +0000148_mesa_GetHandleARB (GLenum pname)
Michal Krol1d7f7192005-03-25 12:12:50 +0000149{
150 GET_CURRENT_CONTEXT(ctx);
151
152 switch (pname)
153 {
154 case GL_PROGRAM_OBJECT_ARB:
Michal Krol9ac96052006-02-27 14:41:41 +0000155 {
156 I_PROGRAM pro = ctx->ShaderObjects.CurrentProgram;
157
158 if (pro != NULL)
159 return (**pro)._container._generic.GetName ((I_GENERIC) pro);
160 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000161 break;
Michal Krol9ac96052006-02-27 14:41:41 +0000162 default:
163 _mesa_error (ctx, GL_INVALID_ENUM, "glGetHandleARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000164 }
Michal Krol6324f732005-01-13 14:12:50 +0000165
166 return 0;
Michal Krolc1fe4692004-10-27 17:09:10 +0000167}
168
Michal Krol9ac96052006-02-27 14:41:41 +0000169GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000170_mesa_DetachObjectARB (GLhandleARB containerObj, GLhandleARB attachedObj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000171{
172 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000173 GET_CONTAINER(con, containerObj, "glDetachObjectARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000174
Michal Krol9ac96052006-02-27 14:41:41 +0000175 if (con != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000176 {
Michal Krol9ac96052006-02-27 14:41:41 +0000177 GET_GENERIC(att, attachedObj, "glDetachObjectARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000178
Michal Krol9ac96052006-02-27 14:41:41 +0000179 if (att != NULL)
180 {
181 (**con).Detach (con, att);
182 RELEASE_GENERIC(att);
183 }
184 RELEASE_CONTAINER(con);
Michal Krol1d7f7192005-03-25 12:12:50 +0000185 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000186}
187
188GLhandleARB GLAPIENTRY
189_mesa_CreateShaderObjectARB (GLenum shaderType)
Michal Krol1d7f7192005-03-25 12:12:50 +0000190{
Michal Krol6324f732005-01-13 14:12:50 +0000191 return _mesa_3dlabs_create_shader_object (shaderType);
Michal Krolc1fe4692004-10-27 17:09:10 +0000192}
193
Michal Krol9ac96052006-02-27 14:41:41 +0000194GLvoid GLAPIENTRY
Michal Krol1d7f7192005-03-25 12:12:50 +0000195_mesa_ShaderSourceARB (GLhandleARB shaderObj, GLsizei count, const GLcharARB **string,
Michal Krol6324f732005-01-13 14:12:50 +0000196 const GLint *length)
Michal Krol1d7f7192005-03-25 12:12:50 +0000197{
198 GET_CURRENT_CONTEXT(ctx);
Michal Krol1d7f7192005-03-25 12:12:50 +0000199 GLint *offsets;
200 GLsizei i;
201 GLcharARB *source;
Michal Krol9ac96052006-02-27 14:41:41 +0000202 GET_SHADER(sha, shaderObj, "glShaderSourceARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000203
Michal Krol1d7f7192005-03-25 12:12:50 +0000204 if (sha == NULL)
Brian Paul93269622006-04-14 03:43:39 +0000205 return;
206
207 if (string == NULL)
208 {
209 RELEASE_SHADER(sha);
210 _mesa_error (ctx, GL_INVALID_VALUE, "glShaderSourceARB");
211 return;
Michal Krol07135702006-03-21 10:37:40 +0000212 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000213
Michal Krol9ac96052006-02-27 14:41:41 +0000214 /*
215 * This array holds offsets of where the appropriate string ends, thus the last
216 * element will be set to the total length of the source code.
217 */
Michal Krol1d7f7192005-03-25 12:12:50 +0000218 offsets = (GLint *) _mesa_malloc (count * sizeof (GLint));
219 if (offsets == NULL)
220 {
Michal Krol9ac96052006-02-27 14:41:41 +0000221 RELEASE_SHADER(sha);
Michal Krol1d7f7192005-03-25 12:12:50 +0000222 _mesa_error (ctx, GL_OUT_OF_MEMORY, "glShaderSourceARB");
223 return;
224 }
225
226 for (i = 0; i < count; i++)
Brian Paul93269622006-04-14 03:43:39 +0000227 {
228 if (string[i] == NULL)
229 {
230 _mesa_free ((GLvoid *) offsets);
231 RELEASE_SHADER(sha);
232 _mesa_error (ctx, GL_INVALID_VALUE, "glShaderSourceARB");
233 return;
Michal Krol07135702006-03-21 10:37:40 +0000234 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000235 if (length == NULL || length[i] < 0)
236 offsets[i] = _mesa_strlen (string[i]);
237 else
238 offsets[i] = length[i];
239 /* accumulate string lengths */
240 if (i > 0)
241 offsets[i] += offsets[i - 1];
242 }
243
244 source = (GLcharARB *) _mesa_malloc ((offsets[count - 1] + 1) * sizeof (GLcharARB));
245 if (source == NULL)
246 {
Michal Krol9ac96052006-02-27 14:41:41 +0000247 _mesa_free ((GLvoid *) offsets);
248 RELEASE_SHADER(sha);
Michal Krol1d7f7192005-03-25 12:12:50 +0000249 _mesa_error (ctx, GL_OUT_OF_MEMORY, "glShaderSourceARB");
250 return;
251 }
252
253 for (i = 0; i < count; i++)
254 {
255 GLint start = (i > 0) ? offsets[i - 1] : 0;
256 _mesa_memcpy (source + start, string[i], (offsets[i] - start) * sizeof (GLcharARB));
257 }
258 source[offsets[count - 1]] = '\0';
259
260 (**sha).SetSource (sha, source, offsets, count);
Michal Krol9ac96052006-02-27 14:41:41 +0000261 RELEASE_SHADER(sha);
Michal Krolc1fe4692004-10-27 17:09:10 +0000262}
263
Michal Krol9ac96052006-02-27 14:41:41 +0000264GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000265_mesa_CompileShaderARB (GLhandleARB shaderObj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000266{
267 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000268 GET_SHADER(sha, shaderObj, "glCompileShaderARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000269
Michal Krol9ac96052006-02-27 14:41:41 +0000270 if (sha != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000271 {
Michal Krol9ac96052006-02-27 14:41:41 +0000272 (**sha).Compile (sha);
273 RELEASE_SHADER(sha);
Michal Krol1d7f7192005-03-25 12:12:50 +0000274 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000275}
276
277GLhandleARB GLAPIENTRY
Michal Krol9ac96052006-02-27 14:41:41 +0000278_mesa_CreateProgramObjectARB (GLvoid)
Michal Krolc1fe4692004-10-27 17:09:10 +0000279{
Michal Krol6324f732005-01-13 14:12:50 +0000280 return _mesa_3dlabs_create_program_object ();
Michal Krolc1fe4692004-10-27 17:09:10 +0000281}
282
Michal Krol9ac96052006-02-27 14:41:41 +0000283GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000284_mesa_AttachObjectARB (GLhandleARB containerObj, GLhandleARB obj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000285{
286 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000287 GET_CONTAINER(con, containerObj, "glAttachObjectARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000288
Michal Krol9ac96052006-02-27 14:41:41 +0000289 if (con != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000290 {
Michal Krol9ac96052006-02-27 14:41:41 +0000291 GET_GENERIC(att, obj, "glAttachObjectARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000292
Michal Krol9ac96052006-02-27 14:41:41 +0000293 if (att != NULL)
294 {
295 (**con).Attach (con, att);
296 RELEASE_GENERIC(att);
297 }
298 RELEASE_CONTAINER(con);
Michal Krol1d7f7192005-03-25 12:12:50 +0000299 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000300}
301
Michal Krol9ac96052006-02-27 14:41:41 +0000302GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000303_mesa_LinkProgramARB (GLhandleARB programObj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000304{
305 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000306 GET_PROGRAM(pro, programObj, "glLinkProgramARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000307
Michal Krol9ac96052006-02-27 14:41:41 +0000308 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000309 {
Brian Paul93269622006-04-14 03:43:39 +0000310 (**pro).Link (pro);
311 if (pro == ctx->ShaderObjects.CurrentProgram)
312 {
313 if ((**pro).GetLinkStatus (pro))
314 _mesa_UseProgramObjectARB (programObj);
315 else
316 _mesa_UseProgramObjectARB (0);
Michal Krol9ac96052006-02-27 14:41:41 +0000317 }
Michal Krol9ac96052006-02-27 14:41:41 +0000318 RELEASE_PROGRAM(pro);
Michal Krol1d7f7192005-03-25 12:12:50 +0000319 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000320}
321
Michal Krol9ac96052006-02-27 14:41:41 +0000322GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000323_mesa_UseProgramObjectARB (GLhandleARB programObj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000324{
325 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000326 I_PROGRAM program = NULL;
327
Michal Krolcc159162006-02-21 12:35:06 +0000328 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000329
Michal Krol9ac96052006-02-27 14:41:41 +0000330 if (programObj != 0)
Brian Paul93269622006-04-14 03:43:39 +0000331 {
Michal Krol9ac96052006-02-27 14:41:41 +0000332 GET_PROGRAM(pro, programObj, "glUseProgramObjectARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000333
Michal Krol1d7f7192005-03-25 12:12:50 +0000334 if (pro == NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000335 return;
Michal Krol1d7f7192005-03-25 12:12:50 +0000336
337 if ((**pro).GetLinkStatus (pro) == GL_FALSE)
338 {
Michal Krol9ac96052006-02-27 14:41:41 +0000339 RELEASE_PROGRAM(pro);
Michal Krol1d7f7192005-03-25 12:12:50 +0000340 _mesa_error (ctx, GL_INVALID_OPERATION, "glUseProgramObjectARB");
341 return;
342 }
Michal Krol9ac96052006-02-27 14:41:41 +0000343
Brian Paul93269622006-04-14 03:43:39 +0000344 program = pro;
345
346 ctx->ShaderObjects._VertexShaderPresent = (**pro).IsShaderPresent (pro, GL_VERTEX_SHADER_ARB);
347 ctx->ShaderObjects._FragmentShaderPresent = (**pro).IsShaderPresent (pro,
Michal Krol07135702006-03-21 10:37:40 +0000348 GL_FRAGMENT_SHADER_ARB);
Brian Paul93269622006-04-14 03:43:39 +0000349 }
350 else
351 {
352 ctx->ShaderObjects._VertexShaderPresent = GL_FALSE;
353 ctx->ShaderObjects._FragmentShaderPresent = GL_FALSE;
Michal Krol1d7f7192005-03-25 12:12:50 +0000354 }
355
Michal Krol44e9ccc2006-02-13 11:31:16 +0000356 if (ctx->ShaderObjects.CurrentProgram != NULL)
Michal Krol9ac96052006-02-27 14:41:41 +0000357 RELEASE_PROGRAM(ctx->ShaderObjects.CurrentProgram);
358 ctx->ShaderObjects.CurrentProgram = program;
Michal Krolc1fe4692004-10-27 17:09:10 +0000359}
360
Michal Krol9ac96052006-02-27 14:41:41 +0000361GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000362_mesa_ValidateProgramARB (GLhandleARB programObj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000363{
364 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000365 GET_PROGRAM(pro, programObj, "glValidateProgramARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000366
Michal Krol9ac96052006-02-27 14:41:41 +0000367 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000368 {
Michal Krol9ac96052006-02-27 14:41:41 +0000369 (**pro).Validate (pro);
370 RELEASE_PROGRAM(pro);
Michal Krol1d7f7192005-03-25 12:12:50 +0000371 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000372}
373
Michal Krol9ac96052006-02-27 14:41:41 +0000374GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000375_mesa_Uniform1fARB (GLint location, GLfloat v0)
Michal Krol9ac96052006-02-27 14:41:41 +0000376{
377 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000378 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform1fARB");
379
Michal Krol8af48fc2006-03-14 11:23:16 +0000380 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol9ac96052006-02-27 14:41:41 +0000381
382 if (pro != NULL)
383 {
Michal Krold55de652006-04-18 10:30:29 +0000384 if (!(**pro).WriteUniform (pro, location, 1, &v0, GL_FLOAT))
Michal Krol9ac96052006-02-27 14:41:41 +0000385 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform1fARB");
386 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000387}
388
Michal Krol9ac96052006-02-27 14:41:41 +0000389GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000390_mesa_Uniform2fARB (GLint location, GLfloat v0, GLfloat v1)
Michal Krol1d7f7192005-03-25 12:12:50 +0000391{
392 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000393 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform2fARB");
394
Michal Krol8af48fc2006-03-14 11:23:16 +0000395 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000396
Michal Krol9ac96052006-02-27 14:41:41 +0000397 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000398 {
Brian Paul93269622006-04-14 03:43:39 +0000399 GLfloat v[2];
400 v[0] = v0;
401 v[1] = v1;
Michal Krol9ac96052006-02-27 14:41:41 +0000402
Michal Krold55de652006-04-18 10:30:29 +0000403 if (!(**pro).WriteUniform (pro, location, 1, v, GL_FLOAT_VEC2))
Michal Krol9ac96052006-02-27 14:41:41 +0000404 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform2fARB");
Michal Krol6324f732005-01-13 14:12:50 +0000405 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000406}
407
Michal Krol9ac96052006-02-27 14:41:41 +0000408GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000409_mesa_Uniform3fARB (GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
Michal Krol1d7f7192005-03-25 12:12:50 +0000410{
411 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000412 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform3fARB");
413
Michal Krol8af48fc2006-03-14 11:23:16 +0000414 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000415
Michal Krol9ac96052006-02-27 14:41:41 +0000416 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000417 {
Brian Paul93269622006-04-14 03:43:39 +0000418 GLfloat v[3];
419 v[0] = v0;
420 v[1] = v1;
421 v[2] = v2;
Michal Krol9ac96052006-02-27 14:41:41 +0000422
Michal Krold55de652006-04-18 10:30:29 +0000423 if (!(**pro).WriteUniform (pro, location, 1, v, GL_FLOAT_VEC3))
Michal Krol9ac96052006-02-27 14:41:41 +0000424 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform3fARB");
Michal Krol6324f732005-01-13 14:12:50 +0000425 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000426}
427
Michal Krol9ac96052006-02-27 14:41:41 +0000428GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000429_mesa_Uniform4fARB (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
Michal Krol1d7f7192005-03-25 12:12:50 +0000430{
431 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000432 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform4fARB");
433
Michal Krol8af48fc2006-03-14 11:23:16 +0000434 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000435
Michal Krol9ac96052006-02-27 14:41:41 +0000436 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000437 {
Brian Paul93269622006-04-14 03:43:39 +0000438 GLfloat v[4];
439 v[0] = v0;
440 v[1] = v1;
441 v[2] = v2;
442 v[3] = v3;
Michal Krol9ac96052006-02-27 14:41:41 +0000443
Michal Krold55de652006-04-18 10:30:29 +0000444 if (!(**pro).WriteUniform (pro, location, 1, v, GL_FLOAT_VEC4))
Michal Krol9ac96052006-02-27 14:41:41 +0000445 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform4fARB");
Michal Krol6324f732005-01-13 14:12:50 +0000446 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000447}
448
Michal Krol9ac96052006-02-27 14:41:41 +0000449GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000450_mesa_Uniform1iARB (GLint location, GLint v0)
Michal Krol1d7f7192005-03-25 12:12:50 +0000451{
452 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000453 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform1iARB");
454
Michal Krol8af48fc2006-03-14 11:23:16 +0000455 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000456
Michal Krol9ac96052006-02-27 14:41:41 +0000457 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000458 {
Michal Krold55de652006-04-18 10:30:29 +0000459 if (!(**pro).WriteUniform (pro, location, 1, &v0, GL_INT))
Michal Krol9ac96052006-02-27 14:41:41 +0000460 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform1iARB");
Michal Krol6324f732005-01-13 14:12:50 +0000461 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000462}
463
Michal Krol9ac96052006-02-27 14:41:41 +0000464GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000465_mesa_Uniform2iARB (GLint location, GLint v0, GLint v1)
Michal Krol1d7f7192005-03-25 12:12:50 +0000466{
467 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000468 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform2iARB");
469
Michal Krol8af48fc2006-03-14 11:23:16 +0000470 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000471
Michal Krol9ac96052006-02-27 14:41:41 +0000472 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000473 {
Brian Paul93269622006-04-14 03:43:39 +0000474 GLint v[2];
475 v[0] = v0;
476 v[1] = v1;
Michal Krol9ac96052006-02-27 14:41:41 +0000477
Michal Krold55de652006-04-18 10:30:29 +0000478 if (!(**pro).WriteUniform (pro, location, 1, v, GL_INT_VEC2))
Michal Krol9ac96052006-02-27 14:41:41 +0000479 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform2iARB");
Michal Krol6324f732005-01-13 14:12:50 +0000480 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000481}
482
Michal Krol9ac96052006-02-27 14:41:41 +0000483GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000484_mesa_Uniform3iARB (GLint location, GLint v0, GLint v1, GLint v2)
Michal Krol1d7f7192005-03-25 12:12:50 +0000485{
486 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000487 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform3iARB");
488
Michal Krol8af48fc2006-03-14 11:23:16 +0000489 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000490
Michal Krol9ac96052006-02-27 14:41:41 +0000491 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000492 {
Brian Paul93269622006-04-14 03:43:39 +0000493 GLint v[3];
494 v[0] = v0;
495 v[1] = v1;
496 v[2] = v2;
Michal Krol9ac96052006-02-27 14:41:41 +0000497
Michal Krold55de652006-04-18 10:30:29 +0000498 if (!(**pro).WriteUniform (pro, location, 1, v, GL_INT_VEC3))
Michal Krol9ac96052006-02-27 14:41:41 +0000499 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform3iARB");
Michal Krol6324f732005-01-13 14:12:50 +0000500 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000501}
502
Michal Krol9ac96052006-02-27 14:41:41 +0000503GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000504_mesa_Uniform4iARB (GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
Michal Krol1d7f7192005-03-25 12:12:50 +0000505{
506 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000507 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform4iARB");
508
Michal Krol8af48fc2006-03-14 11:23:16 +0000509 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000510
Michal Krol9ac96052006-02-27 14:41:41 +0000511 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000512 {
Brian Paul93269622006-04-14 03:43:39 +0000513 GLint v[4];
514 v[0] = v0;
515 v[1] = v1;
516 v[2] = v2;
517 v[3] = v3;
Michal Krol9ac96052006-02-27 14:41:41 +0000518
Michal Krold55de652006-04-18 10:30:29 +0000519 if (!(**pro).WriteUniform (pro, location, 1, v, GL_INT_VEC4))
Michal Krol9ac96052006-02-27 14:41:41 +0000520 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform4iARB");
Michal Krol6324f732005-01-13 14:12:50 +0000521 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000522}
523
Michal Krol9ac96052006-02-27 14:41:41 +0000524GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000525_mesa_Uniform1fvARB (GLint location, GLsizei count, const GLfloat *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000526{
527 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000528 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform1fvARB");
529
Michal Krold55de652006-04-18 10:30:29 +0000530 if (value == NULL)
531 {
532 _mesa_error (ctx, GL_INVALID_VALUE, "glUniform1fvARB");
533 return;
534 }
535
Michal Krol8af48fc2006-03-14 11:23:16 +0000536 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000537
Michal Krol9ac96052006-02-27 14:41:41 +0000538 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000539 {
Michal Krold55de652006-04-18 10:30:29 +0000540 if (!(**pro).WriteUniform (pro, location, count, value, GL_FLOAT))
Michal Krol9ac96052006-02-27 14:41:41 +0000541 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform1fvARB");
Michal Krol6324f732005-01-13 14:12:50 +0000542 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000543}
544
Michal Krol9ac96052006-02-27 14:41:41 +0000545GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000546_mesa_Uniform2fvARB (GLint location, GLsizei count, const GLfloat *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000547{
548 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000549 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform2fvARB");
550
Michal Krold55de652006-04-18 10:30:29 +0000551 if (value == NULL)
552 {
553 _mesa_error (ctx, GL_INVALID_VALUE, "glUniform2fvARB");
554 return;
555 }
556
Michal Krol8af48fc2006-03-14 11:23:16 +0000557 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000558
Michal Krol9ac96052006-02-27 14:41:41 +0000559 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000560 {
Michal Krold55de652006-04-18 10:30:29 +0000561 if (!(**pro).WriteUniform (pro, location, count, value, GL_FLOAT_VEC2))
Michal Krol9ac96052006-02-27 14:41:41 +0000562 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform2fvARB");
Michal Krol6324f732005-01-13 14:12:50 +0000563 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000564}
565
Michal Krol9ac96052006-02-27 14:41:41 +0000566GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000567_mesa_Uniform3fvARB (GLint location, GLsizei count, const GLfloat *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000568{
569 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000570 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform3fvARB");
571
Michal Krold55de652006-04-18 10:30:29 +0000572 if (value == NULL)
573 {
574 _mesa_error (ctx, GL_INVALID_VALUE, "glUniform3fvARB");
575 return;
576 }
577
Michal Krol8af48fc2006-03-14 11:23:16 +0000578 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000579
Michal Krol9ac96052006-02-27 14:41:41 +0000580 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000581 {
Michal Krold55de652006-04-18 10:30:29 +0000582 if (!(**pro).WriteUniform (pro, location, count, value, GL_FLOAT_VEC3))
Michal Krol9ac96052006-02-27 14:41:41 +0000583 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform3fvARB");
Michal Krol6324f732005-01-13 14:12:50 +0000584 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000585}
586
Michal Krol9ac96052006-02-27 14:41:41 +0000587GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000588_mesa_Uniform4fvARB (GLint location, GLsizei count, const GLfloat *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000589{
Michal Krol9ac96052006-02-27 14:41:41 +0000590 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000591 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform4fvARB");
592
Michal Krold55de652006-04-18 10:30:29 +0000593 if (value == NULL)
594 {
595 _mesa_error (ctx, GL_INVALID_VALUE, "glUniform4fvARB");
596 return;
597 }
598
Michal Krol8af48fc2006-03-14 11:23:16 +0000599 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000600
Michal Krol9ac96052006-02-27 14:41:41 +0000601 if (pro != NULL)
602 {
Michal Krold55de652006-04-18 10:30:29 +0000603 if (!(**pro).WriteUniform (pro, location, count, value, GL_FLOAT_VEC4))
Michal Krol9ac96052006-02-27 14:41:41 +0000604 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform4fvARB");
605 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000606}
607
Michal Krol9ac96052006-02-27 14:41:41 +0000608GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000609_mesa_Uniform1ivARB (GLint location, GLsizei count, const GLint *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000610{
611 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000612 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform1ivARB");
613
Michal Krold55de652006-04-18 10:30:29 +0000614 if (value == NULL)
615 {
616 _mesa_error (ctx, GL_INVALID_VALUE, "glUniform1ivARB");
617 return;
618 }
619
Michal Krol8af48fc2006-03-14 11:23:16 +0000620 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000621
Michal Krol9ac96052006-02-27 14:41:41 +0000622 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000623 {
Michal Krold55de652006-04-18 10:30:29 +0000624 if (!(**pro).WriteUniform (pro, location, count, value, GL_INT))
Michal Krol9ac96052006-02-27 14:41:41 +0000625 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform1ivARB");
Michal Krol6324f732005-01-13 14:12:50 +0000626 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000627}
628
Michal Krol9ac96052006-02-27 14:41:41 +0000629GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000630_mesa_Uniform2ivARB (GLint location, GLsizei count, const GLint *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000631{
632 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000633 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform2ivARB");
634
Michal Krold55de652006-04-18 10:30:29 +0000635 if (value == NULL)
636 {
637 _mesa_error (ctx, GL_INVALID_VALUE, "glUniform2ivARB");
638 return;
639 }
640
Michal Krol8af48fc2006-03-14 11:23:16 +0000641 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000642
Michal Krol9ac96052006-02-27 14:41:41 +0000643 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000644 {
Michal Krold55de652006-04-18 10:30:29 +0000645 if (!(**pro).WriteUniform (pro, location, count, value, GL_INT_VEC2))
Michal Krol9ac96052006-02-27 14:41:41 +0000646 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform2ivARB");
Michal Krol6324f732005-01-13 14:12:50 +0000647 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000648}
649
Michal Krol9ac96052006-02-27 14:41:41 +0000650GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000651_mesa_Uniform3ivARB (GLint location, GLsizei count, const GLint *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000652{
653 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000654 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform3ivARB");
655
Michal Krold55de652006-04-18 10:30:29 +0000656 if (value == NULL)
657 {
658 _mesa_error (ctx, GL_INVALID_VALUE, "glUniform3ivARB");
659 return;
660 }
661
Michal Krol8af48fc2006-03-14 11:23:16 +0000662 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000663
Michal Krol9ac96052006-02-27 14:41:41 +0000664 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000665 {
Michal Krold55de652006-04-18 10:30:29 +0000666 if (!(**pro).WriteUniform (pro, location, count, value, GL_INT_VEC3))
Michal Krol9ac96052006-02-27 14:41:41 +0000667 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform3ivARB");
Michal Krol6324f732005-01-13 14:12:50 +0000668 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000669}
670
Michal Krol9ac96052006-02-27 14:41:41 +0000671GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000672_mesa_Uniform4ivARB (GLint location, GLsizei count, const GLint *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000673{
674 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000675 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform4ivARB");
676
Michal Krold55de652006-04-18 10:30:29 +0000677 if (value == NULL)
678 {
679 _mesa_error (ctx, GL_INVALID_VALUE, "glUniform4ivARB");
680 return;
681 }
682
Michal Krol8af48fc2006-03-14 11:23:16 +0000683 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000684
Michal Krol9ac96052006-02-27 14:41:41 +0000685 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000686 {
Michal Krold55de652006-04-18 10:30:29 +0000687 if (!(**pro).WriteUniform (pro, location, count, value, GL_INT_VEC4))
Michal Krol9ac96052006-02-27 14:41:41 +0000688 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform4ivARB");
Michal Krol6324f732005-01-13 14:12:50 +0000689 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000690}
691
Michal Krol9ac96052006-02-27 14:41:41 +0000692GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000693_mesa_UniformMatrix2fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000694{
695 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000696 GET_CURRENT_LINKED_PROGRAM(pro, "glUniformMatrix2fvARB");
697
Michal Krold55de652006-04-18 10:30:29 +0000698 if (value == NULL)
699 {
700 _mesa_error (ctx, GL_INVALID_VALUE, "glUniformMatrix2fvARB");
701 return;
702 }
703
Michal Krol8af48fc2006-03-14 11:23:16 +0000704 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000705
Michal Krol9ac96052006-02-27 14:41:41 +0000706 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000707 {
Michal Krol9ac96052006-02-27 14:41:41 +0000708 if (transpose)
709 {
710 GLfloat *trans, *pt;
711 const GLfloat *pv;
712
713 trans = (GLfloat *) _mesa_malloc (count * 4 * sizeof (GLfloat));
714 if (trans == NULL)
715 {
716 _mesa_error (ctx, GL_OUT_OF_MEMORY, "glUniformMatrix2fvARB");
717 return;
718 }
719 for (pt = trans, pv = value; pt != trans + count * 4; pt += 4, pv += 4)
720 {
721 pt[0] = pv[0];
722 pt[1] = pv[2];
723 pt[2] = pv[1];
724 pt[3] = pv[3];
725 }
Michal Krold55de652006-04-18 10:30:29 +0000726 if (!(**pro).WriteUniform (pro, location, count, trans, GL_FLOAT_MAT2))
Michal Krol9ac96052006-02-27 14:41:41 +0000727 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniformMatrix2fvARB");
728 _mesa_free (trans);
729 }
730 else
731 {
Michal Krold55de652006-04-18 10:30:29 +0000732 if (!(**pro).WriteUniform (pro, location, count, value, GL_FLOAT_MAT2))
Michal Krol9ac96052006-02-27 14:41:41 +0000733 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniformMatrix2fvARB");
734 }
Michal Krol6324f732005-01-13 14:12:50 +0000735 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000736}
737
Michal Krol9ac96052006-02-27 14:41:41 +0000738GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000739_mesa_UniformMatrix3fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000740{
741 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000742 GET_CURRENT_LINKED_PROGRAM(pro, "glUniformMatrix3fvARB");
743
Michal Krold55de652006-04-18 10:30:29 +0000744 if (value == NULL)
745 {
746 _mesa_error (ctx, GL_INVALID_VALUE, "glUniformMatrix3fvARB");
747 return;
748 }
749
Michal Krol8af48fc2006-03-14 11:23:16 +0000750 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000751
Michal Krol9ac96052006-02-27 14:41:41 +0000752 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000753 {
Michal Krol9ac96052006-02-27 14:41:41 +0000754 if (transpose)
755 {
756 GLfloat *trans, *pt;
757 const GLfloat *pv;
758
759 trans = (GLfloat *) _mesa_malloc (count * 9 * sizeof (GLfloat));
760 if (trans == NULL)
761 {
762 _mesa_error (ctx, GL_OUT_OF_MEMORY, "glUniformMatrix3fvARB");
763 return;
764 }
765 for (pt = trans, pv = value; pt != trans + count * 9; pt += 9, pv += 9)
766 {
767 pt[0] = pv[0];
768 pt[1] = pv[3];
769 pt[2] = pv[6];
770 pt[3] = pv[1];
771 pt[4] = pv[4];
772 pt[5] = pv[7];
773 pt[6] = pv[2];
774 pt[7] = pv[5];
775 pt[8] = pv[8];
776 }
Michal Krold55de652006-04-18 10:30:29 +0000777 if (!(**pro).WriteUniform (pro, location, count, trans, GL_FLOAT_MAT3))
Michal Krol9ac96052006-02-27 14:41:41 +0000778 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniformMatrix3fvARB");
779 _mesa_free (trans);
780 }
781 else
782 {
Michal Krold55de652006-04-18 10:30:29 +0000783 if (!(**pro).WriteUniform (pro, location, count, value, GL_FLOAT_MAT3))
Michal Krol9ac96052006-02-27 14:41:41 +0000784 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniformMatrix3fvARB");
785 }
Michal Krol6324f732005-01-13 14:12:50 +0000786 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000787}
788
Michal Krol9ac96052006-02-27 14:41:41 +0000789GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000790_mesa_UniformMatrix4fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000791{
792 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000793 GET_CURRENT_LINKED_PROGRAM(pro, "glUniformMatrix4fvARB");
794
Michal Krold55de652006-04-18 10:30:29 +0000795 if (value == NULL)
796 {
797 _mesa_error (ctx, GL_INVALID_VALUE, "glUniformMatrix4fvARB");
798 return;
799 }
800
Michal Krol8af48fc2006-03-14 11:23:16 +0000801 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000802
Michal Krol9ac96052006-02-27 14:41:41 +0000803 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000804 {
Michal Krol9ac96052006-02-27 14:41:41 +0000805 if (transpose)
806 {
807 GLfloat *trans, *pt;
808 const GLfloat *pv;
809
810 trans = (GLfloat *) _mesa_malloc (count * 16 * sizeof (GLfloat));
811 if (trans == NULL)
812 {
813 _mesa_error (ctx, GL_OUT_OF_MEMORY, "glUniformMatrix4fvARB");
814 return;
815 }
816 for (pt = trans, pv = value; pt != trans + count * 16; pt += 16, pv += 16)
817 {
818 _math_transposef (pt, pv);
819 }
Michal Krold55de652006-04-18 10:30:29 +0000820 if (!(**pro).WriteUniform (pro, location, count, trans, GL_FLOAT_MAT4))
Michal Krol9ac96052006-02-27 14:41:41 +0000821 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniformMatrix4fvARB");
822 _mesa_free (trans);
823 }
824 else
825 {
Michal Krold55de652006-04-18 10:30:29 +0000826 if (!(**pro).WriteUniform (pro, location, count, value, GL_FLOAT_MAT4))
Michal Krol9ac96052006-02-27 14:41:41 +0000827 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniformMatrix4fvARB");
828 }
Michal Krol6324f732005-01-13 14:12:50 +0000829 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000830}
831
832static GLboolean
833_mesa_get_object_parameter (GLhandleARB obj, GLenum pname, GLvoid *params, GLboolean *integral,
834 GLint *size)
835{
836 GET_CURRENT_CONTEXT(ctx);
Michal Krol1d7f7192005-03-25 12:12:50 +0000837 GLint *ipar = (GLint *) params;
Michal Krol1d7f7192005-03-25 12:12:50 +0000838
839 /* set default values */
840 *integral = GL_TRUE; /* indicates param type, TRUE: GLint, FALSE: GLfloat */
Michal Krol9ac96052006-02-27 14:41:41 +0000841 *size = 1; /* param array size */
Michal Krol1d7f7192005-03-25 12:12:50 +0000842
843 switch (pname)
844 {
845 case GL_OBJECT_TYPE_ARB:
Michal Krol9ac96052006-02-27 14:41:41 +0000846 case GL_OBJECT_DELETE_STATUS_ARB:
847 case GL_OBJECT_INFO_LOG_LENGTH_ARB:
848 {
849 GET_GENERIC(gen, obj, "glGetObjectParameterivARB");
850
851 if (gen == NULL)
852 return GL_FALSE;
853
854 switch (pname)
855 {
856 case GL_OBJECT_TYPE_ARB:
857 *ipar = (**gen).GetType (gen);
858 break;
859 case GL_OBJECT_DELETE_STATUS_ARB:
860 *ipar = (**gen).GetDeleteStatus (gen);
861 break;
862 case GL_OBJECT_INFO_LOG_LENGTH_ARB:
863 {
864 const GLcharARB *info = (**gen).GetInfoLog (gen);
865
866 if (info == NULL)
867 *ipar = 0;
868 else
869 *ipar = _mesa_strlen (info) + 1;
870 }
871 break;
872 }
873
874 RELEASE_GENERIC(gen);
Michal Krol1d7f7192005-03-25 12:12:50 +0000875 }
876 break;
Michal Krol9ac96052006-02-27 14:41:41 +0000877 case GL_OBJECT_SUBTYPE_ARB:
Michal Krol1d7f7192005-03-25 12:12:50 +0000878 case GL_OBJECT_COMPILE_STATUS_ARB:
Michal Krol9ac96052006-02-27 14:41:41 +0000879 case GL_OBJECT_SHADER_SOURCE_LENGTH_ARB:
880 {
881 GET_SHADER(sha, obj, "glGetObjectParameterivARB");
882
883 if (sha == NULL)
884 return GL_FALSE;
885
886 switch (pname)
887 {
888 case GL_OBJECT_SUBTYPE_ARB:
889 *ipar = (**sha).GetSubType (sha);
890 break;
891 case GL_OBJECT_COMPILE_STATUS_ARB:
892 *ipar = (**sha).GetCompileStatus (sha);
893 break;
894 case GL_OBJECT_SHADER_SOURCE_LENGTH_ARB:
895 {
896 const GLcharARB *src = (**sha).GetSource (sha);
897
898 if (src == NULL)
899 *ipar = 0;
900 else
901 *ipar = _mesa_strlen (src) + 1;
902 }
903 break;
904 }
905
906 RELEASE_SHADER(sha);
Michal Krol1d7f7192005-03-25 12:12:50 +0000907 }
908 break;
909 case GL_OBJECT_LINK_STATUS_ARB:
Michal Krol1d7f7192005-03-25 12:12:50 +0000910 case GL_OBJECT_VALIDATE_STATUS_ARB:
Michal Krol1d7f7192005-03-25 12:12:50 +0000911 case GL_OBJECT_ATTACHED_OBJECTS_ARB:
Michal Krol1d7f7192005-03-25 12:12:50 +0000912 case GL_OBJECT_ACTIVE_UNIFORMS_ARB:
Michal Krol1d7f7192005-03-25 12:12:50 +0000913 case GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB:
Michal Krol9ac96052006-02-27 14:41:41 +0000914 {
915 GET_PROGRAM(pro, obj, "glGetObjectParameterivARB");
916
917 if (pro == NULL)
918 return GL_FALSE;
919
920 switch (pname)
921 {
922 case GL_OBJECT_LINK_STATUS_ARB:
923 *ipar = (**pro).GetLinkStatus (pro);
924 break;
925 case GL_OBJECT_VALIDATE_STATUS_ARB:
926 *ipar = (**pro).GetValidateStatus (pro);
927 break;
928 case GL_OBJECT_ATTACHED_OBJECTS_ARB:
929 *ipar = (**pro)._container.GetAttachedCount ((I_CONTAINER) pro);
930 break;
931 case GL_OBJECT_ACTIVE_UNIFORMS_ARB:
Michal Krold55de652006-04-18 10:30:29 +0000932 *ipar = (**pro).GetActiveUniformCount (pro);
Michal Krol9ac96052006-02-27 14:41:41 +0000933 break;
934 case GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB:
Michal Krold55de652006-04-18 10:30:29 +0000935 *ipar = (**pro).GetActiveUniformMaxLength (pro);
936 break;
937 case GL_OBJECT_ACTIVE_ATTRIBUTES_ARB:
938 *ipar = (**pro).GetActiveAttribCount (pro);
939 break;
940 case GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB:
941 *ipar = (**pro).GetActiveAttribMaxLength (pro);
Michal Krol9ac96052006-02-27 14:41:41 +0000942 break;
943 }
944
945 RELEASE_PROGRAM(pro);
Michal Krol1d7f7192005-03-25 12:12:50 +0000946 }
947 break;
948 default:
949 _mesa_error (ctx, GL_INVALID_ENUM, "glGetObjectParameterivARB");
Michal Krol9ac96052006-02-27 14:41:41 +0000950 return GL_FALSE;
Michal Krol1d7f7192005-03-25 12:12:50 +0000951 }
952
Michal Krol9ac96052006-02-27 14:41:41 +0000953 return GL_TRUE;
Michal Krol1d7f7192005-03-25 12:12:50 +0000954}
955
Michal Krol9ac96052006-02-27 14:41:41 +0000956GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000957_mesa_GetObjectParameterfvARB (GLhandleARB obj, GLenum pname, GLfloat *params)
Michal Krol1d7f7192005-03-25 12:12:50 +0000958{
Michal Krold55de652006-04-18 10:30:29 +0000959 GET_CURRENT_CONTEXT(ctx);
Michal Krol1d7f7192005-03-25 12:12:50 +0000960 GLboolean integral;
Michal Krol9ac96052006-02-27 14:41:41 +0000961 GLint size;
Michal Krol1d7f7192005-03-25 12:12:50 +0000962
Michal Krold55de652006-04-18 10:30:29 +0000963 if (params == NULL)
964 {
965 _mesa_error (ctx, GL_INVALID_VALUE, "glGetObjectParameterfvARB");
966 return;
967 }
968
Michal Krol1d7f7192005-03-25 12:12:50 +0000969 assert (sizeof (GLfloat) == sizeof (GLint));
970
Michal Krol9ac96052006-02-27 14:41:41 +0000971 if (_mesa_get_object_parameter (obj, pname, (GLvoid *) params, &integral, &size))
972 if (integral)
973 {
974 GLint i;
975
Michal Krol1d7f7192005-03-25 12:12:50 +0000976 for (i = 0; i < size; i++)
977 params[i] = (GLfloat) ((GLint *) params)[i];
Michal Krol9ac96052006-02-27 14:41:41 +0000978 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000979}
980
Michal Krol9ac96052006-02-27 14:41:41 +0000981GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000982_mesa_GetObjectParameterivARB (GLhandleARB obj, GLenum pname, GLint *params)
Michal Krol1d7f7192005-03-25 12:12:50 +0000983{
Michal Krold55de652006-04-18 10:30:29 +0000984 GET_CURRENT_CONTEXT(ctx);
Michal Krol1d7f7192005-03-25 12:12:50 +0000985 GLboolean integral;
Michal Krol9ac96052006-02-27 14:41:41 +0000986 GLint size;
Michal Krol1d7f7192005-03-25 12:12:50 +0000987
Michal Krold55de652006-04-18 10:30:29 +0000988 if (params == NULL)
989 {
990 _mesa_error (ctx, GL_INVALID_VALUE, "glGetObjectParameterivARB");
991 return;
992 }
993
Michal Krol1d7f7192005-03-25 12:12:50 +0000994 assert (sizeof (GLfloat) == sizeof (GLint));
995
Michal Krol9ac96052006-02-27 14:41:41 +0000996 if (_mesa_get_object_parameter (obj, pname, (GLvoid *) params, &integral, &size))
997 if (!integral)
998 {
999 GLint i;
1000
Michal Krol1d7f7192005-03-25 12:12:50 +00001001 for (i = 0; i < size; i++)
1002 params[i] = (GLint) ((GLfloat *) params)[i];
Michal Krol9ac96052006-02-27 14:41:41 +00001003 }
Michal Krolc1fe4692004-10-27 17:09:10 +00001004}
1005
Brian Paul93269622006-04-14 03:43:39 +00001006
1007/**
1008 * Copy string from <src> to <dst>, up to maxLength characters, returning
1009 * length of <dst> in <length>.
1010 * \param src the strings source
1011 * \param maxLength max chars to copy
1012 * \param length returns numberof chars copied
1013 * \param dst the string destination
1014 */
Michal Krol9ac96052006-02-27 14:41:41 +00001015static GLvoid
Brian Paul93269622006-04-14 03:43:39 +00001016copy_string(const GLcharARB *src, GLsizei maxLength, GLsizei *length,
1017 GLcharARB *dst)
Michal Krol1d7f7192005-03-25 12:12:50 +00001018{
1019 GLsizei len;
Brian Paul93269622006-04-14 03:43:39 +00001020 for (len = 0; len < maxLength - 1 && src && src[len]; len++)
1021 dst[len] = src[len];
1022 if (maxLength > 0)
1023 dst[len] = 0;
1024 if (length)
Michal Krol6324f732005-01-13 14:12:50 +00001025 *length = len;
Michal Krolc1fe4692004-10-27 17:09:10 +00001026}
1027
Brian Paul93269622006-04-14 03:43:39 +00001028
Michal Krol9ac96052006-02-27 14:41:41 +00001029GLvoid GLAPIENTRY
Michal Krol1d7f7192005-03-25 12:12:50 +00001030_mesa_GetInfoLogARB (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog)
1031{
1032 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +00001033 GET_GENERIC(gen, obj, "glGetInfoLogARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001034
Michal Krold55de652006-04-18 10:30:29 +00001035 if (gen == NULL)
1036 return;
1037
1038 if (infoLog == NULL)
1039 _mesa_error (ctx, GL_INVALID_VALUE, "glGetInfoLogARB");
1040 else
1041 copy_string ((**gen).GetInfoLog (gen), maxLength, length, infoLog);
1042 RELEASE_GENERIC(gen);
Michal Krol1d7f7192005-03-25 12:12:50 +00001043}
1044
Michal Krol9ac96052006-02-27 14:41:41 +00001045GLvoid GLAPIENTRY
1046_mesa_GetAttachedObjectsARB (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count,
1047 GLhandleARB *obj)
Michal Krol1d7f7192005-03-25 12:12:50 +00001048{
1049 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +00001050 GET_CONTAINER(con, containerObj, "glGetAttachedObjectsARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001051
Michal Krold55de652006-04-18 10:30:29 +00001052 if (con == NULL)
1053 return;
1054
1055 if (obj == NULL)
1056 _mesa_error (ctx, GL_INVALID_VALUE, "glGetAttachedObjectsARB");
1057 else
Michal Krol1d7f7192005-03-25 12:12:50 +00001058 {
Michal Krold55de652006-04-18 10:30:29 +00001059 GLsizei cnt, i;
1060
Michal Krol9ac96052006-02-27 14:41:41 +00001061 cnt = (**con).GetAttachedCount (con);
1062 if (cnt > maxCount)
1063 cnt = maxCount;
1064 if (count != NULL)
1065 *count = cnt;
1066
1067 for (i = 0; i < cnt; i++)
1068 {
1069 I_GENERIC x = (**con).GetAttached (con, i);
1070 obj[i] = (**x).GetName (x);
1071 RELEASE_GENERIC(x);
1072 }
Michal Krol1d7f7192005-03-25 12:12:50 +00001073 }
Michal Krold55de652006-04-18 10:30:29 +00001074 RELEASE_CONTAINER(con);
Michal Krol9ac96052006-02-27 14:41:41 +00001075}
Michal Krolc1fe4692004-10-27 17:09:10 +00001076
1077GLint GLAPIENTRY
1078_mesa_GetUniformLocationARB (GLhandleARB programObj, const GLcharARB *name)
Michal Krol1d7f7192005-03-25 12:12:50 +00001079{
Michal Krol9ac96052006-02-27 14:41:41 +00001080 GET_CURRENT_CONTEXT(ctx);
Michal Krol1d7f7192005-03-25 12:12:50 +00001081 GLint loc = -1;
Michal Krol9ac96052006-02-27 14:41:41 +00001082 GET_LINKED_PROGRAM(pro, programObj, "glGetUniformLocationARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001083
Michal Krold55de652006-04-18 10:30:29 +00001084 if (pro == NULL)
1085 return -1;
1086
1087 if (name == NULL)
1088 _mesa_error (ctx, GL_INVALID_VALUE, "glGetUniformLocationARB");
1089 else
Michal Krol9ac96052006-02-27 14:41:41 +00001090 {
Michal Krold55de652006-04-18 10:30:29 +00001091 if (!IS_NAME_WITH_GL_PREFIX(name))
1092 loc = (**pro).GetUniformLocation (pro, name);
Michal Krol9ac96052006-02-27 14:41:41 +00001093 }
Michal Krold55de652006-04-18 10:30:29 +00001094 RELEASE_PROGRAM(pro);
Michal Krol6324f732005-01-13 14:12:50 +00001095 return loc;
Michal Krolc1fe4692004-10-27 17:09:10 +00001096}
1097
Michal Krol9ac96052006-02-27 14:41:41 +00001098GLvoid GLAPIENTRY
1099_mesa_GetActiveUniformARB (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length,
1100 GLint *size, GLenum *type, GLcharARB *name)
Michal Krol1d7f7192005-03-25 12:12:50 +00001101{
1102 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +00001103 GET_PROGRAM(pro, programObj, "glGetActiveUniformARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001104
Michal Krold55de652006-04-18 10:30:29 +00001105 if (pro == NULL)
1106 return;
1107
1108 if (size == NULL || type == NULL || name == NULL)
1109 _mesa_error (ctx, GL_INVALID_VALUE, "glGetActiveUniformARB");
1110 else
Michal Krol1d7f7192005-03-25 12:12:50 +00001111 {
Michal Krold55de652006-04-18 10:30:29 +00001112 if (index < (**pro).GetActiveUniformCount (pro))
1113 (**pro).GetActiveUniform (pro, index, maxLength, length, size, type, name);
Michal Krol9ac96052006-02-27 14:41:41 +00001114 else
1115 _mesa_error (ctx, GL_INVALID_VALUE, "glGetActiveUniformARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001116 }
Michal Krold55de652006-04-18 10:30:29 +00001117 RELEASE_PROGRAM(pro);
Michal Krolc1fe4692004-10-27 17:09:10 +00001118}
1119
Michal Krol9ac96052006-02-27 14:41:41 +00001120GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +00001121_mesa_GetUniformfvARB (GLhandleARB programObj, GLint location, GLfloat *params)
Michal Krol1d7f7192005-03-25 12:12:50 +00001122{
1123 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +00001124 GET_LINKED_PROGRAM(pro, programObj, "glGetUniformfvARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001125
Michal Krol9ac96052006-02-27 14:41:41 +00001126 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +00001127 {
Michal Krol9ac96052006-02-27 14:41:41 +00001128 /* TODO */
1129 RELEASE_PROGRAM(pro);
Michal Krol1d7f7192005-03-25 12:12:50 +00001130 }
Michal Krolc1fe4692004-10-27 17:09:10 +00001131}
1132
Michal Krol9ac96052006-02-27 14:41:41 +00001133GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +00001134_mesa_GetUniformivARB (GLhandleARB programObj, GLint location, GLint *params)
Michal Krol1d7f7192005-03-25 12:12:50 +00001135{
1136 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +00001137 GET_LINKED_PROGRAM(pro, programObj, "glGetUniformivARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001138
Michal Krol9ac96052006-02-27 14:41:41 +00001139 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +00001140 {
Michal Krol9ac96052006-02-27 14:41:41 +00001141 /* TODO */
1142 RELEASE_PROGRAM(pro);
Michal Krol1d7f7192005-03-25 12:12:50 +00001143 }
Michal Krolc1fe4692004-10-27 17:09:10 +00001144}
1145
Michal Krol9ac96052006-02-27 14:41:41 +00001146GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +00001147_mesa_GetShaderSourceARB (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source)
Michal Krol1d7f7192005-03-25 12:12:50 +00001148{
1149 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +00001150 GET_SHADER(sha, obj, "glGetShaderSourceARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001151
Michal Krold55de652006-04-18 10:30:29 +00001152 if (sha == NULL)
1153 return;
1154
1155 if (source == NULL)
1156 _mesa_error (ctx, GL_INVALID_VALUE, "glGetShaderSourceARB");
1157 else
1158 copy_string ((**sha).GetSource (sha), maxLength, length, source);
1159 RELEASE_SHADER(sha);
Michal Krolc1fe4692004-10-27 17:09:10 +00001160}
1161
1162/* GL_ARB_vertex_shader */
1163
Michal Krol9ac96052006-02-27 14:41:41 +00001164GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +00001165_mesa_BindAttribLocationARB (GLhandleARB programObj, GLuint index, const GLcharARB *name)
Michal Krol1d7f7192005-03-25 12:12:50 +00001166{
1167 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +00001168 GET_PROGRAM(pro, programObj, "glBindAttribLocationARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001169
Michal Krold55de652006-04-18 10:30:29 +00001170 if (pro == NULL)
1171 return;
1172
1173 if (name == NULL || index >= MAX_VERTEX_ATTRIBS)
1174 _mesa_error (ctx, GL_INVALID_VALUE, "glBindAttribLocationARB");
1175 else if (IS_NAME_WITH_GL_PREFIX(name))
1176 _mesa_error (ctx, GL_INVALID_OPERATION, "glBindAttribLocationARB");
1177 else
1178 (**pro).OverrideAttribBinding (pro, index, name);
1179 RELEASE_PROGRAM(pro);
Michal Krolc1fe4692004-10-27 17:09:10 +00001180}
1181
Michal Krol9ac96052006-02-27 14:41:41 +00001182GLvoid GLAPIENTRY
1183_mesa_GetActiveAttribARB (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length,
Michal Krold55de652006-04-18 10:30:29 +00001184 GLint *size, GLenum *type, GLcharARB *name)
Michal Krol1d7f7192005-03-25 12:12:50 +00001185{
1186 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +00001187 GET_PROGRAM(pro, programObj, "glGetActiveAttribARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001188
Michal Krold55de652006-04-18 10:30:29 +00001189 if (pro == NULL)
1190 return;
1191
1192 if (name == NULL || index >= (**pro).GetActiveAttribCount (pro))
1193 _mesa_error (ctx, GL_INVALID_VALUE, "glGetActiveAttribARB");
1194 else
1195 (**pro).GetActiveAttrib (pro, index, maxLength, length, size, type, name);
1196 RELEASE_PROGRAM(pro);
Michal Krolc1fe4692004-10-27 17:09:10 +00001197}
1198
1199GLint GLAPIENTRY
1200_mesa_GetAttribLocationARB (GLhandleARB programObj, const GLcharARB *name)
Michal Krol1d7f7192005-03-25 12:12:50 +00001201{
1202 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +00001203 GLint loc = -1;
Michal Krold55de652006-04-18 10:30:29 +00001204 GET_LINKED_PROGRAM(pro, programObj, "glGetAttribLocationARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001205
Michal Krold55de652006-04-18 10:30:29 +00001206 if (pro == NULL)
1207 return -1;
1208
1209 if (name == NULL)
1210 _mesa_error (ctx, GL_INVALID_VALUE, "glGetAttribLocationARB");
1211 else if (!IS_NAME_WITH_GL_PREFIX(name))
1212 loc = (**pro).GetAttribLocation (pro, name);
1213 RELEASE_PROGRAM(pro);
Michal Krol6324f732005-01-13 14:12:50 +00001214 return loc;
Michal Krolc1fe4692004-10-27 17:09:10 +00001215}
1216
Michal Krol9ac96052006-02-27 14:41:41 +00001217GLvoid
Michal Krol6324f732005-01-13 14:12:50 +00001218_mesa_init_shaderobjects (GLcontext *ctx)
Michal Krol1d7f7192005-03-25 12:12:50 +00001219{
Brian Paul93269622006-04-14 03:43:39 +00001220 ctx->ShaderObjects.CurrentProgram = NULL;
1221 ctx->ShaderObjects._FragmentShaderPresent = GL_FALSE;
Michal Krol07135702006-03-21 10:37:40 +00001222 ctx->ShaderObjects._VertexShaderPresent = GL_FALSE;
Michal Krol1d7f7192005-03-25 12:12:50 +00001223
1224 _mesa_init_shaderobjects_3dlabs (ctx);
Michal Krolc1fe4692004-10-27 17:09:10 +00001225}
Michal Krol1d7f7192005-03-25 12:12:50 +00001226