blob: 7b18e10d8c745d2d176bb2b7827742d6683730ba [file] [log] [blame]
Michal Krol1d7f7192005-03-25 12:12:50 +00001/*
2 * Mesa 3-D graphics library
3 * Version: 6.3
4 *
5 * Copyright (C) 2004-2005 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 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 Krol1d7f7192005-03-25 12:12:50 +000033#include "shaderobjects.h"
Michal Krol6324f732005-01-13 14:12:50 +000034#include "shaderobjects_3dlabs.h"
Michal Krolc1fe4692004-10-27 17:09:10 +000035#include "context.h"
Michal Krol1d7f7192005-03-25 12:12:50 +000036#include "macros.h"
37#include "hash.h"
38
39
Michal Krolc1fe4692004-10-27 17:09:10 +000040void GLAPIENTRY
Michal Krol6324f732005-01-13 14:12:50 +000041_mesa_DeleteObjectARB (GLhandleARB obj)
Michal Krol1d7f7192005-03-25 12:12:50 +000042{
43 GET_CURRENT_CONTEXT(ctx);
44 struct gl2_unknown_intf **unk;
45 struct gl2_generic_intf **gen;
46
47 _glthread_LOCK_MUTEX (ctx->Shared->Mutex);
48 unk = (struct gl2_unknown_intf **) _mesa_HashLookup (ctx->Shared->GL2Objects, obj);
49 _glthread_UNLOCK_MUTEX (ctx->Shared->Mutex);
50
51 if (unk == NULL)
52 {
53 _mesa_error (ctx, GL_INVALID_VALUE, "glDeleteObjectARB");
54 return;
55 }
56
57 gen = (struct gl2_generic_intf **) (**unk).QueryInterface (unk, UIID_GENERIC);
58 if (gen == NULL)
59 {
60 _mesa_error (ctx, GL_INVALID_VALUE, "glDeleteObjectARB");
61 return;
62 }
63
64 (**gen).Delete (gen);
Michal Krol6324f732005-01-13 14:12:50 +000065 (**gen)._unknown.Release ((struct gl2_unknown_intf **) gen);
Michal Krolc1fe4692004-10-27 17:09:10 +000066}
67
68GLhandleARB GLAPIENTRY
Michal Krol6324f732005-01-13 14:12:50 +000069_mesa_GetHandleARB (GLenum pname)
Michal Krol1d7f7192005-03-25 12:12:50 +000070{
71 GET_CURRENT_CONTEXT(ctx);
72
73 switch (pname)
74 {
75 case GL_PROGRAM_OBJECT_ARB:
Michal Krol44e9ccc2006-02-13 11:31:16 +000076 if (ctx->ShaderObjects.CurrentProgram != NULL)
77 return (**ctx->ShaderObjects.CurrentProgram)._container._generic.GetName (
78 (struct gl2_generic_intf **) ctx->ShaderObjects.CurrentProgram);
Michal Krol1d7f7192005-03-25 12:12:50 +000079 break;
80 }
Michal Krol6324f732005-01-13 14:12:50 +000081
82 return 0;
Michal Krolc1fe4692004-10-27 17:09:10 +000083}
84
85void GLAPIENTRY
86_mesa_DetachObjectARB (GLhandleARB containerObj, GLhandleARB attachedObj)
Michal Krol1d7f7192005-03-25 12:12:50 +000087{
88 GET_CURRENT_CONTEXT(ctx);
89 struct gl2_unknown_intf **unkc, **unka;
90 struct gl2_container_intf **con;
91 struct gl2_generic_intf **att;
92
93 _glthread_LOCK_MUTEX (ctx->Shared->Mutex);
94 unkc = (struct gl2_unknown_intf **) _mesa_HashLookup (ctx->Shared->GL2Objects, containerObj);
95 unka = (struct gl2_unknown_intf **) _mesa_HashLookup (ctx->Shared->GL2Objects, attachedObj);
96 _glthread_UNLOCK_MUTEX (ctx->Shared->Mutex);
97
98 if (unkc == NULL || unka == NULL)
99 {
100 _mesa_error (ctx, GL_INVALID_VALUE, "glDetachObjectARB");
101 return;
102 }
103
104 con = (struct gl2_container_intf **) (**unkc).QueryInterface (unkc, UIID_CONTAINER);
105 if (con == NULL)
106 {
107 _mesa_error (ctx, GL_INVALID_OPERATION, "glDetachObjectARB");
108 return;
109 }
110
111 att = (struct gl2_generic_intf **) (**unka).QueryInterface (unka, UIID_GENERIC);
112 if (att == NULL)
113 {
114 (**con)._generic._unknown.Release ((struct gl2_unknown_intf **) con);
115 _mesa_error (ctx, GL_INVALID_VALUE, "glDetachObjectARB");
116 return;
117 }
118
119 if ((**con).Detach (con, att) == GL_FALSE)
120 {
121 (**con)._generic._unknown.Release ((struct gl2_unknown_intf **) con);
122 (**att)._unknown.Release ((struct gl2_unknown_intf **) att);
123 return;
124 }
125
126 (**con)._generic._unknown.Release ((struct gl2_unknown_intf **) con);
Michal Krol6324f732005-01-13 14:12:50 +0000127 (**att)._unknown.Release ((struct gl2_unknown_intf **) att);
Michal Krolc1fe4692004-10-27 17:09:10 +0000128}
129
130GLhandleARB GLAPIENTRY
131_mesa_CreateShaderObjectARB (GLenum shaderType)
Michal Krol1d7f7192005-03-25 12:12:50 +0000132{
Michal Krol6324f732005-01-13 14:12:50 +0000133 return _mesa_3dlabs_create_shader_object (shaderType);
Michal Krolc1fe4692004-10-27 17:09:10 +0000134}
135
136void GLAPIENTRY
Michal Krol1d7f7192005-03-25 12:12:50 +0000137_mesa_ShaderSourceARB (GLhandleARB shaderObj, GLsizei count, const GLcharARB **string,
Michal Krol6324f732005-01-13 14:12:50 +0000138 const GLint *length)
Michal Krol1d7f7192005-03-25 12:12:50 +0000139{
140 GET_CURRENT_CONTEXT(ctx);
141 struct gl2_unknown_intf **unk;
142 struct gl2_shader_intf **sha;
143 GLint *offsets;
144 GLsizei i;
145 GLcharARB *source;
146
147 _glthread_LOCK_MUTEX (ctx->Shared->Mutex);
148 unk = (struct gl2_unknown_intf **) _mesa_HashLookup (ctx->Shared->GL2Objects, shaderObj);
149 _glthread_UNLOCK_MUTEX (ctx->Shared->Mutex);
150
151 if (unk == NULL)
152 {
153 _mesa_error (ctx, GL_INVALID_VALUE, "glShaderSourceARB");
154 return;
155 }
156
157 sha = (struct gl2_shader_intf **) (**unk).QueryInterface (unk, UIID_SHADER);
158 if (sha == NULL)
159 {
160 _mesa_error (ctx, GL_INVALID_OPERATION, "glShaderSourceARB");
161 return;
162 }
163
164 /* this array holds offsets of where the appropriate string ends, thus the last
165 element will be set to the total length of the source code */
166 offsets = (GLint *) _mesa_malloc (count * sizeof (GLint));
167 if (offsets == NULL)
168 {
169 (**sha)._generic._unknown.Release ((struct gl2_unknown_intf **) sha);
170 _mesa_error (ctx, GL_OUT_OF_MEMORY, "glShaderSourceARB");
171 return;
172 }
173
174 for (i = 0; i < count; i++)
175 {
176 if (length == NULL || length[i] < 0)
177 offsets[i] = _mesa_strlen (string[i]);
178 else
179 offsets[i] = length[i];
180 /* accumulate string lengths */
181 if (i > 0)
182 offsets[i] += offsets[i - 1];
183 }
184
185 source = (GLcharARB *) _mesa_malloc ((offsets[count - 1] + 1) * sizeof (GLcharARB));
186 if (source == NULL)
187 {
188 _mesa_free ((void *) offsets);
189 (**sha)._generic._unknown.Release ((struct gl2_unknown_intf **) sha);
190 _mesa_error (ctx, GL_OUT_OF_MEMORY, "glShaderSourceARB");
191 return;
192 }
193
194 for (i = 0; i < count; i++)
195 {
196 GLint start = (i > 0) ? offsets[i - 1] : 0;
197 _mesa_memcpy (source + start, string[i], (offsets[i] - start) * sizeof (GLcharARB));
198 }
199 source[offsets[count - 1]] = '\0';
200
201 (**sha).SetSource (sha, source, offsets, count);
Michal Krol6324f732005-01-13 14:12:50 +0000202 (**sha)._generic._unknown.Release ((struct gl2_unknown_intf **) sha);
Michal Krolc1fe4692004-10-27 17:09:10 +0000203}
204
205void GLAPIENTRY
206_mesa_CompileShaderARB (GLhandleARB shaderObj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000207{
208 GET_CURRENT_CONTEXT(ctx);
209 struct gl2_unknown_intf **unk;
210 struct gl2_shader_intf **sha;
211
212 _glthread_LOCK_MUTEX (ctx->Shared->Mutex);
213 unk = (struct gl2_unknown_intf **) _mesa_HashLookup (ctx->Shared->GL2Objects, shaderObj);
214 _glthread_UNLOCK_MUTEX (ctx->Shared->Mutex);
215
216 if (unk == NULL)
217 {
218 _mesa_error (ctx, GL_INVALID_VALUE, "glCompileShaderARB");
219 return;
220 }
221
222 sha = (struct gl2_shader_intf **) (**unk).QueryInterface (unk, UIID_SHADER);
223 if (sha == NULL)
224 {
225 _mesa_error (ctx, GL_INVALID_OPERATION, "glCompileShaderARB");
226 return;
227 }
228
229 (**sha).Compile (sha);
Michal Krol6324f732005-01-13 14:12:50 +0000230 (**sha)._generic._unknown.Release ((struct gl2_unknown_intf **) sha);
Michal Krolc1fe4692004-10-27 17:09:10 +0000231}
232
233GLhandleARB GLAPIENTRY
234_mesa_CreateProgramObjectARB (void)
235{
Michal Krol6324f732005-01-13 14:12:50 +0000236 return _mesa_3dlabs_create_program_object ();
Michal Krolc1fe4692004-10-27 17:09:10 +0000237}
238
239void GLAPIENTRY
240_mesa_AttachObjectARB (GLhandleARB containerObj, GLhandleARB obj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000241{
242 GET_CURRENT_CONTEXT(ctx);
243 struct gl2_unknown_intf **unkc, **unka;
244 struct gl2_container_intf **con;
245 struct gl2_generic_intf **att;
246
247 _glthread_LOCK_MUTEX (ctx->Shared->Mutex);
248 unkc = (struct gl2_unknown_intf **) _mesa_HashLookup (ctx->Shared->GL2Objects, containerObj);
249 unka = (struct gl2_unknown_intf **) _mesa_HashLookup (ctx->Shared->GL2Objects, obj);
250 _glthread_UNLOCK_MUTEX (ctx->Shared->Mutex);
251
252 if (unkc == NULL || unka == NULL)
253 {
254 _mesa_error (ctx, GL_INVALID_VALUE, "glAttachObjectARB");
255 return;
256 }
257
258 con = (struct gl2_container_intf **) (**unkc).QueryInterface (unkc, UIID_CONTAINER);
259 if (con == NULL)
260 {
261 _mesa_error (ctx, GL_INVALID_VALUE, "glAttachObjectARB");
262 return;
263 }
264
265 att = (struct gl2_generic_intf **) (**unka).QueryInterface (unka, UIID_GENERIC);
266 if (att == NULL)
267 {
268 (**con)._generic._unknown.Release ((struct gl2_unknown_intf **) con);
269 _mesa_error (ctx, GL_INVALID_VALUE, "glAttachObjectARB");
270 return;
271 }
272
273 if (!(**con).Attach (con, att))
274 {
275 (**con)._generic._unknown.Release ((struct gl2_unknown_intf **) con);
276 (**att)._unknown.Release ((struct gl2_unknown_intf **) att);
277 return;
278 }
279
280 (**con)._generic._unknown.Release ((struct gl2_unknown_intf **) con);
Michal Krol6324f732005-01-13 14:12:50 +0000281 (**att)._unknown.Release ((struct gl2_unknown_intf **) att);
Michal Krolc1fe4692004-10-27 17:09:10 +0000282}
283
284void GLAPIENTRY
285_mesa_LinkProgramARB (GLhandleARB programObj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000286{
287 GET_CURRENT_CONTEXT(ctx);
288 struct gl2_unknown_intf **unk;
289 struct gl2_program_intf **pro;
290
291 _glthread_LOCK_MUTEX (ctx->Shared->Mutex);
292 unk = (struct gl2_unknown_intf **) _mesa_HashLookup (ctx->Shared->GL2Objects, programObj);
293 _glthread_UNLOCK_MUTEX (ctx->Shared->Mutex);
294
295 if (unk == NULL)
296 {
297 _mesa_error (ctx, GL_INVALID_VALUE, "glLinkProgramARB");
298 return;
299 }
300
301 pro = (struct gl2_program_intf **) (**unk).QueryInterface (unk, UIID_PROGRAM);
302 if (pro == NULL)
303 {
304 _mesa_error (ctx, GL_INVALID_OPERATION, "glLinkProgramARB");
305 return;
306 }
307
Michal Krol44e9ccc2006-02-13 11:31:16 +0000308 if (pro == ctx->ShaderObjects.CurrentProgram)
Michal Krol1d7f7192005-03-25 12:12:50 +0000309 {
310 /* TODO re-install executable program */
311 }
312
313 (**pro).Link (pro);
Michal Krol6324f732005-01-13 14:12:50 +0000314 (**pro)._container._generic._unknown.Release ((struct gl2_unknown_intf **) pro);
Michal Krolc1fe4692004-10-27 17:09:10 +0000315}
316
Michal Krolc1fe4692004-10-27 17:09:10 +0000317void GLAPIENTRY
318_mesa_UseProgramObjectARB (GLhandleARB programObj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000319{
320 GET_CURRENT_CONTEXT(ctx);
Michal Krolcc159162006-02-21 12:35:06 +0000321 struct gl2_program_intf **pro;
322
323 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000324
325 if (programObj == 0)
326 {
327 pro = NULL;
328 }
329 else
330 {
331 struct gl2_unknown_intf **unk;
332
333 _glthread_LOCK_MUTEX (ctx->Shared->Mutex);
334 unk = (struct gl2_unknown_intf **) _mesa_HashLookup (ctx->Shared->GL2Objects, programObj);
335 _glthread_UNLOCK_MUTEX (ctx->Shared->Mutex);
336
337 if (unk == NULL)
338 {
339 _mesa_error (ctx, GL_INVALID_VALUE, "glUseProgramObjectARB");
340 return;
341 }
342
343 pro = (struct gl2_program_intf **) (**unk).QueryInterface (unk, UIID_PROGRAM);
344 if (pro == NULL)
345 {
346 _mesa_error (ctx, GL_INVALID_OPERATION, "glUseProgramObjectARB");
347 return;
348 }
349
350 if ((**pro).GetLinkStatus (pro) == GL_FALSE)
351 {
352 (**pro)._container._generic._unknown.Release ((struct gl2_unknown_intf **) pro);
353 _mesa_error (ctx, GL_INVALID_OPERATION, "glUseProgramObjectARB");
354 return;
355 }
356 }
357
Michal Krol44e9ccc2006-02-13 11:31:16 +0000358 if (ctx->ShaderObjects.CurrentProgram != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000359 {
Michal Krol44e9ccc2006-02-13 11:31:16 +0000360 (**ctx->ShaderObjects.CurrentProgram)._container._generic._unknown.Release (
361 (struct gl2_unknown_intf **) ctx->ShaderObjects.CurrentProgram);
Michal Krol1d7f7192005-03-25 12:12:50 +0000362 }
363
Michal Krol44e9ccc2006-02-13 11:31:16 +0000364 ctx->ShaderObjects.CurrentProgram = pro;
Michal Krolc1fe4692004-10-27 17:09:10 +0000365}
366
367void GLAPIENTRY
368_mesa_ValidateProgramARB (GLhandleARB programObj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000369{
370 GET_CURRENT_CONTEXT(ctx);
371 struct gl2_unknown_intf **unk;
372 struct gl2_program_intf **pro;
373
374 _glthread_LOCK_MUTEX (ctx->Shared->Mutex);
375 unk = (struct gl2_unknown_intf **) _mesa_HashLookup (ctx->Shared->GL2Objects, programObj);
376 _glthread_UNLOCK_MUTEX (ctx->Shared->Mutex);
377
378 if (unk == NULL)
379 {
380 _mesa_error (ctx, GL_INVALID_VALUE, "glValidateProgramARB");
381 return;
382 }
383
384 pro = (struct gl2_program_intf **) (**unk).QueryInterface (unk, UIID_PROGRAM);
385 if (pro == NULL)
386 {
387 _mesa_error (ctx, GL_INVALID_OPERATION, "glValidateProgramARB");
388 return;
389 }
390
391 (**pro).Validate (pro);
Michal Krol6324f732005-01-13 14:12:50 +0000392 (**pro)._container._generic._unknown.Release ((struct gl2_unknown_intf **) pro);
Michal Krol1d7f7192005-03-25 12:12:50 +0000393}
394
395/*
396Errors TODO
397
398 The error INVALID_OPERATION is generated by the Uniform*ARB if the
399 number of values loaded results in exceeding the declared extent of a
400 uniform.
401
402 The error INVALID_OPERATION is generated by the Uniform*ARB commands if
403 the size does not match the size of the uniform declared in the shader.
404
405 The error INVALID_OPERATION is generated by the Uniform*ARB commands if
406 the type does not match the type of the uniform declared in the shader,
407 if the uniform is not of type Boolean.
408
409 The error INVALID_OPERATION is generated by the Uniform*ARB commands if
410 <location> does not exist for the program object currently in use.
411
412 The error INVALID_OPERATION is generated if a uniform command other than
413 Uniform1i{v}ARB is used to load a sampler value.
414
415
Michal Krolcc159162006-02-21 12:35:06 +0000416*/
417
418#define _RELEASE_PROGRAM(obj)\
419 (**pro)._container._generic._unknown.Release ((struct gl2_unknown_intf **) pro)
420
421#define _LOOKUP_PROGRAM(obj, function)\
422 struct gl2_unknown_intf **unk;\
423 _glthread_LOCK_MUTEX (ctx->Shared->Mutex);\
424 unk = (struct gl2_unknown_intf **) _mesa_HashLookup (ctx->Shared->GL2Objects, obj);\
425 _glthread_UNLOCK_MUTEX (ctx->Shared->Mutex);\
426 if (unk == NULL) {\
427 _mesa_error (ctx, GL_INVALID_VALUE, function);\
428 break;\
429 }\
430 pro = (struct gl2_program_intf **) (**unk).QueryInterface (unk, UIID_PROGRAM);\
431 if (pro == NULL) {\
432 _mesa_error (ctx, GL_INVALID_OPERATION, function);\
433 break;\
434 }
435
436#define _CURRENT_PROGRAM(function)\
437 if (ctx->ShaderObjects.CurrentProgram == NULL) {\
438 _mesa_error (ctx, GL_INVALID_OPERATION, function);\
439 break;\
440 }\
441 pro = ctx->ShaderObjects.CurrentProgram;
442
443#define _IS_LINKED(function)\
444 if ((**pro).GetLinkStatus (pro) == GL_FALSE) {\
445 _mesa_error (ctx, GL_INVALID_OPERATION, function);\
446 _RELEASE_PROGRAM(obj);\
447 break;\
448 }
449
450#define GET_PROGRAM(obj, function)\
451 struct gl2_program_intf **pro = NULL;\
452 do {\
453 _LOOKUP_PROGRAM(obj, function);\
454 } while (0)
455
456#define GET_LINKED_PROGRAM(obj, function)\
457 struct gl2_program_intf **pro = NULL;\
458 do {\
459 _LOOKUP_PROGRAM(obj, function);\
460 _IS_LINKED(function);\
461 } while (0)
462
463#define CURRENT_LINKED_PROGRAM(function)\
464 struct gl2_program_intf **pro = NULL;\
465 do {\
466 _CURRENT_PROGRAM(function);\
467 _IS_LINKED(function);\
468 } while (0)
469
470/* XXX */
471GLboolean _slang_write_uniform (struct gl2_program_intf **, GLint, GLsizei, const GLvoid *, GLenum);
472
Michal Krolc1fe4692004-10-27 17:09:10 +0000473void GLAPIENTRY
474_mesa_Uniform1fARB (GLint location, GLfloat v0)
Michal Krolcc159162006-02-21 12:35:06 +0000475{
476 GET_CURRENT_CONTEXT(ctx);
477 CURRENT_LINKED_PROGRAM("glUniform1fARB");
478
479 if (!_slang_write_uniform (pro, location, 1, &v0, GL_FLOAT))
Michal Krol1d7f7192005-03-25 12:12:50 +0000480 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform1fARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000481}
482
483void GLAPIENTRY
484_mesa_Uniform2fARB (GLint location, GLfloat v0, GLfloat v1)
Michal Krol1d7f7192005-03-25 12:12:50 +0000485{
486 GET_CURRENT_CONTEXT(ctx);
487
Michal Krol44e9ccc2006-02-13 11:31:16 +0000488 if (ctx->ShaderObjects.CurrentProgram == NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000489 {
490 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform2fARB");
491 return;
Michal Krol6324f732005-01-13 14:12:50 +0000492 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000493}
494
495void GLAPIENTRY
496_mesa_Uniform3fARB (GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
Michal Krol1d7f7192005-03-25 12:12:50 +0000497{
498 GET_CURRENT_CONTEXT(ctx);
499
Michal Krol44e9ccc2006-02-13 11:31:16 +0000500 if (ctx->ShaderObjects.CurrentProgram == NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000501 {
502 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform3fARB");
503 return;
Michal Krol6324f732005-01-13 14:12:50 +0000504 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000505}
506
507void GLAPIENTRY
508_mesa_Uniform4fARB (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
Michal Krol1d7f7192005-03-25 12:12:50 +0000509{
510 GET_CURRENT_CONTEXT(ctx);
511
Michal Krol44e9ccc2006-02-13 11:31:16 +0000512 if (ctx->ShaderObjects.CurrentProgram == NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000513 {
514 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform4fARB");
515 return;
Michal Krol6324f732005-01-13 14:12:50 +0000516 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000517}
518
519void GLAPIENTRY
520_mesa_Uniform1iARB (GLint location, GLint v0)
Michal Krol1d7f7192005-03-25 12:12:50 +0000521{
522 GET_CURRENT_CONTEXT(ctx);
523
Michal Krol44e9ccc2006-02-13 11:31:16 +0000524 if (ctx->ShaderObjects.CurrentProgram == NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000525 {
526 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform1iARB");
527 return;
Michal Krol6324f732005-01-13 14:12:50 +0000528 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000529}
530
531void GLAPIENTRY
532_mesa_Uniform2iARB (GLint location, GLint v0, GLint v1)
Michal Krol1d7f7192005-03-25 12:12:50 +0000533{
534 GET_CURRENT_CONTEXT(ctx);
535
Michal Krol44e9ccc2006-02-13 11:31:16 +0000536 if (ctx->ShaderObjects.CurrentProgram == NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000537 {
538 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform2iARB");
539 return;
Michal Krol6324f732005-01-13 14:12:50 +0000540 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000541}
542
543void GLAPIENTRY
544_mesa_Uniform3iARB (GLint location, GLint v0, GLint v1, GLint v2)
Michal Krol1d7f7192005-03-25 12:12:50 +0000545{
546 GET_CURRENT_CONTEXT(ctx);
547
Michal Krol44e9ccc2006-02-13 11:31:16 +0000548 if (ctx->ShaderObjects.CurrentProgram == NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000549 {
550 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform3iARB");
551 return;
Michal Krol6324f732005-01-13 14:12:50 +0000552 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000553}
554
555void GLAPIENTRY
556_mesa_Uniform4iARB (GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
Michal Krol1d7f7192005-03-25 12:12:50 +0000557{
558 GET_CURRENT_CONTEXT(ctx);
559
Michal Krol44e9ccc2006-02-13 11:31:16 +0000560 if (ctx->ShaderObjects.CurrentProgram == NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000561 {
562 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform4iARB");
563 return;
Michal Krol6324f732005-01-13 14:12:50 +0000564 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000565}
566
567void GLAPIENTRY
568_mesa_Uniform1fvARB (GLint location, GLsizei count, const GLfloat *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000569{
570 GET_CURRENT_CONTEXT(ctx);
571
Michal Krol44e9ccc2006-02-13 11:31:16 +0000572 if (ctx->ShaderObjects.CurrentProgram == NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000573 {
574 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform1fvARB");
575 return;
Michal Krol6324f732005-01-13 14:12:50 +0000576 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000577}
578
579void GLAPIENTRY
580_mesa_Uniform2fvARB (GLint location, GLsizei count, const GLfloat *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000581{
582 GET_CURRENT_CONTEXT(ctx);
583
Michal Krol44e9ccc2006-02-13 11:31:16 +0000584 if (ctx->ShaderObjects.CurrentProgram == NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000585 {
586 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform2fvARB");
587 return;
Michal Krol6324f732005-01-13 14:12:50 +0000588 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000589}
590
591void GLAPIENTRY
592_mesa_Uniform3fvARB (GLint location, GLsizei count, const GLfloat *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000593{
594 GET_CURRENT_CONTEXT(ctx);
595
Michal Krol44e9ccc2006-02-13 11:31:16 +0000596 if (ctx->ShaderObjects.CurrentProgram == NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000597 {
598 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform3fvARB");
599 return;
Michal Krol6324f732005-01-13 14:12:50 +0000600 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000601}
602
603void GLAPIENTRY
604_mesa_Uniform4fvARB (GLint location, GLsizei count, const GLfloat *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000605{
Michal Krolcc159162006-02-21 12:35:06 +0000606 GET_CURRENT_CONTEXT(ctx);
607 CURRENT_LINKED_PROGRAM("glUniform4fvARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000608
Michal Krolcc159162006-02-21 12:35:06 +0000609 if (!_slang_write_uniform (pro, location, count, value, GL_FLOAT_VEC4_ARB))
Michal Krol1d7f7192005-03-25 12:12:50 +0000610 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform4fvARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000611}
612
613void GLAPIENTRY
614_mesa_Uniform1ivARB (GLint location, GLsizei count, const GLint *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000615{
616 GET_CURRENT_CONTEXT(ctx);
617
Michal Krol44e9ccc2006-02-13 11:31:16 +0000618 if (ctx->ShaderObjects.CurrentProgram == NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000619 {
620 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform1ivARB");
621 return;
Michal Krol6324f732005-01-13 14:12:50 +0000622 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000623}
624
625void GLAPIENTRY
626_mesa_Uniform2ivARB (GLint location, GLsizei count, const GLint *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000627{
628 GET_CURRENT_CONTEXT(ctx);
629
Michal Krol44e9ccc2006-02-13 11:31:16 +0000630 if (ctx->ShaderObjects.CurrentProgram == NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000631 {
632 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform2ivARB");
633 return;
Michal Krol6324f732005-01-13 14:12:50 +0000634 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000635}
636
637void GLAPIENTRY
638_mesa_Uniform3ivARB (GLint location, GLsizei count, const GLint *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000639{
640 GET_CURRENT_CONTEXT(ctx);
641
Michal Krol44e9ccc2006-02-13 11:31:16 +0000642 if (ctx->ShaderObjects.CurrentProgram == NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000643 {
644 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform3ivARB");
645 return;
Michal Krol6324f732005-01-13 14:12:50 +0000646 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000647}
648
649void GLAPIENTRY
650_mesa_Uniform4ivARB (GLint location, GLsizei count, const GLint *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000651{
652 GET_CURRENT_CONTEXT(ctx);
653
Michal Krol44e9ccc2006-02-13 11:31:16 +0000654 if (ctx->ShaderObjects.CurrentProgram == NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000655 {
656 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform4ivARB");
657 return;
Michal Krol6324f732005-01-13 14:12:50 +0000658 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000659}
660
661void GLAPIENTRY
662_mesa_UniformMatrix2fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000663{
664 GET_CURRENT_CONTEXT(ctx);
665
Michal Krol44e9ccc2006-02-13 11:31:16 +0000666 if (ctx->ShaderObjects.CurrentProgram == NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000667 {
668 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniformMatrix2fvARB");
669 return;
Michal Krol6324f732005-01-13 14:12:50 +0000670 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000671}
672
673void GLAPIENTRY
674_mesa_UniformMatrix3fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000675{
676 GET_CURRENT_CONTEXT(ctx);
677
Michal Krol44e9ccc2006-02-13 11:31:16 +0000678 if (ctx->ShaderObjects.CurrentProgram == NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000679 {
680 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniformMatrix3fvARB");
681 return;
Michal Krol6324f732005-01-13 14:12:50 +0000682 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000683}
684
685void GLAPIENTRY
686_mesa_UniformMatrix4fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000687{
688 GET_CURRENT_CONTEXT(ctx);
689
Michal Krol44e9ccc2006-02-13 11:31:16 +0000690 if (ctx->ShaderObjects.CurrentProgram == NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000691 {
692 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniformMatrix4fvARB");
693 return;
Michal Krol6324f732005-01-13 14:12:50 +0000694 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000695}
696
697static GLboolean
698_mesa_get_object_parameter (GLhandleARB obj, GLenum pname, GLvoid *params, GLboolean *integral,
699 GLint *size)
700{
701 GET_CURRENT_CONTEXT(ctx);
702 struct gl2_unknown_intf **unk;
703 struct gl2_generic_intf **gen;
704 struct gl2_shader_intf **sha;
705 struct gl2_program_intf **pro;
706 GLint *ipar = (GLint *) params;
707 /*GLfloat *fpar = (GLfloat *) params;*/
708 GLboolean success = GL_TRUE;
709
710 _glthread_LOCK_MUTEX (ctx->Shared->Mutex);
711 unk = (struct gl2_unknown_intf **) _mesa_HashLookup (ctx->Shared->GL2Objects, obj);
712 _glthread_UNLOCK_MUTEX (ctx->Shared->Mutex);
713
714 if (unk == NULL)
715 {
716 _mesa_error (ctx, GL_INVALID_VALUE, "glGetObjectParameterivARB");
717 return GL_FALSE;
718 }
719
720 gen = (struct gl2_generic_intf **) (**unk).QueryInterface (unk, UIID_GENERIC);
721 if (gen == NULL)
722 {
723 _mesa_error (ctx, GL_INVALID_OPERATION, "glGetObjectParameterivARB");
724 return GL_FALSE;
725 }
726
727 sha = (struct gl2_shader_intf **) (**unk).QueryInterface (unk, UIID_SHADER);
728 pro = (struct gl2_program_intf **) (**unk).QueryInterface (unk, UIID_PROGRAM);
729
730 /* set default values */
731 *integral = GL_TRUE; /* indicates param type, TRUE: GLint, FALSE: GLfloat */
732 *size = 1; /* param array size */
733
734 switch (pname)
735 {
736 case GL_OBJECT_TYPE_ARB:
737 *ipar = (**gen).GetType (gen);
738 break;
739 case GL_OBJECT_SUBTYPE_ARB:
740 if (sha != NULL)
741 *ipar = (**sha).GetSubType (sha);
742 else {
743 _mesa_error (ctx, GL_INVALID_OPERATION, "glGetObjectParameterivARB");
744 success = GL_FALSE;
745 }
746 break;
747 case GL_OBJECT_DELETE_STATUS_ARB:
748 *ipar = (**gen).GetDeleteStatus (gen);
749 break;
750 case GL_OBJECT_COMPILE_STATUS_ARB:
751 if (sha != NULL)
752 *ipar = (**sha).GetCompileStatus (sha);
753 else {
754 _mesa_error (ctx, GL_INVALID_OPERATION, "glGetObjectParameterivARB");
755 success = GL_FALSE;
756 }
757 break;
758 case GL_OBJECT_LINK_STATUS_ARB:
759 if (pro != NULL)
760 *ipar = (**pro).GetLinkStatus (pro);
761 else {
762 _mesa_error (ctx, GL_INVALID_OPERATION, "glGetObjectParameterivARB");
763 success = GL_FALSE;
764 }
765 break;
766 case GL_OBJECT_VALIDATE_STATUS_ARB:
767 if (pro != NULL)
768 *ipar = (**pro).GetValidateStatus (pro);
769 else {
770 _mesa_error (ctx, GL_INVALID_OPERATION, "glGetObjectParameterivARB");
771 success = GL_FALSE;
772 }
773 break;
774 case GL_OBJECT_INFO_LOG_LENGTH_ARB:
775 {
776 const GLcharARB *info = (**gen).GetInfoLog (gen);
777 if (info == NULL)
778 *ipar = 0;
779 else
780 *ipar = _mesa_strlen (info) + 1;
781 }
782 break;
783 case GL_OBJECT_ATTACHED_OBJECTS_ARB:
784 if (pro != NULL)
785 *ipar = (**pro)._container.GetAttachedCount ((struct gl2_container_intf **) pro);
786 else {
787 _mesa_error (ctx, GL_INVALID_OPERATION, "glGetObjectParameterivARB");
788 success = GL_FALSE;
789 }
790 break;
791 case GL_OBJECT_ACTIVE_UNIFORMS_ARB:
792 if (pro != NULL)
793 *ipar = 0; /* TODO */
794 else {
795 _mesa_error (ctx, GL_INVALID_OPERATION, "glGetObjectParameterivARB");
796 success = GL_FALSE;
797 }
798 break;
799 case GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB:
800 if (pro != NULL)
801 *ipar = 0; /* TODO */
802 else {
803 _mesa_error (ctx, GL_INVALID_OPERATION, "glGetObjectParameterivARB");
804 success = GL_FALSE;
805 }
806 break;
807 case GL_OBJECT_SHADER_SOURCE_LENGTH_ARB:
808 if (sha != NULL) {
809 const GLcharARB *src = (**sha).GetSource (sha);
810 if (src == NULL)
811 *ipar = 0;
812 else
813 *ipar = _mesa_strlen (src) + 1;
814 } else {
815 _mesa_error (ctx, GL_INVALID_OPERATION, "glGetObjectParameterivARB");
816 success = GL_FALSE;
817 }
818 break;
819 default:
820 _mesa_error (ctx, GL_INVALID_ENUM, "glGetObjectParameterivARB");
821 success = GL_FALSE;
822 break;
823 }
824
825 (**gen)._unknown.Release ((struct gl2_unknown_intf **) gen);
826 if (sha != NULL)
827 (**sha)._generic._unknown.Release ((struct gl2_unknown_intf **) sha);
828 if (pro != NULL)
829 (**pro)._container._generic._unknown.Release ((struct gl2_unknown_intf **) pro);
830
831 return success;
832}
833
Michal Krolc1fe4692004-10-27 17:09:10 +0000834void GLAPIENTRY
835_mesa_GetObjectParameterfvARB (GLhandleARB obj, GLenum pname, GLfloat *params)
Michal Krol1d7f7192005-03-25 12:12:50 +0000836{
837 GLboolean integral;
838 GLint size, i;
839
840 assert (sizeof (GLfloat) == sizeof (GLint));
841
842 if (_mesa_get_object_parameter (obj, pname, (GLvoid *) params, &integral, &size) != GL_FALSE)
843 if (integral != GL_FALSE)
844 for (i = 0; i < size; i++)
845 params[i] = (GLfloat) ((GLint *) params)[i];
Michal Krolc1fe4692004-10-27 17:09:10 +0000846}
847
848void GLAPIENTRY
849_mesa_GetObjectParameterivARB (GLhandleARB obj, GLenum pname, GLint *params)
Michal Krol1d7f7192005-03-25 12:12:50 +0000850{
851 GLboolean integral;
852 GLint size, i;
853
854 assert (sizeof (GLfloat) == sizeof (GLint));
855
856 if (_mesa_get_object_parameter (obj, pname, (GLvoid *) params, &integral, &size) != GL_FALSE)
857 if (integral == GL_FALSE)
858 for (i = 0; i < size; i++)
859 params[i] = (GLint) ((GLfloat *) params)[i];
Michal Krolc1fe4692004-10-27 17:09:10 +0000860}
861
Michal Krol1d7f7192005-03-25 12:12:50 +0000862static void
863_mesa_get_string (const GLcharARB *src, GLsizei maxLength, GLsizei *length, GLcharARB *str)
864{
865 GLsizei len;
866
867 if (src == NULL)
868 src = "";
869
870 len = _mesa_strlen (src);
871 if (len > maxLength)
872 {
873 len = maxLength;
874 /* allocate space for null termination */
875 if (len > 0)
876 len--;
877 }
878
879 _mesa_memcpy (str, src, len * sizeof (GLcharARB));
880 if (maxLength > 0)
881 str[len] = '\0';
882
883 if (length != NULL)
Michal Krol6324f732005-01-13 14:12:50 +0000884 *length = len;
Michal Krolc1fe4692004-10-27 17:09:10 +0000885}
886
887void GLAPIENTRY
Michal Krol1d7f7192005-03-25 12:12:50 +0000888_mesa_GetInfoLogARB (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog)
889{
890 GET_CURRENT_CONTEXT(ctx);
891 struct gl2_unknown_intf **unk;
892 struct gl2_generic_intf **gen;
893
894 _glthread_LOCK_MUTEX (ctx->Shared->Mutex);
895 unk = (struct gl2_unknown_intf **) _mesa_HashLookup (ctx->Shared->GL2Objects, obj);
896 _glthread_UNLOCK_MUTEX (ctx->Shared->Mutex);
897
898 if (unk == NULL)
899 {
900 _mesa_error (ctx, GL_INVALID_VALUE, "glGetInfoLogARB");
901 return;
902 }
903
904 gen = (struct gl2_generic_intf **) (**unk).QueryInterface (unk, UIID_GENERIC);
905 if (gen == NULL)
906 {
907 _mesa_error (ctx, GL_INVALID_OPERATION, "glGetInfoLogARB");
908 return;
909 }
910
911 _mesa_get_string ((**gen).GetInfoLog (gen), maxLength, length, infoLog);
912
913 (**gen)._unknown.Release ((struct gl2_unknown_intf **) gen);
914}
915
916void GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000917_mesa_GetAttachedObjectsARB (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count, GLhandleARB *obj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000918{
919 GET_CURRENT_CONTEXT(ctx);
920 struct gl2_unknown_intf **unk;
921 struct gl2_container_intf **con;
922 GLsizei cnt, i;
923
924 _glthread_LOCK_MUTEX (ctx->Shared->Mutex);
925 unk = (struct gl2_unknown_intf **) _mesa_HashLookup (ctx->Shared->GL2Objects, containerObj);
926 _glthread_UNLOCK_MUTEX (ctx->Shared->Mutex);
927
928 if (unk == NULL)
929 {
930 _mesa_error (ctx, GL_INVALID_VALUE, "glGetAttachedObjectsARB");
931 return;
932 }
933
934 con = (struct gl2_container_intf **) (**unk).QueryInterface (unk, UIID_CONTAINER);
935 if (con == NULL)
936 {
937 _mesa_error (ctx, GL_INVALID_OPERATION, "glGetAttachedObjectsARB");
938 return;
939 }
940
941 cnt = (**con).GetAttachedCount (con);
942 if (cnt > maxCount)
943 cnt = maxCount;
944
945 for (i = 0; i < cnt; i++)
946 {
947 struct gl2_generic_intf **x = (**con).GetAttached (con, i);
948 obj[i] = (**x).GetName (x);
949 (**x)._unknown.Release ((struct gl2_unknown_intf **) x);
950 }
951
952 (**con)._generic._unknown.Release ((struct gl2_unknown_intf **) con);
953
954 if (count != NULL)
Michal Krol6324f732005-01-13 14:12:50 +0000955 *count = cnt;
Michal Krolcc159162006-02-21 12:35:06 +0000956}
957
958/* XXX */
959GLint _slang_get_uniform_location (struct gl2_program_intf **, const char *);
Michal Krolc1fe4692004-10-27 17:09:10 +0000960
961GLint GLAPIENTRY
962_mesa_GetUniformLocationARB (GLhandleARB programObj, const GLcharARB *name)
Michal Krol1d7f7192005-03-25 12:12:50 +0000963{
Michal Krolcc159162006-02-21 12:35:06 +0000964 GET_CURRENT_CONTEXT(ctx);
Michal Krol1d7f7192005-03-25 12:12:50 +0000965 GLint loc = -1;
Michal Krolcc159162006-02-21 12:35:06 +0000966 GET_LINKED_PROGRAM(programObj, "glGetUniformLocationARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000967
Michal Krolcc159162006-02-21 12:35:06 +0000968 if (pro == NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000969 return -1;
Michal Krol1d7f7192005-03-25 12:12:50 +0000970
Michal Krolcc159162006-02-21 12:35:06 +0000971 loc = _slang_get_uniform_location (pro, name);
972 _RELEASE_PROGRAM(pro);
Michal Krol6324f732005-01-13 14:12:50 +0000973 return loc;
Michal Krolc1fe4692004-10-27 17:09:10 +0000974}
975
976void GLAPIENTRY
977_mesa_GetActiveUniformARB (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name)
Michal Krol1d7f7192005-03-25 12:12:50 +0000978{
979 GET_CURRENT_CONTEXT(ctx);
980 struct gl2_unknown_intf **unk;
981 struct gl2_program_intf **pro;
982
983 _glthread_LOCK_MUTEX (ctx->Shared->Mutex);
984 unk = (struct gl2_unknown_intf **) _mesa_HashLookup (ctx->Shared->GL2Objects, programObj);
985 _glthread_UNLOCK_MUTEX (ctx->Shared->Mutex);
986
987 if (unk == NULL)
988 {
989 _mesa_error (ctx, GL_INVALID_VALUE, "glGetActiveUniformARB");
990 return;
991 }
992
993 pro = (struct gl2_program_intf **) (**unk).QueryInterface (unk, UIID_PROGRAM);
994 if (pro == NULL)
995 {
996 _mesa_error (ctx, GL_INVALID_OPERATION, "glGetActiveUniformARB");
997 return;
998 }
999
1000/* if (index >= val (OBJECT_ACTIVE_ATTRIBUTES_ARB))
1001 {
1002 _mesa_error (ctx, GL_INVALID_VALUE, "glGetActiveUniformARB");
1003 (**pro)._container._generic._unknown.Release ((struct gl2_unknown_intf **) pro);
1004 return;
1005 }*/
1006
1007 /* TODO */
1008
Michal Krol6324f732005-01-13 14:12:50 +00001009 (**pro)._container._generic._unknown.Release ((struct gl2_unknown_intf **) pro);
Michal Krolc1fe4692004-10-27 17:09:10 +00001010}
1011
1012void GLAPIENTRY
1013_mesa_GetUniformfvARB (GLhandleARB programObj, GLint location, GLfloat *params)
Michal Krol1d7f7192005-03-25 12:12:50 +00001014{
1015 GET_CURRENT_CONTEXT(ctx);
1016 struct gl2_unknown_intf **unk;
1017 struct gl2_program_intf **pro;
1018
1019 _glthread_LOCK_MUTEX (ctx->Shared->Mutex);
1020 unk = (struct gl2_unknown_intf **) _mesa_HashLookup (ctx->Shared->GL2Objects, programObj);
1021 _glthread_UNLOCK_MUTEX (ctx->Shared->Mutex);
1022
1023 if (unk == NULL)
1024 {
1025 _mesa_error (ctx, GL_INVALID_VALUE, "glGetUniformfvARB");
1026 return;
1027 }
1028
1029 pro = (struct gl2_program_intf **) (**unk).QueryInterface (unk, UIID_PROGRAM);
1030 if (pro == NULL)
1031 {
1032 _mesa_error (ctx, GL_INVALID_OPERATION, "glGetUniformfvARB");
1033 return;
1034 }
1035
1036 if ((**pro).GetLinkStatus (pro) == GL_FALSE)
1037 {
1038 _mesa_error (ctx, GL_INVALID_OPERATION, "glGetUniformfvARB");
1039 (**pro)._container._generic._unknown.Release ((struct gl2_unknown_intf **) pro);
1040 return;
1041 }
1042
1043 /* TODO validate location (OPERATION) */
1044
1045 /* TODO */
1046
Michal Krol6324f732005-01-13 14:12:50 +00001047 (**pro)._container._generic._unknown.Release ((struct gl2_unknown_intf **) pro);
Michal Krolc1fe4692004-10-27 17:09:10 +00001048}
1049
1050void GLAPIENTRY
1051_mesa_GetUniformivARB (GLhandleARB programObj, GLint location, GLint *params)
Michal Krol1d7f7192005-03-25 12:12:50 +00001052{
1053 GET_CURRENT_CONTEXT(ctx);
1054 struct gl2_unknown_intf **unk;
1055 struct gl2_program_intf **pro;
1056
1057 _glthread_LOCK_MUTEX (ctx->Shared->Mutex);
1058 unk = (struct gl2_unknown_intf **) _mesa_HashLookup (ctx->Shared->GL2Objects, programObj);
1059 _glthread_UNLOCK_MUTEX (ctx->Shared->Mutex);
1060
1061 if (unk == NULL)
1062 {
1063 _mesa_error (ctx, GL_INVALID_VALUE, "glGetUniformivARB");
1064 return;
1065 }
1066
1067 pro = (struct gl2_program_intf **) (**unk).QueryInterface (unk, UIID_PROGRAM);
1068 if (pro == NULL)
1069 {
1070 _mesa_error (ctx, GL_INVALID_OPERATION, "glGetUniformivARB");
1071 return;
1072 }
1073
1074 if ((**pro).GetLinkStatus (pro) == GL_FALSE)
1075 {
1076 _mesa_error (ctx, GL_INVALID_OPERATION, "glGetUniformivARB");
1077 (**pro)._container._generic._unknown.Release ((struct gl2_unknown_intf **) pro);
1078 return;
1079 }
1080
1081 /* TODO validate location (GL_INVALID_OPERATION) */
1082
1083 /* TODO */
1084
Michal Krol6324f732005-01-13 14:12:50 +00001085 (**pro)._container._generic._unknown.Release ((struct gl2_unknown_intf **) pro);
Michal Krolc1fe4692004-10-27 17:09:10 +00001086}
1087
1088void GLAPIENTRY
1089_mesa_GetShaderSourceARB (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source)
Michal Krol1d7f7192005-03-25 12:12:50 +00001090{
1091 GET_CURRENT_CONTEXT(ctx);
1092 struct gl2_unknown_intf **unk;
1093 struct gl2_shader_intf **sha;
1094
1095 _glthread_LOCK_MUTEX (ctx->Shared->Mutex);
1096 unk = (struct gl2_unknown_intf **) _mesa_HashLookup (ctx->Shared->GL2Objects, obj);
1097 _glthread_UNLOCK_MUTEX (ctx->Shared->Mutex);
1098
1099 if (unk == NULL)
1100 {
1101 _mesa_error (ctx, GL_INVALID_VALUE, "glGetShaderSourceARB");
1102 return;
1103 }
1104
1105 sha = (struct gl2_shader_intf **) (**unk).QueryInterface (unk, UIID_SHADER);
1106 if (sha == NULL)
1107 {
1108 _mesa_error (ctx, GL_INVALID_OPERATION, "glGetShaderSourceARB");
1109 return;
1110 }
1111
1112 _mesa_get_string ((**sha).GetSource (sha), maxLength, length, source);
1113
1114 (**sha)._generic._unknown.Release ((struct gl2_unknown_intf **) sha);
Michal Krolc1fe4692004-10-27 17:09:10 +00001115}
1116
1117/* GL_ARB_vertex_shader */
1118
1119void GLAPIENTRY
1120_mesa_BindAttribLocationARB (GLhandleARB programObj, GLuint index, const GLcharARB *name)
Michal Krol1d7f7192005-03-25 12:12:50 +00001121{
1122 GET_CURRENT_CONTEXT(ctx);
1123 struct gl2_unknown_intf **unk;
1124 struct gl2_program_intf **pro;
1125
1126 _glthread_LOCK_MUTEX (ctx->Shared->Mutex);
1127 unk = (struct gl2_unknown_intf **) _mesa_HashLookup (ctx->Shared->GL2Objects, programObj);
1128 _glthread_UNLOCK_MUTEX (ctx->Shared->Mutex);
1129
1130 if (unk == NULL)
1131 {
1132 _mesa_error (ctx, GL_INVALID_VALUE, "glBindAttribLocationARB");
1133 return;
1134 }
1135
1136 pro = (struct gl2_program_intf **) (**unk).QueryInterface (unk, UIID_PROGRAM);
1137 if (pro == NULL)
1138 {
1139 _mesa_error (ctx, GL_INVALID_VALUE, "glBindAttribLocationARB");
1140 return;
1141 }
1142
1143 /* TODO */
1144
Michal Krol6324f732005-01-13 14:12:50 +00001145 (**pro)._container._generic._unknown.Release ((struct gl2_unknown_intf **) pro);
Michal Krolc1fe4692004-10-27 17:09:10 +00001146}
1147
1148void GLAPIENTRY
1149_mesa_GetActiveAttribARB (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name)
Michal Krol1d7f7192005-03-25 12:12:50 +00001150{
1151 GET_CURRENT_CONTEXT(ctx);
1152 struct gl2_unknown_intf **unk;
1153 struct gl2_program_intf **pro;
1154
1155 _glthread_LOCK_MUTEX (ctx->Shared->Mutex);
1156 unk = (struct gl2_unknown_intf **) _mesa_HashLookup (ctx->Shared->GL2Objects, programObj);
1157 _glthread_UNLOCK_MUTEX (ctx->Shared->Mutex);
1158
1159 if (unk == NULL)
1160 {
1161 _mesa_error (ctx, GL_INVALID_VALUE, "glGetActiveAttribARB");
1162 return;
1163 }
1164
1165 pro = (struct gl2_program_intf **) (**unk).QueryInterface (unk, UIID_PROGRAM);
1166 if (pro == NULL)
1167 {
1168 _mesa_error (ctx, GL_INVALID_VALUE, "glGetActiveAttribARB");
1169 return;
1170 }
1171
1172 /* TODO */
1173
Michal Krol6324f732005-01-13 14:12:50 +00001174 (**pro)._container._generic._unknown.Release ((struct gl2_unknown_intf **) pro);
Michal Krolc1fe4692004-10-27 17:09:10 +00001175}
1176
1177GLint GLAPIENTRY
1178_mesa_GetAttribLocationARB (GLhandleARB programObj, const GLcharARB *name)
Michal Krol1d7f7192005-03-25 12:12:50 +00001179{
1180 GET_CURRENT_CONTEXT(ctx);
1181 struct gl2_unknown_intf **unk;
1182 struct gl2_program_intf **pro;
1183 GLint loc = 0;
1184
1185 _glthread_LOCK_MUTEX (ctx->Shared->Mutex);
1186 unk = (struct gl2_unknown_intf **) _mesa_HashLookup (ctx->Shared->GL2Objects, programObj);
1187 _glthread_UNLOCK_MUTEX (ctx->Shared->Mutex);
1188
1189 if (unk == NULL)
1190 {
1191 _mesa_error (ctx, GL_INVALID_VALUE, "glGetAttribLocationARB");
1192 return 0;
1193 }
1194
1195 pro = (struct gl2_program_intf **) (**unk).QueryInterface (unk, UIID_PROGRAM);
1196 if (pro == NULL)
1197 {
1198 _mesa_error (ctx, GL_INVALID_VALUE, "glGetAttribLocationARB");
1199 return 0;
1200 }
1201
1202 /* TODO */
1203
Michal Krol6324f732005-01-13 14:12:50 +00001204 (**pro)._container._generic._unknown.Release ((struct gl2_unknown_intf **) pro);
1205 return loc;
Michal Krolc1fe4692004-10-27 17:09:10 +00001206}
1207
Michal Krol1d7f7192005-03-25 12:12:50 +00001208void
Michal Krol6324f732005-01-13 14:12:50 +00001209_mesa_init_shaderobjects (GLcontext *ctx)
Michal Krol1d7f7192005-03-25 12:12:50 +00001210{
Michal Krol44e9ccc2006-02-13 11:31:16 +00001211 ctx->ShaderObjects.CurrentProgram = NULL;
Michal Krol1d7f7192005-03-25 12:12:50 +00001212
1213 _mesa_init_shaderobjects_3dlabs (ctx);
Michal Krolc1fe4692004-10-27 17:09:10 +00001214}
Michal Krol1d7f7192005-03-25 12:12:50 +00001215