blob: ad55b7448c54e55167fdcb72129ee7b310a5c3ed [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 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
102#define _LINKED_PROGRAM(x, function)\
103 if ((**x).GetLinkStatus (x) == GL_FALSE) {\
104 RELEASE_PROGRAM(x);\
105 _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);\
114 _LINKED_PROGRAM(x, function);\
115 } 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);\
128 _LINKED_PROGRAM(x, function);\
129 } while (0)
130
131
132GLvoid GLAPIENTRY
Michal Krol6324f732005-01-13 14:12:50 +0000133_mesa_DeleteObjectARB (GLhandleARB obj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000134{
135 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000136 GET_GENERIC(gen, obj, "glDeleteObjectARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000137
Michal Krol9ac96052006-02-27 14:41:41 +0000138 if (gen != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000139 {
Michal Krol9ac96052006-02-27 14:41:41 +0000140 (**gen).Delete (gen);
141 RELEASE_GENERIC(gen);
Michal Krol1d7f7192005-03-25 12:12:50 +0000142 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000143}
144
145GLhandleARB GLAPIENTRY
Michal Krol6324f732005-01-13 14:12:50 +0000146_mesa_GetHandleARB (GLenum pname)
Michal Krol1d7f7192005-03-25 12:12:50 +0000147{
148 GET_CURRENT_CONTEXT(ctx);
149
150 switch (pname)
151 {
152 case GL_PROGRAM_OBJECT_ARB:
Michal Krol9ac96052006-02-27 14:41:41 +0000153 {
154 I_PROGRAM pro = ctx->ShaderObjects.CurrentProgram;
155
156 if (pro != NULL)
157 return (**pro)._container._generic.GetName ((I_GENERIC) pro);
158 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000159 break;
Michal Krol9ac96052006-02-27 14:41:41 +0000160 default:
161 _mesa_error (ctx, GL_INVALID_ENUM, "glGetHandleARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000162 }
Michal Krol6324f732005-01-13 14:12:50 +0000163
164 return 0;
Michal Krolc1fe4692004-10-27 17:09:10 +0000165}
166
Michal Krol9ac96052006-02-27 14:41:41 +0000167GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000168_mesa_DetachObjectARB (GLhandleARB containerObj, GLhandleARB attachedObj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000169{
170 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000171 GET_CONTAINER(con, containerObj, "glDetachObjectARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000172
Michal Krol9ac96052006-02-27 14:41:41 +0000173 if (con != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000174 {
Michal Krol9ac96052006-02-27 14:41:41 +0000175 GET_GENERIC(att, attachedObj, "glDetachObjectARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000176
Michal Krol9ac96052006-02-27 14:41:41 +0000177 if (att != NULL)
178 {
179 (**con).Detach (con, att);
180 RELEASE_GENERIC(att);
181 }
182 RELEASE_CONTAINER(con);
Michal Krol1d7f7192005-03-25 12:12:50 +0000183 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000184}
185
186GLhandleARB GLAPIENTRY
187_mesa_CreateShaderObjectARB (GLenum shaderType)
Michal Krol1d7f7192005-03-25 12:12:50 +0000188{
Michal Krol6324f732005-01-13 14:12:50 +0000189 return _mesa_3dlabs_create_shader_object (shaderType);
Michal Krolc1fe4692004-10-27 17:09:10 +0000190}
191
Michal Krol9ac96052006-02-27 14:41:41 +0000192GLvoid GLAPIENTRY
Michal Krol1d7f7192005-03-25 12:12:50 +0000193_mesa_ShaderSourceARB (GLhandleARB shaderObj, GLsizei count, const GLcharARB **string,
Michal Krol6324f732005-01-13 14:12:50 +0000194 const GLint *length)
Michal Krol1d7f7192005-03-25 12:12:50 +0000195{
196 GET_CURRENT_CONTEXT(ctx);
Michal Krol1d7f7192005-03-25 12:12:50 +0000197 GLint *offsets;
198 GLsizei i;
199 GLcharARB *source;
Michal Krol9ac96052006-02-27 14:41:41 +0000200 GET_SHADER(sha, shaderObj, "glShaderSourceARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000201
Michal Krol1d7f7192005-03-25 12:12:50 +0000202 if (sha == NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000203 return;
Michal Krol1d7f7192005-03-25 12:12:50 +0000204
Michal Krol9ac96052006-02-27 14:41:41 +0000205 /*
206 * This array holds offsets of where the appropriate string ends, thus the last
207 * element will be set to the total length of the source code.
208 */
Michal Krol1d7f7192005-03-25 12:12:50 +0000209 offsets = (GLint *) _mesa_malloc (count * sizeof (GLint));
210 if (offsets == NULL)
211 {
Michal Krol9ac96052006-02-27 14:41:41 +0000212 RELEASE_SHADER(sha);
Michal Krol1d7f7192005-03-25 12:12:50 +0000213 _mesa_error (ctx, GL_OUT_OF_MEMORY, "glShaderSourceARB");
214 return;
215 }
216
217 for (i = 0; i < count; i++)
218 {
219 if (length == NULL || length[i] < 0)
220 offsets[i] = _mesa_strlen (string[i]);
221 else
222 offsets[i] = length[i];
223 /* accumulate string lengths */
224 if (i > 0)
225 offsets[i] += offsets[i - 1];
226 }
227
228 source = (GLcharARB *) _mesa_malloc ((offsets[count - 1] + 1) * sizeof (GLcharARB));
229 if (source == NULL)
230 {
Michal Krol9ac96052006-02-27 14:41:41 +0000231 _mesa_free ((GLvoid *) offsets);
232 RELEASE_SHADER(sha);
Michal Krol1d7f7192005-03-25 12:12:50 +0000233 _mesa_error (ctx, GL_OUT_OF_MEMORY, "glShaderSourceARB");
234 return;
235 }
236
237 for (i = 0; i < count; i++)
238 {
239 GLint start = (i > 0) ? offsets[i - 1] : 0;
240 _mesa_memcpy (source + start, string[i], (offsets[i] - start) * sizeof (GLcharARB));
241 }
242 source[offsets[count - 1]] = '\0';
243
244 (**sha).SetSource (sha, source, offsets, count);
Michal Krol9ac96052006-02-27 14:41:41 +0000245 RELEASE_SHADER(sha);
Michal Krolc1fe4692004-10-27 17:09:10 +0000246}
247
Michal Krol9ac96052006-02-27 14:41:41 +0000248GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000249_mesa_CompileShaderARB (GLhandleARB shaderObj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000250{
251 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000252 GET_SHADER(sha, shaderObj, "glCompileShaderARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000253
Michal Krol9ac96052006-02-27 14:41:41 +0000254 if (sha != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000255 {
Michal Krol9ac96052006-02-27 14:41:41 +0000256 (**sha).Compile (sha);
257 RELEASE_SHADER(sha);
Michal Krol1d7f7192005-03-25 12:12:50 +0000258 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000259}
260
261GLhandleARB GLAPIENTRY
Michal Krol9ac96052006-02-27 14:41:41 +0000262_mesa_CreateProgramObjectARB (GLvoid)
Michal Krolc1fe4692004-10-27 17:09:10 +0000263{
Michal Krol6324f732005-01-13 14:12:50 +0000264 return _mesa_3dlabs_create_program_object ();
Michal Krolc1fe4692004-10-27 17:09:10 +0000265}
266
Michal Krol9ac96052006-02-27 14:41:41 +0000267GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000268_mesa_AttachObjectARB (GLhandleARB containerObj, GLhandleARB obj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000269{
270 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000271 GET_CONTAINER(con, containerObj, "glAttachObjectARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000272
Michal Krol9ac96052006-02-27 14:41:41 +0000273 if (con != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000274 {
Michal Krol9ac96052006-02-27 14:41:41 +0000275 GET_GENERIC(att, obj, "glAttachObjectARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000276
Michal Krol9ac96052006-02-27 14:41:41 +0000277 if (att != NULL)
278 {
279 (**con).Attach (con, att);
280 RELEASE_GENERIC(att);
281 }
282 RELEASE_CONTAINER(con);
Michal Krol1d7f7192005-03-25 12:12:50 +0000283 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000284}
285
Michal Krol9ac96052006-02-27 14:41:41 +0000286GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000287_mesa_LinkProgramARB (GLhandleARB programObj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000288{
289 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000290 GET_PROGRAM(pro, programObj, "glLinkProgramARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000291
Michal Krol9ac96052006-02-27 14:41:41 +0000292 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000293 {
Michal Krol9ac96052006-02-27 14:41:41 +0000294 if (pro == ctx->ShaderObjects.CurrentProgram)
295 {
296 /* TODO re-install executable program */
297 }
298 (**pro).Link (pro);
299 RELEASE_PROGRAM(pro);
Michal Krol1d7f7192005-03-25 12:12:50 +0000300 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000301}
302
Michal Krol9ac96052006-02-27 14:41:41 +0000303GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000304_mesa_UseProgramObjectARB (GLhandleARB programObj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000305{
306 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000307 I_PROGRAM program = NULL;
308
Michal Krolcc159162006-02-21 12:35:06 +0000309 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000310
Michal Krol9ac96052006-02-27 14:41:41 +0000311 if (programObj != 0)
Michal Krol1d7f7192005-03-25 12:12:50 +0000312 {
Michal Krol9ac96052006-02-27 14:41:41 +0000313 GET_PROGRAM(pro, programObj, "glUseProgramObjectARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000314
Michal Krol1d7f7192005-03-25 12:12:50 +0000315 if (pro == NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000316 return;
Michal Krol1d7f7192005-03-25 12:12:50 +0000317
318 if ((**pro).GetLinkStatus (pro) == GL_FALSE)
319 {
Michal Krol9ac96052006-02-27 14:41:41 +0000320 RELEASE_PROGRAM(pro);
Michal Krol1d7f7192005-03-25 12:12:50 +0000321 _mesa_error (ctx, GL_INVALID_OPERATION, "glUseProgramObjectARB");
322 return;
323 }
Michal Krol9ac96052006-02-27 14:41:41 +0000324
325 program = pro;
Michal Krol1d7f7192005-03-25 12:12:50 +0000326 }
327
Michal Krol44e9ccc2006-02-13 11:31:16 +0000328 if (ctx->ShaderObjects.CurrentProgram != NULL)
Michal Krol9ac96052006-02-27 14:41:41 +0000329 RELEASE_PROGRAM(ctx->ShaderObjects.CurrentProgram);
330 ctx->ShaderObjects.CurrentProgram = program;
Michal Krolc1fe4692004-10-27 17:09:10 +0000331}
332
Michal Krol9ac96052006-02-27 14:41:41 +0000333GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000334_mesa_ValidateProgramARB (GLhandleARB programObj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000335{
336 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000337 GET_PROGRAM(pro, programObj, "glValidateProgramARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000338
Michal Krol9ac96052006-02-27 14:41:41 +0000339 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000340 {
Michal Krol9ac96052006-02-27 14:41:41 +0000341 (**pro).Validate (pro);
342 RELEASE_PROGRAM(pro);
Michal Krol1d7f7192005-03-25 12:12:50 +0000343 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000344}
345
Michal Krol9ac96052006-02-27 14:41:41 +0000346GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000347_mesa_Uniform1fARB (GLint location, GLfloat v0)
Michal Krol9ac96052006-02-27 14:41:41 +0000348{
349 GET_CURRENT_CONTEXT(ctx);
Michal Krol8af48fc2006-03-14 11:23:16 +0000350 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform1fARB");
351
352 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol9ac96052006-02-27 14:41:41 +0000353
354 if (pro != NULL)
355 {
356 if (!_slang_write_uniform (pro, location, 1, &v0, GL_FLOAT))
357 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform1fARB");
358 }
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_Uniform2fARB (GLint location, GLfloat v0, GLfloat v1)
Michal Krol1d7f7192005-03-25 12:12:50 +0000363{
364 GET_CURRENT_CONTEXT(ctx);
Michal Krol8af48fc2006-03-14 11:23:16 +0000365 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform2fARB");
366
367 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000368
Michal Krol9ac96052006-02-27 14:41:41 +0000369 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000370 {
Michal Krol9ac96052006-02-27 14:41:41 +0000371 GLfloat v[2] = { v0, v1 };
372
373 if (!_slang_write_uniform (pro, location, 1, v, GL_FLOAT_VEC2))
374 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform2fARB");
Michal Krol6324f732005-01-13 14:12:50 +0000375 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000376}
377
Michal Krol9ac96052006-02-27 14:41:41 +0000378GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000379_mesa_Uniform3fARB (GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
Michal Krol1d7f7192005-03-25 12:12:50 +0000380{
381 GET_CURRENT_CONTEXT(ctx);
Michal Krol8af48fc2006-03-14 11:23:16 +0000382 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform3fARB");
383
384 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000385
Michal Krol9ac96052006-02-27 14:41:41 +0000386 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000387 {
Michal Krol9ac96052006-02-27 14:41:41 +0000388 GLfloat v[3] = { v0, v1, v2 };
389
390 if (!_slang_write_uniform (pro, location, 1, v, GL_FLOAT_VEC3))
391 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform3fARB");
Michal Krol6324f732005-01-13 14:12:50 +0000392 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000393}
394
Michal Krol9ac96052006-02-27 14:41:41 +0000395GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000396_mesa_Uniform4fARB (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
Michal Krol1d7f7192005-03-25 12:12:50 +0000397{
398 GET_CURRENT_CONTEXT(ctx);
Michal Krol8af48fc2006-03-14 11:23:16 +0000399 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform4fARB");
400
401 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000402
Michal Krol9ac96052006-02-27 14:41:41 +0000403 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000404 {
Michal Krol9ac96052006-02-27 14:41:41 +0000405 GLfloat v[4] = { v0, v1, v2, v3 };
406
407 if (!_slang_write_uniform (pro, location, 1, v, GL_FLOAT_VEC4))
408 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform4fARB");
Michal Krol6324f732005-01-13 14:12:50 +0000409 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000410}
411
Michal Krol9ac96052006-02-27 14:41:41 +0000412GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000413_mesa_Uniform1iARB (GLint location, GLint v0)
Michal Krol1d7f7192005-03-25 12:12:50 +0000414{
415 GET_CURRENT_CONTEXT(ctx);
Michal Krol8af48fc2006-03-14 11:23:16 +0000416 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform1iARB");
417
418 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000419
Michal Krol9ac96052006-02-27 14:41:41 +0000420 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000421 {
Michal Krol9ac96052006-02-27 14:41:41 +0000422 if (!_slang_write_uniform (pro, location, 1, &v0, GL_INT))
423 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform1iARB");
Michal Krol6324f732005-01-13 14:12:50 +0000424 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000425}
426
Michal Krol9ac96052006-02-27 14:41:41 +0000427GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000428_mesa_Uniform2iARB (GLint location, GLint v0, GLint v1)
Michal Krol1d7f7192005-03-25 12:12:50 +0000429{
430 GET_CURRENT_CONTEXT(ctx);
Michal Krol8af48fc2006-03-14 11:23:16 +0000431 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform2iARB");
432
433 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000434
Michal Krol9ac96052006-02-27 14:41:41 +0000435 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000436 {
Michal Krol9ac96052006-02-27 14:41:41 +0000437 GLint v[2] = { v0, v1 };
438
439 if (!_slang_write_uniform (pro, location, 1, v, GL_INT_VEC2))
440 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform2iARB");
Michal Krol6324f732005-01-13 14:12:50 +0000441 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000442}
443
Michal Krol9ac96052006-02-27 14:41:41 +0000444GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000445_mesa_Uniform3iARB (GLint location, GLint v0, GLint v1, GLint v2)
Michal Krol1d7f7192005-03-25 12:12:50 +0000446{
447 GET_CURRENT_CONTEXT(ctx);
Michal Krol8af48fc2006-03-14 11:23:16 +0000448 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform3iARB");
449
450 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000451
Michal Krol9ac96052006-02-27 14:41:41 +0000452 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000453 {
Michal Krol9ac96052006-02-27 14:41:41 +0000454 GLint v[3] = { v0, v1, v2 };
455
456 if (!_slang_write_uniform (pro, location, 1, v, GL_INT_VEC3))
457 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform3iARB");
Michal Krol6324f732005-01-13 14:12:50 +0000458 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000459}
460
Michal Krol9ac96052006-02-27 14:41:41 +0000461GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000462_mesa_Uniform4iARB (GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
Michal Krol1d7f7192005-03-25 12:12:50 +0000463{
464 GET_CURRENT_CONTEXT(ctx);
Michal Krol8af48fc2006-03-14 11:23:16 +0000465 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform4iARB");
466
467 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000468
Michal Krol9ac96052006-02-27 14:41:41 +0000469 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000470 {
Michal Krol9ac96052006-02-27 14:41:41 +0000471 GLint v[4] = { v0, v1, v2, v3 };
472
473 if (!_slang_write_uniform (pro, location, 1, v, GL_INT_VEC4))
474 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform4iARB");
Michal Krol6324f732005-01-13 14:12:50 +0000475 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000476}
477
Michal Krol9ac96052006-02-27 14:41:41 +0000478GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000479_mesa_Uniform1fvARB (GLint location, GLsizei count, const GLfloat *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000480{
481 GET_CURRENT_CONTEXT(ctx);
Michal Krol8af48fc2006-03-14 11:23:16 +0000482 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform1fvARB");
483
484 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000485
Michal Krol9ac96052006-02-27 14:41:41 +0000486 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000487 {
Michal Krol9ac96052006-02-27 14:41:41 +0000488 if (!_slang_write_uniform (pro, location, count, value, GL_FLOAT))
489 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform1fvARB");
Michal Krol6324f732005-01-13 14:12:50 +0000490 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000491}
492
Michal Krol9ac96052006-02-27 14:41:41 +0000493GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000494_mesa_Uniform2fvARB (GLint location, GLsizei count, const GLfloat *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000495{
496 GET_CURRENT_CONTEXT(ctx);
Michal Krol8af48fc2006-03-14 11:23:16 +0000497 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform2fvARB");
498
499 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000500
Michal Krol9ac96052006-02-27 14:41:41 +0000501 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000502 {
Michal Krol9ac96052006-02-27 14:41:41 +0000503 if (!_slang_write_uniform (pro, location, count, value, GL_FLOAT_VEC2))
504 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform2fvARB");
Michal Krol6324f732005-01-13 14:12:50 +0000505 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000506}
507
Michal Krol9ac96052006-02-27 14:41:41 +0000508GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000509_mesa_Uniform3fvARB (GLint location, GLsizei count, const GLfloat *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000510{
511 GET_CURRENT_CONTEXT(ctx);
Michal Krol8af48fc2006-03-14 11:23:16 +0000512 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform3fvARB");
513
514 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000515
Michal Krol9ac96052006-02-27 14:41:41 +0000516 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000517 {
Michal Krol9ac96052006-02-27 14:41:41 +0000518 if (!_slang_write_uniform (pro, location, count, value, GL_FLOAT_VEC3))
519 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform3fvARB");
Michal Krol6324f732005-01-13 14:12:50 +0000520 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000521}
522
Michal Krol9ac96052006-02-27 14:41:41 +0000523GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000524_mesa_Uniform4fvARB (GLint location, GLsizei count, const GLfloat *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000525{
Michal Krol9ac96052006-02-27 14:41:41 +0000526 GET_CURRENT_CONTEXT(ctx);
Michal Krol8af48fc2006-03-14 11:23:16 +0000527 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform4fvARB");
528
529 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000530
Michal Krol9ac96052006-02-27 14:41:41 +0000531 if (pro != NULL)
532 {
533 if (!_slang_write_uniform (pro, location, count, value, GL_FLOAT_VEC4))
534 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform4fvARB");
535 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000536}
537
Michal Krol9ac96052006-02-27 14:41:41 +0000538GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000539_mesa_Uniform1ivARB (GLint location, GLsizei count, const GLint *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000540{
541 GET_CURRENT_CONTEXT(ctx);
Michal Krol8af48fc2006-03-14 11:23:16 +0000542 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform1ivARB");
543
544 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000545
Michal Krol9ac96052006-02-27 14:41:41 +0000546 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000547 {
Michal Krol9ac96052006-02-27 14:41:41 +0000548 if (!_slang_write_uniform (pro, location, count, value, GL_INT))
549 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform1ivARB");
Michal Krol6324f732005-01-13 14:12:50 +0000550 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000551}
552
Michal Krol9ac96052006-02-27 14:41:41 +0000553GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000554_mesa_Uniform2ivARB (GLint location, GLsizei count, const GLint *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000555{
556 GET_CURRENT_CONTEXT(ctx);
Michal Krol8af48fc2006-03-14 11:23:16 +0000557 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform2ivARB");
558
559 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000560
Michal Krol9ac96052006-02-27 14:41:41 +0000561 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000562 {
Michal Krol9ac96052006-02-27 14:41:41 +0000563 if (!_slang_write_uniform (pro, location, count, value, GL_INT_VEC2))
564 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform2ivARB");
Michal Krol6324f732005-01-13 14:12:50 +0000565 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000566}
567
Michal Krol9ac96052006-02-27 14:41:41 +0000568GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000569_mesa_Uniform3ivARB (GLint location, GLsizei count, const GLint *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000570{
571 GET_CURRENT_CONTEXT(ctx);
Michal Krol8af48fc2006-03-14 11:23:16 +0000572 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform3ivARB");
573
574 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000575
Michal Krol9ac96052006-02-27 14:41:41 +0000576 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000577 {
Michal Krol9ac96052006-02-27 14:41:41 +0000578 if (!_slang_write_uniform (pro, location, count, value, GL_INT_VEC3))
579 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform3ivARB");
Michal Krol6324f732005-01-13 14:12:50 +0000580 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000581}
582
Michal Krol9ac96052006-02-27 14:41:41 +0000583GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000584_mesa_Uniform4ivARB (GLint location, GLsizei count, const GLint *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000585{
586 GET_CURRENT_CONTEXT(ctx);
Michal Krol8af48fc2006-03-14 11:23:16 +0000587 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform4ivARB");
588
589 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000590
Michal Krol9ac96052006-02-27 14:41:41 +0000591 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000592 {
Michal Krol9ac96052006-02-27 14:41:41 +0000593 if (!_slang_write_uniform (pro, location, count, value, GL_INT_VEC4))
594 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform4ivARB");
Michal Krol6324f732005-01-13 14:12:50 +0000595 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000596}
597
Michal Krol9ac96052006-02-27 14:41:41 +0000598GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000599_mesa_UniformMatrix2fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000600{
601 GET_CURRENT_CONTEXT(ctx);
Michal Krol8af48fc2006-03-14 11:23:16 +0000602 GET_CURRENT_LINKED_PROGRAM(pro, "glUniformMatrix2fvARB");
603
604 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000605
Michal Krol9ac96052006-02-27 14:41:41 +0000606 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000607 {
Michal Krol9ac96052006-02-27 14:41:41 +0000608 if (transpose)
609 {
610 GLfloat *trans, *pt;
611 const GLfloat *pv;
612
613 trans = (GLfloat *) _mesa_malloc (count * 4 * sizeof (GLfloat));
614 if (trans == NULL)
615 {
616 _mesa_error (ctx, GL_OUT_OF_MEMORY, "glUniformMatrix2fvARB");
617 return;
618 }
619 for (pt = trans, pv = value; pt != trans + count * 4; pt += 4, pv += 4)
620 {
621 pt[0] = pv[0];
622 pt[1] = pv[2];
623 pt[2] = pv[1];
624 pt[3] = pv[3];
625 }
626 if (!_slang_write_uniform (pro, location, count, trans, GL_FLOAT_MAT2))
627 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniformMatrix2fvARB");
628 _mesa_free (trans);
629 }
630 else
631 {
632 if (!_slang_write_uniform (pro, location, count, value, GL_FLOAT_MAT2))
633 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniformMatrix2fvARB");
634 }
Michal Krol6324f732005-01-13 14:12:50 +0000635 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000636}
637
Michal Krol9ac96052006-02-27 14:41:41 +0000638GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000639_mesa_UniformMatrix3fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000640{
641 GET_CURRENT_CONTEXT(ctx);
Michal Krol8af48fc2006-03-14 11:23:16 +0000642 GET_CURRENT_LINKED_PROGRAM(pro, "glUniformMatrix3fvARB");
643
644 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000645
Michal Krol9ac96052006-02-27 14:41:41 +0000646 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000647 {
Michal Krol9ac96052006-02-27 14:41:41 +0000648 if (transpose)
649 {
650 GLfloat *trans, *pt;
651 const GLfloat *pv;
652
653 trans = (GLfloat *) _mesa_malloc (count * 9 * sizeof (GLfloat));
654 if (trans == NULL)
655 {
656 _mesa_error (ctx, GL_OUT_OF_MEMORY, "glUniformMatrix3fvARB");
657 return;
658 }
659 for (pt = trans, pv = value; pt != trans + count * 9; pt += 9, pv += 9)
660 {
661 pt[0] = pv[0];
662 pt[1] = pv[3];
663 pt[2] = pv[6];
664 pt[3] = pv[1];
665 pt[4] = pv[4];
666 pt[5] = pv[7];
667 pt[6] = pv[2];
668 pt[7] = pv[5];
669 pt[8] = pv[8];
670 }
671 if (!_slang_write_uniform (pro, location, count, trans, GL_FLOAT_MAT3))
672 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniformMatrix3fvARB");
673 _mesa_free (trans);
674 }
675 else
676 {
677 if (!_slang_write_uniform (pro, location, count, value, GL_FLOAT_MAT3))
678 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniformMatrix3fvARB");
679 }
Michal Krol6324f732005-01-13 14:12:50 +0000680 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000681}
682
Michal Krol9ac96052006-02-27 14:41:41 +0000683GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000684_mesa_UniformMatrix4fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000685{
686 GET_CURRENT_CONTEXT(ctx);
Michal Krol8af48fc2006-03-14 11:23:16 +0000687 GET_CURRENT_LINKED_PROGRAM(pro, "glUniformMatrix4fvARB");
688
689 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000690
Michal Krol9ac96052006-02-27 14:41:41 +0000691 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000692 {
Michal Krol9ac96052006-02-27 14:41:41 +0000693 if (transpose)
694 {
695 GLfloat *trans, *pt;
696 const GLfloat *pv;
697
698 trans = (GLfloat *) _mesa_malloc (count * 16 * sizeof (GLfloat));
699 if (trans == NULL)
700 {
701 _mesa_error (ctx, GL_OUT_OF_MEMORY, "glUniformMatrix4fvARB");
702 return;
703 }
704 for (pt = trans, pv = value; pt != trans + count * 16; pt += 16, pv += 16)
705 {
706 _math_transposef (pt, pv);
707 }
708 if (!_slang_write_uniform (pro, location, count, trans, GL_FLOAT_MAT4))
709 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniformMatrix4fvARB");
710 _mesa_free (trans);
711 }
712 else
713 {
714 if (!_slang_write_uniform (pro, location, count, value, GL_FLOAT_MAT4))
715 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniformMatrix4fvARB");
716 }
Michal Krol6324f732005-01-13 14:12:50 +0000717 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000718}
719
720static GLboolean
721_mesa_get_object_parameter (GLhandleARB obj, GLenum pname, GLvoid *params, GLboolean *integral,
722 GLint *size)
723{
724 GET_CURRENT_CONTEXT(ctx);
Michal Krol1d7f7192005-03-25 12:12:50 +0000725 GLint *ipar = (GLint *) params;
Michal Krol1d7f7192005-03-25 12:12:50 +0000726
727 /* set default values */
728 *integral = GL_TRUE; /* indicates param type, TRUE: GLint, FALSE: GLfloat */
Michal Krol9ac96052006-02-27 14:41:41 +0000729 *size = 1; /* param array size */
Michal Krol1d7f7192005-03-25 12:12:50 +0000730
731 switch (pname)
732 {
733 case GL_OBJECT_TYPE_ARB:
Michal Krol9ac96052006-02-27 14:41:41 +0000734 case GL_OBJECT_DELETE_STATUS_ARB:
735 case GL_OBJECT_INFO_LOG_LENGTH_ARB:
736 {
737 GET_GENERIC(gen, obj, "glGetObjectParameterivARB");
738
739 if (gen == NULL)
740 return GL_FALSE;
741
742 switch (pname)
743 {
744 case GL_OBJECT_TYPE_ARB:
745 *ipar = (**gen).GetType (gen);
746 break;
747 case GL_OBJECT_DELETE_STATUS_ARB:
748 *ipar = (**gen).GetDeleteStatus (gen);
749 break;
750 case GL_OBJECT_INFO_LOG_LENGTH_ARB:
751 {
752 const GLcharARB *info = (**gen).GetInfoLog (gen);
753
754 if (info == NULL)
755 *ipar = 0;
756 else
757 *ipar = _mesa_strlen (info) + 1;
758 }
759 break;
760 }
761
762 RELEASE_GENERIC(gen);
Michal Krol1d7f7192005-03-25 12:12:50 +0000763 }
764 break;
Michal Krol9ac96052006-02-27 14:41:41 +0000765 case GL_OBJECT_SUBTYPE_ARB:
Michal Krol1d7f7192005-03-25 12:12:50 +0000766 case GL_OBJECT_COMPILE_STATUS_ARB:
Michal Krol9ac96052006-02-27 14:41:41 +0000767 case GL_OBJECT_SHADER_SOURCE_LENGTH_ARB:
768 {
769 GET_SHADER(sha, obj, "glGetObjectParameterivARB");
770
771 if (sha == NULL)
772 return GL_FALSE;
773
774 switch (pname)
775 {
776 case GL_OBJECT_SUBTYPE_ARB:
777 *ipar = (**sha).GetSubType (sha);
778 break;
779 case GL_OBJECT_COMPILE_STATUS_ARB:
780 *ipar = (**sha).GetCompileStatus (sha);
781 break;
782 case GL_OBJECT_SHADER_SOURCE_LENGTH_ARB:
783 {
784 const GLcharARB *src = (**sha).GetSource (sha);
785
786 if (src == NULL)
787 *ipar = 0;
788 else
789 *ipar = _mesa_strlen (src) + 1;
790 }
791 break;
792 }
793
794 RELEASE_SHADER(sha);
Michal Krol1d7f7192005-03-25 12:12:50 +0000795 }
796 break;
797 case GL_OBJECT_LINK_STATUS_ARB:
Michal Krol1d7f7192005-03-25 12:12:50 +0000798 case GL_OBJECT_VALIDATE_STATUS_ARB:
Michal Krol1d7f7192005-03-25 12:12:50 +0000799 case GL_OBJECT_ATTACHED_OBJECTS_ARB:
Michal Krol1d7f7192005-03-25 12:12:50 +0000800 case GL_OBJECT_ACTIVE_UNIFORMS_ARB:
Michal Krol1d7f7192005-03-25 12:12:50 +0000801 case GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB:
Michal Krol9ac96052006-02-27 14:41:41 +0000802 {
803 GET_PROGRAM(pro, obj, "glGetObjectParameterivARB");
804
805 if (pro == NULL)
806 return GL_FALSE;
807
808 switch (pname)
809 {
810 case GL_OBJECT_LINK_STATUS_ARB:
811 *ipar = (**pro).GetLinkStatus (pro);
812 break;
813 case GL_OBJECT_VALIDATE_STATUS_ARB:
814 *ipar = (**pro).GetValidateStatus (pro);
815 break;
816 case GL_OBJECT_ATTACHED_OBJECTS_ARB:
817 *ipar = (**pro)._container.GetAttachedCount ((I_CONTAINER) pro);
818 break;
819 case GL_OBJECT_ACTIVE_UNIFORMS_ARB:
820 *ipar = _slang_get_active_uniform_count (pro);
821 break;
822 case GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB:
823 *ipar = _slang_get_active_uniform_max_length (pro);
824 break;
825 }
826
827 RELEASE_PROGRAM(pro);
Michal Krol1d7f7192005-03-25 12:12:50 +0000828 }
829 break;
830 default:
831 _mesa_error (ctx, GL_INVALID_ENUM, "glGetObjectParameterivARB");
Michal Krol9ac96052006-02-27 14:41:41 +0000832 return GL_FALSE;
Michal Krol1d7f7192005-03-25 12:12:50 +0000833 }
834
Michal Krol9ac96052006-02-27 14:41:41 +0000835 return GL_TRUE;
Michal Krol1d7f7192005-03-25 12:12:50 +0000836}
837
Michal Krol9ac96052006-02-27 14:41:41 +0000838GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000839_mesa_GetObjectParameterfvARB (GLhandleARB obj, GLenum pname, GLfloat *params)
Michal Krol1d7f7192005-03-25 12:12:50 +0000840{
841 GLboolean integral;
Michal Krol9ac96052006-02-27 14:41:41 +0000842 GLint size;
Michal Krol1d7f7192005-03-25 12:12:50 +0000843
844 assert (sizeof (GLfloat) == sizeof (GLint));
845
Michal Krol9ac96052006-02-27 14:41:41 +0000846 if (_mesa_get_object_parameter (obj, pname, (GLvoid *) params, &integral, &size))
847 if (integral)
848 {
849 GLint i;
850
Michal Krol1d7f7192005-03-25 12:12:50 +0000851 for (i = 0; i < size; i++)
852 params[i] = (GLfloat) ((GLint *) params)[i];
Michal Krol9ac96052006-02-27 14:41:41 +0000853 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000854}
855
Michal Krol9ac96052006-02-27 14:41:41 +0000856GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000857_mesa_GetObjectParameterivARB (GLhandleARB obj, GLenum pname, GLint *params)
Michal Krol1d7f7192005-03-25 12:12:50 +0000858{
859 GLboolean integral;
Michal Krol9ac96052006-02-27 14:41:41 +0000860 GLint size;
Michal Krol1d7f7192005-03-25 12:12:50 +0000861
862 assert (sizeof (GLfloat) == sizeof (GLint));
863
Michal Krol9ac96052006-02-27 14:41:41 +0000864 if (_mesa_get_object_parameter (obj, pname, (GLvoid *) params, &integral, &size))
865 if (!integral)
866 {
867 GLint i;
868
Michal Krol1d7f7192005-03-25 12:12:50 +0000869 for (i = 0; i < size; i++)
870 params[i] = (GLint) ((GLfloat *) params)[i];
Michal Krol9ac96052006-02-27 14:41:41 +0000871 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000872}
873
Michal Krol9ac96052006-02-27 14:41:41 +0000874static GLvoid
Michal Krol1d7f7192005-03-25 12:12:50 +0000875_mesa_get_string (const GLcharARB *src, GLsizei maxLength, GLsizei *length, GLcharARB *str)
876{
877 GLsizei len;
878
Michal Krol9ac96052006-02-27 14:41:41 +0000879 if (maxLength == 0)
880 {
881 if (length != NULL)
882 *length = 0;
883 return;
884 }
885
Michal Krol1d7f7192005-03-25 12:12:50 +0000886 if (src == NULL)
887 src = "";
888
889 len = _mesa_strlen (src);
Michal Krol9ac96052006-02-27 14:41:41 +0000890 if (len >= maxLength)
891 len = maxLength - 1;
Michal Krol1d7f7192005-03-25 12:12:50 +0000892
893 _mesa_memcpy (str, src, len * sizeof (GLcharARB));
Michal Krol9ac96052006-02-27 14:41:41 +0000894 str[len] = '\0';
Michal Krol1d7f7192005-03-25 12:12:50 +0000895 if (length != NULL)
Michal Krol6324f732005-01-13 14:12:50 +0000896 *length = len;
Michal Krolc1fe4692004-10-27 17:09:10 +0000897}
898
Michal Krol9ac96052006-02-27 14:41:41 +0000899GLvoid GLAPIENTRY
Michal Krol1d7f7192005-03-25 12:12:50 +0000900_mesa_GetInfoLogARB (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog)
901{
902 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000903 GET_GENERIC(gen, obj, "glGetInfoLogARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000904
Michal Krol9ac96052006-02-27 14:41:41 +0000905 if (gen != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000906 {
Michal Krol9ac96052006-02-27 14:41:41 +0000907 _mesa_get_string ((**gen).GetInfoLog (gen), maxLength, length, infoLog);
908 RELEASE_GENERIC(gen);
Michal Krol1d7f7192005-03-25 12:12:50 +0000909 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000910}
911
Michal Krol9ac96052006-02-27 14:41:41 +0000912GLvoid GLAPIENTRY
913_mesa_GetAttachedObjectsARB (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count,
914 GLhandleARB *obj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000915{
916 GET_CURRENT_CONTEXT(ctx);
Michal Krol1d7f7192005-03-25 12:12:50 +0000917 GLsizei cnt, i;
Michal Krol9ac96052006-02-27 14:41:41 +0000918 GET_CONTAINER(con, containerObj, "glGetAttachedObjectsARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000919
Michal Krol9ac96052006-02-27 14:41:41 +0000920 if (con != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000921 {
Michal Krol9ac96052006-02-27 14:41:41 +0000922 cnt = (**con).GetAttachedCount (con);
923 if (cnt > maxCount)
924 cnt = maxCount;
925 if (count != NULL)
926 *count = cnt;
927
928 for (i = 0; i < cnt; i++)
929 {
930 I_GENERIC x = (**con).GetAttached (con, i);
931 obj[i] = (**x).GetName (x);
932 RELEASE_GENERIC(x);
933 }
934 RELEASE_CONTAINER(con);
Michal Krol1d7f7192005-03-25 12:12:50 +0000935 }
Michal Krol9ac96052006-02-27 14:41:41 +0000936}
Michal Krolc1fe4692004-10-27 17:09:10 +0000937
938GLint GLAPIENTRY
939_mesa_GetUniformLocationARB (GLhandleARB programObj, const GLcharARB *name)
Michal Krol1d7f7192005-03-25 12:12:50 +0000940{
Michal Krol9ac96052006-02-27 14:41:41 +0000941 GET_CURRENT_CONTEXT(ctx);
Michal Krol1d7f7192005-03-25 12:12:50 +0000942 GLint loc = -1;
Michal Krol9ac96052006-02-27 14:41:41 +0000943 GET_LINKED_PROGRAM(pro, programObj, "glGetUniformLocationARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000944
Michal Krol9ac96052006-02-27 14:41:41 +0000945 if (pro != NULL)
946 {
947 if (name != NULL && (name[0] != 'g' || name[1] != 'l' || name[2] != '_'))
948 loc = _slang_get_uniform_location (pro, name);
949 RELEASE_PROGRAM(pro);
950 }
Michal Krol6324f732005-01-13 14:12:50 +0000951 return loc;
Michal Krolc1fe4692004-10-27 17:09:10 +0000952}
953
Michal Krol9ac96052006-02-27 14:41:41 +0000954GLvoid GLAPIENTRY
955_mesa_GetActiveUniformARB (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length,
956 GLint *size, GLenum *type, GLcharARB *name)
Michal Krol1d7f7192005-03-25 12:12:50 +0000957{
958 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000959 GET_PROGRAM(pro, programObj, "glGetActiveUniformARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000960
Michal Krol9ac96052006-02-27 14:41:41 +0000961 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000962 {
Michal Krol9ac96052006-02-27 14:41:41 +0000963 if (index < _slang_get_active_uniform_count (pro))
964 _slang_get_active_uniform (pro, index, maxLength, length, size, type, name);
965 else
966 _mesa_error (ctx, GL_INVALID_VALUE, "glGetActiveUniformARB");
967 RELEASE_PROGRAM(pro);
Michal Krol1d7f7192005-03-25 12:12:50 +0000968 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000969}
970
Michal Krol9ac96052006-02-27 14:41:41 +0000971GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000972_mesa_GetUniformfvARB (GLhandleARB programObj, GLint location, GLfloat *params)
Michal Krol1d7f7192005-03-25 12:12:50 +0000973{
974 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000975 GET_LINKED_PROGRAM(pro, programObj, "glGetUniformfvARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000976
Michal Krol9ac96052006-02-27 14:41:41 +0000977 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000978 {
Michal Krol9ac96052006-02-27 14:41:41 +0000979 /* TODO */
980 RELEASE_PROGRAM(pro);
Michal Krol1d7f7192005-03-25 12:12:50 +0000981 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000982}
983
Michal Krol9ac96052006-02-27 14:41:41 +0000984GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000985_mesa_GetUniformivARB (GLhandleARB programObj, GLint location, GLint *params)
Michal Krol1d7f7192005-03-25 12:12:50 +0000986{
987 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000988 GET_LINKED_PROGRAM(pro, programObj, "glGetUniformivARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000989
Michal Krol9ac96052006-02-27 14:41:41 +0000990 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000991 {
Michal Krol9ac96052006-02-27 14:41:41 +0000992 /* TODO */
993 RELEASE_PROGRAM(pro);
Michal Krol1d7f7192005-03-25 12:12:50 +0000994 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000995}
996
Michal Krol9ac96052006-02-27 14:41:41 +0000997GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000998_mesa_GetShaderSourceARB (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source)
Michal Krol1d7f7192005-03-25 12:12:50 +0000999{
1000 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +00001001 GET_SHADER(sha, obj, "glGetShaderSourceARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001002
Michal Krol9ac96052006-02-27 14:41:41 +00001003 if (sha != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +00001004 {
Michal Krol9ac96052006-02-27 14:41:41 +00001005 _mesa_get_string ((**sha).GetSource (sha), maxLength, length, source);
1006 RELEASE_SHADER(sha);
Michal Krol1d7f7192005-03-25 12:12:50 +00001007 }
Michal Krolc1fe4692004-10-27 17:09:10 +00001008}
1009
1010/* GL_ARB_vertex_shader */
1011
Michal Krol9ac96052006-02-27 14:41:41 +00001012GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +00001013_mesa_BindAttribLocationARB (GLhandleARB programObj, GLuint index, const GLcharARB *name)
Michal Krol1d7f7192005-03-25 12:12:50 +00001014{
1015 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +00001016 GET_PROGRAM(pro, programObj, "glBindAttribLocationARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001017
Michal Krol9ac96052006-02-27 14:41:41 +00001018 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +00001019 {
Michal Krol9ac96052006-02-27 14:41:41 +00001020 if (name != NULL && (name[0] != 'g' || name[1] != 'l' || name[2] != '_'))
1021 {
1022 /* TODO */
1023 }
1024 RELEASE_PROGRAM(pro);
Michal Krol1d7f7192005-03-25 12:12:50 +00001025 }
Michal Krolc1fe4692004-10-27 17:09:10 +00001026}
1027
Michal Krol9ac96052006-02-27 14:41:41 +00001028GLvoid GLAPIENTRY
1029_mesa_GetActiveAttribARB (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length,
1030 GLint *size, GLenum *type, GLcharARB *name)
Michal Krol1d7f7192005-03-25 12:12:50 +00001031{
1032 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +00001033 GET_PROGRAM(pro, programObj, "glGetActiveAttribARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001034
Michal Krol9ac96052006-02-27 14:41:41 +00001035 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +00001036 {
Michal Krol9ac96052006-02-27 14:41:41 +00001037 /* TODO */
1038 RELEASE_PROGRAM(pro);
Michal Krol1d7f7192005-03-25 12:12:50 +00001039 }
Michal Krolc1fe4692004-10-27 17:09:10 +00001040}
1041
1042GLint GLAPIENTRY
1043_mesa_GetAttribLocationARB (GLhandleARB programObj, const GLcharARB *name)
Michal Krol1d7f7192005-03-25 12:12:50 +00001044{
1045 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +00001046 GLint loc = -1;
1047 GET_PROGRAM(pro, programObj, "glGetAttribLocationARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001048
Michal Krol9ac96052006-02-27 14:41:41 +00001049 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +00001050 {
Michal Krol9ac96052006-02-27 14:41:41 +00001051 if (name != NULL && (name[0] != 'g' || name[1] != 'l' || name[2] != '_'))
1052 {
1053 /* TODO */
1054 }
1055 RELEASE_PROGRAM(pro);
Michal Krol1d7f7192005-03-25 12:12:50 +00001056 }
Michal Krol6324f732005-01-13 14:12:50 +00001057 return loc;
Michal Krolc1fe4692004-10-27 17:09:10 +00001058}
1059
Michal Krol9ac96052006-02-27 14:41:41 +00001060GLvoid
Michal Krol6324f732005-01-13 14:12:50 +00001061_mesa_init_shaderobjects (GLcontext *ctx)
Michal Krol1d7f7192005-03-25 12:12:50 +00001062{
Michal Krol44e9ccc2006-02-13 11:31:16 +00001063 ctx->ShaderObjects.CurrentProgram = NULL;
Michal Krol1d7f7192005-03-25 12:12:50 +00001064
1065 _mesa_init_shaderobjects_3dlabs (ctx);
Michal Krolc1fe4692004-10-27 17:09:10 +00001066}
Michal Krol1d7f7192005-03-25 12:12:50 +00001067