blob: 4c4fdcfe550705d07f3f5909b45c63d20e155945 [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
346/*
347Errors TODO
348
349 The error INVALID_OPERATION is generated by the Uniform*ARB if the
350 number of values loaded results in exceeding the declared extent of a
351 uniform.
352
353 The error INVALID_OPERATION is generated by the Uniform*ARB commands if
354 the size does not match the size of the uniform declared in the shader.
355
356 The error INVALID_OPERATION is generated by the Uniform*ARB commands if
357 the type does not match the type of the uniform declared in the shader,
358 if the uniform is not of type Boolean.
359
360 The error INVALID_OPERATION is generated by the Uniform*ARB commands if
361 <location> does not exist for the program object currently in use.
362
363 The error INVALID_OPERATION is generated if a uniform command other than
364 Uniform1i{v}ARB is used to load a sampler value.
365
366
Michal Krol9ac96052006-02-27 14:41:41 +0000367*/
368
369GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000370_mesa_Uniform1fARB (GLint location, GLfloat v0)
Michal Krol9ac96052006-02-27 14:41:41 +0000371{
372 GET_CURRENT_CONTEXT(ctx);
373 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform1fARB");
374
375 if (pro != NULL)
376 {
377 if (!_slang_write_uniform (pro, location, 1, &v0, GL_FLOAT))
378 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform1fARB");
379 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000380}
381
Michal Krol9ac96052006-02-27 14:41:41 +0000382GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000383_mesa_Uniform2fARB (GLint location, GLfloat v0, GLfloat v1)
Michal Krol1d7f7192005-03-25 12:12:50 +0000384{
385 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000386 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform2fARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000387
Michal Krol9ac96052006-02-27 14:41:41 +0000388 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000389 {
Michal Krol9ac96052006-02-27 14:41:41 +0000390 GLfloat v[2] = { v0, v1 };
391
392 if (!_slang_write_uniform (pro, location, 1, v, GL_FLOAT_VEC2))
393 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform2fARB");
Michal Krol6324f732005-01-13 14:12:50 +0000394 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000395}
396
Michal Krol9ac96052006-02-27 14:41:41 +0000397GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000398_mesa_Uniform3fARB (GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
Michal Krol1d7f7192005-03-25 12:12:50 +0000399{
400 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000401 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform3fARB");
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[3] = { v0, v1, v2 };
406
407 if (!_slang_write_uniform (pro, location, 1, v, GL_FLOAT_VEC3))
408 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform3fARB");
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_Uniform4fARB (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
Michal Krol1d7f7192005-03-25 12:12:50 +0000414{
415 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000416 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform4fARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000417
Michal Krol9ac96052006-02-27 14:41:41 +0000418 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000419 {
Michal Krol9ac96052006-02-27 14:41:41 +0000420 GLfloat v[4] = { v0, v1, v2, v3 };
421
422 if (!_slang_write_uniform (pro, location, 1, v, GL_FLOAT_VEC4))
423 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform4fARB");
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_Uniform1iARB (GLint location, GLint v0)
Michal Krol1d7f7192005-03-25 12:12:50 +0000429{
430 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000431 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform1iARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000432
Michal Krol9ac96052006-02-27 14:41:41 +0000433 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000434 {
Michal Krol9ac96052006-02-27 14:41:41 +0000435 if (!_slang_write_uniform (pro, location, 1, &v0, GL_INT))
436 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform1iARB");
Michal Krol6324f732005-01-13 14:12:50 +0000437 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000438}
439
Michal Krol9ac96052006-02-27 14:41:41 +0000440GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000441_mesa_Uniform2iARB (GLint location, GLint v0, GLint v1)
Michal Krol1d7f7192005-03-25 12:12:50 +0000442{
443 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000444 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform2iARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000445
Michal Krol9ac96052006-02-27 14:41:41 +0000446 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000447 {
Michal Krol9ac96052006-02-27 14:41:41 +0000448 GLint v[2] = { v0, v1 };
449
450 if (!_slang_write_uniform (pro, location, 1, v, GL_INT_VEC2))
451 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform2iARB");
Michal Krol6324f732005-01-13 14:12:50 +0000452 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000453}
454
Michal Krol9ac96052006-02-27 14:41:41 +0000455GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000456_mesa_Uniform3iARB (GLint location, GLint v0, GLint v1, GLint v2)
Michal Krol1d7f7192005-03-25 12:12:50 +0000457{
458 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000459 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform3iARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000460
Michal Krol9ac96052006-02-27 14:41:41 +0000461 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000462 {
Michal Krol9ac96052006-02-27 14:41:41 +0000463 GLint v[3] = { v0, v1, v2 };
464
465 if (!_slang_write_uniform (pro, location, 1, v, GL_INT_VEC3))
466 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform3iARB");
Michal Krol6324f732005-01-13 14:12:50 +0000467 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000468}
469
Michal Krol9ac96052006-02-27 14:41:41 +0000470GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000471_mesa_Uniform4iARB (GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
Michal Krol1d7f7192005-03-25 12:12:50 +0000472{
473 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000474 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform4iARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000475
Michal Krol9ac96052006-02-27 14:41:41 +0000476 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000477 {
Michal Krol9ac96052006-02-27 14:41:41 +0000478 GLint v[4] = { v0, v1, v2, v3 };
479
480 if (!_slang_write_uniform (pro, location, 1, v, GL_INT_VEC4))
481 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform4iARB");
Michal Krol6324f732005-01-13 14:12:50 +0000482 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000483}
484
Michal Krol9ac96052006-02-27 14:41:41 +0000485GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000486_mesa_Uniform1fvARB (GLint location, GLsizei count, const GLfloat *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000487{
488 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000489 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform1fvARB");
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 {
Michal Krol9ac96052006-02-27 14:41:41 +0000493 if (!_slang_write_uniform (pro, location, count, value, GL_FLOAT))
494 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform1fvARB");
Michal Krol6324f732005-01-13 14:12:50 +0000495 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000496}
497
Michal Krol9ac96052006-02-27 14:41:41 +0000498GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000499_mesa_Uniform2fvARB (GLint location, GLsizei count, const GLfloat *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000500{
501 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000502 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform2fvARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000503
Michal Krol9ac96052006-02-27 14:41:41 +0000504 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000505 {
Michal Krol9ac96052006-02-27 14:41:41 +0000506 if (!_slang_write_uniform (pro, location, count, value, GL_FLOAT_VEC2))
507 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform2fvARB");
Michal Krol6324f732005-01-13 14:12:50 +0000508 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000509}
510
Michal Krol9ac96052006-02-27 14:41:41 +0000511GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000512_mesa_Uniform3fvARB (GLint location, GLsizei count, const GLfloat *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000513{
514 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000515 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform3fvARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000516
Michal Krol9ac96052006-02-27 14:41:41 +0000517 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000518 {
Michal Krol9ac96052006-02-27 14:41:41 +0000519 if (!_slang_write_uniform (pro, location, count, value, GL_FLOAT_VEC3))
520 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform3fvARB");
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_Uniform4fvARB (GLint location, GLsizei count, const GLfloat *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000526{
Michal Krol9ac96052006-02-27 14:41:41 +0000527 GET_CURRENT_CONTEXT(ctx);
528 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform4fvARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000529
Michal Krol9ac96052006-02-27 14:41:41 +0000530 if (pro != NULL)
531 {
532 if (!_slang_write_uniform (pro, location, count, value, GL_FLOAT_VEC4))
533 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform4fvARB");
534 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000535}
536
Michal Krol9ac96052006-02-27 14:41:41 +0000537GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000538_mesa_Uniform1ivARB (GLint location, GLsizei count, const GLint *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000539{
540 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000541 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform1ivARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000542
Michal Krol9ac96052006-02-27 14:41:41 +0000543 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000544 {
Michal Krol9ac96052006-02-27 14:41:41 +0000545 if (!_slang_write_uniform (pro, location, count, value, GL_INT))
546 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform1ivARB");
Michal Krol6324f732005-01-13 14:12:50 +0000547 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000548}
549
Michal Krol9ac96052006-02-27 14:41:41 +0000550GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000551_mesa_Uniform2ivARB (GLint location, GLsizei count, const GLint *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000552{
553 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000554 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform2ivARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000555
Michal Krol9ac96052006-02-27 14:41:41 +0000556 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000557 {
Michal Krol9ac96052006-02-27 14:41:41 +0000558 if (!_slang_write_uniform (pro, location, count, value, GL_INT_VEC2))
559 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform2ivARB");
Michal Krol6324f732005-01-13 14:12:50 +0000560 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000561}
562
Michal Krol9ac96052006-02-27 14:41:41 +0000563GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000564_mesa_Uniform3ivARB (GLint location, GLsizei count, const GLint *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000565{
566 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000567 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform3ivARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000568
Michal Krol9ac96052006-02-27 14:41:41 +0000569 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000570 {
Michal Krol9ac96052006-02-27 14:41:41 +0000571 if (!_slang_write_uniform (pro, location, count, value, GL_INT_VEC3))
572 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform3ivARB");
Michal Krol6324f732005-01-13 14:12:50 +0000573 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000574}
575
Michal Krol9ac96052006-02-27 14:41:41 +0000576GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000577_mesa_Uniform4ivARB (GLint location, GLsizei count, const GLint *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000578{
579 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000580 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform4ivARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000581
Michal Krol9ac96052006-02-27 14:41:41 +0000582 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000583 {
Michal Krol9ac96052006-02-27 14:41:41 +0000584 if (!_slang_write_uniform (pro, location, count, value, GL_INT_VEC4))
585 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform4ivARB");
Michal Krol6324f732005-01-13 14:12:50 +0000586 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000587}
588
Michal Krol9ac96052006-02-27 14:41:41 +0000589GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000590_mesa_UniformMatrix2fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000591{
592 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000593 GET_CURRENT_LINKED_PROGRAM(pro, "glUniformMatrix2fvARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000594
Michal Krol9ac96052006-02-27 14:41:41 +0000595 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000596 {
Michal Krol9ac96052006-02-27 14:41:41 +0000597 if (transpose)
598 {
599 GLfloat *trans, *pt;
600 const GLfloat *pv;
601
602 trans = (GLfloat *) _mesa_malloc (count * 4 * sizeof (GLfloat));
603 if (trans == NULL)
604 {
605 _mesa_error (ctx, GL_OUT_OF_MEMORY, "glUniformMatrix2fvARB");
606 return;
607 }
608 for (pt = trans, pv = value; pt != trans + count * 4; pt += 4, pv += 4)
609 {
610 pt[0] = pv[0];
611 pt[1] = pv[2];
612 pt[2] = pv[1];
613 pt[3] = pv[3];
614 }
615 if (!_slang_write_uniform (pro, location, count, trans, GL_FLOAT_MAT2))
616 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniformMatrix2fvARB");
617 _mesa_free (trans);
618 }
619 else
620 {
621 if (!_slang_write_uniform (pro, location, count, value, GL_FLOAT_MAT2))
622 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniformMatrix2fvARB");
623 }
Michal Krol6324f732005-01-13 14:12:50 +0000624 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000625}
626
Michal Krol9ac96052006-02-27 14:41:41 +0000627GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000628_mesa_UniformMatrix3fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000629{
630 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000631 GET_CURRENT_LINKED_PROGRAM(pro, "glUniformMatrix3fvARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000632
Michal Krol9ac96052006-02-27 14:41:41 +0000633 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000634 {
Michal Krol9ac96052006-02-27 14:41:41 +0000635 if (transpose)
636 {
637 GLfloat *trans, *pt;
638 const GLfloat *pv;
639
640 trans = (GLfloat *) _mesa_malloc (count * 9 * sizeof (GLfloat));
641 if (trans == NULL)
642 {
643 _mesa_error (ctx, GL_OUT_OF_MEMORY, "glUniformMatrix3fvARB");
644 return;
645 }
646 for (pt = trans, pv = value; pt != trans + count * 9; pt += 9, pv += 9)
647 {
648 pt[0] = pv[0];
649 pt[1] = pv[3];
650 pt[2] = pv[6];
651 pt[3] = pv[1];
652 pt[4] = pv[4];
653 pt[5] = pv[7];
654 pt[6] = pv[2];
655 pt[7] = pv[5];
656 pt[8] = pv[8];
657 }
658 if (!_slang_write_uniform (pro, location, count, trans, GL_FLOAT_MAT3))
659 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniformMatrix3fvARB");
660 _mesa_free (trans);
661 }
662 else
663 {
664 if (!_slang_write_uniform (pro, location, count, value, GL_FLOAT_MAT3))
665 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniformMatrix3fvARB");
666 }
Michal Krol6324f732005-01-13 14:12:50 +0000667 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000668}
669
Michal Krol9ac96052006-02-27 14:41:41 +0000670GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000671_mesa_UniformMatrix4fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000672{
673 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000674 GET_CURRENT_LINKED_PROGRAM(pro, "glUniformMatrix4fvARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000675
Michal Krol9ac96052006-02-27 14:41:41 +0000676 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000677 {
Michal Krol9ac96052006-02-27 14:41:41 +0000678 if (transpose)
679 {
680 GLfloat *trans, *pt;
681 const GLfloat *pv;
682
683 trans = (GLfloat *) _mesa_malloc (count * 16 * sizeof (GLfloat));
684 if (trans == NULL)
685 {
686 _mesa_error (ctx, GL_OUT_OF_MEMORY, "glUniformMatrix4fvARB");
687 return;
688 }
689 for (pt = trans, pv = value; pt != trans + count * 16; pt += 16, pv += 16)
690 {
691 _math_transposef (pt, pv);
692 }
693 if (!_slang_write_uniform (pro, location, count, trans, GL_FLOAT_MAT4))
694 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniformMatrix4fvARB");
695 _mesa_free (trans);
696 }
697 else
698 {
699 if (!_slang_write_uniform (pro, location, count, value, GL_FLOAT_MAT4))
700 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniformMatrix4fvARB");
701 }
Michal Krol6324f732005-01-13 14:12:50 +0000702 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000703}
704
705static GLboolean
706_mesa_get_object_parameter (GLhandleARB obj, GLenum pname, GLvoid *params, GLboolean *integral,
707 GLint *size)
708{
709 GET_CURRENT_CONTEXT(ctx);
Michal Krol1d7f7192005-03-25 12:12:50 +0000710 GLint *ipar = (GLint *) params;
Michal Krol1d7f7192005-03-25 12:12:50 +0000711
712 /* set default values */
713 *integral = GL_TRUE; /* indicates param type, TRUE: GLint, FALSE: GLfloat */
Michal Krol9ac96052006-02-27 14:41:41 +0000714 *size = 1; /* param array size */
Michal Krol1d7f7192005-03-25 12:12:50 +0000715
716 switch (pname)
717 {
718 case GL_OBJECT_TYPE_ARB:
Michal Krol9ac96052006-02-27 14:41:41 +0000719 case GL_OBJECT_DELETE_STATUS_ARB:
720 case GL_OBJECT_INFO_LOG_LENGTH_ARB:
721 {
722 GET_GENERIC(gen, obj, "glGetObjectParameterivARB");
723
724 if (gen == NULL)
725 return GL_FALSE;
726
727 switch (pname)
728 {
729 case GL_OBJECT_TYPE_ARB:
730 *ipar = (**gen).GetType (gen);
731 break;
732 case GL_OBJECT_DELETE_STATUS_ARB:
733 *ipar = (**gen).GetDeleteStatus (gen);
734 break;
735 case GL_OBJECT_INFO_LOG_LENGTH_ARB:
736 {
737 const GLcharARB *info = (**gen).GetInfoLog (gen);
738
739 if (info == NULL)
740 *ipar = 0;
741 else
742 *ipar = _mesa_strlen (info) + 1;
743 }
744 break;
745 }
746
747 RELEASE_GENERIC(gen);
Michal Krol1d7f7192005-03-25 12:12:50 +0000748 }
749 break;
Michal Krol9ac96052006-02-27 14:41:41 +0000750 case GL_OBJECT_SUBTYPE_ARB:
Michal Krol1d7f7192005-03-25 12:12:50 +0000751 case GL_OBJECT_COMPILE_STATUS_ARB:
Michal Krol9ac96052006-02-27 14:41:41 +0000752 case GL_OBJECT_SHADER_SOURCE_LENGTH_ARB:
753 {
754 GET_SHADER(sha, obj, "glGetObjectParameterivARB");
755
756 if (sha == NULL)
757 return GL_FALSE;
758
759 switch (pname)
760 {
761 case GL_OBJECT_SUBTYPE_ARB:
762 *ipar = (**sha).GetSubType (sha);
763 break;
764 case GL_OBJECT_COMPILE_STATUS_ARB:
765 *ipar = (**sha).GetCompileStatus (sha);
766 break;
767 case GL_OBJECT_SHADER_SOURCE_LENGTH_ARB:
768 {
769 const GLcharARB *src = (**sha).GetSource (sha);
770
771 if (src == NULL)
772 *ipar = 0;
773 else
774 *ipar = _mesa_strlen (src) + 1;
775 }
776 break;
777 }
778
779 RELEASE_SHADER(sha);
Michal Krol1d7f7192005-03-25 12:12:50 +0000780 }
781 break;
782 case GL_OBJECT_LINK_STATUS_ARB:
Michal Krol1d7f7192005-03-25 12:12:50 +0000783 case GL_OBJECT_VALIDATE_STATUS_ARB:
Michal Krol1d7f7192005-03-25 12:12:50 +0000784 case GL_OBJECT_ATTACHED_OBJECTS_ARB:
Michal Krol1d7f7192005-03-25 12:12:50 +0000785 case GL_OBJECT_ACTIVE_UNIFORMS_ARB:
Michal Krol1d7f7192005-03-25 12:12:50 +0000786 case GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB:
Michal Krol9ac96052006-02-27 14:41:41 +0000787 {
788 GET_PROGRAM(pro, obj, "glGetObjectParameterivARB");
789
790 if (pro == NULL)
791 return GL_FALSE;
792
793 switch (pname)
794 {
795 case GL_OBJECT_LINK_STATUS_ARB:
796 *ipar = (**pro).GetLinkStatus (pro);
797 break;
798 case GL_OBJECT_VALIDATE_STATUS_ARB:
799 *ipar = (**pro).GetValidateStatus (pro);
800 break;
801 case GL_OBJECT_ATTACHED_OBJECTS_ARB:
802 *ipar = (**pro)._container.GetAttachedCount ((I_CONTAINER) pro);
803 break;
804 case GL_OBJECT_ACTIVE_UNIFORMS_ARB:
805 *ipar = _slang_get_active_uniform_count (pro);
806 break;
807 case GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB:
808 *ipar = _slang_get_active_uniform_max_length (pro);
809 break;
810 }
811
812 RELEASE_PROGRAM(pro);
Michal Krol1d7f7192005-03-25 12:12:50 +0000813 }
814 break;
815 default:
816 _mesa_error (ctx, GL_INVALID_ENUM, "glGetObjectParameterivARB");
Michal Krol9ac96052006-02-27 14:41:41 +0000817 return GL_FALSE;
Michal Krol1d7f7192005-03-25 12:12:50 +0000818 }
819
Michal Krol9ac96052006-02-27 14:41:41 +0000820 return GL_TRUE;
Michal Krol1d7f7192005-03-25 12:12:50 +0000821}
822
Michal Krol9ac96052006-02-27 14:41:41 +0000823GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000824_mesa_GetObjectParameterfvARB (GLhandleARB obj, GLenum pname, GLfloat *params)
Michal Krol1d7f7192005-03-25 12:12:50 +0000825{
826 GLboolean integral;
Michal Krol9ac96052006-02-27 14:41:41 +0000827 GLint size;
Michal Krol1d7f7192005-03-25 12:12:50 +0000828
829 assert (sizeof (GLfloat) == sizeof (GLint));
830
Michal Krol9ac96052006-02-27 14:41:41 +0000831 if (_mesa_get_object_parameter (obj, pname, (GLvoid *) params, &integral, &size))
832 if (integral)
833 {
834 GLint i;
835
Michal Krol1d7f7192005-03-25 12:12:50 +0000836 for (i = 0; i < size; i++)
837 params[i] = (GLfloat) ((GLint *) params)[i];
Michal Krol9ac96052006-02-27 14:41:41 +0000838 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000839}
840
Michal Krol9ac96052006-02-27 14:41:41 +0000841GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000842_mesa_GetObjectParameterivARB (GLhandleARB obj, GLenum pname, GLint *params)
Michal Krol1d7f7192005-03-25 12:12:50 +0000843{
844 GLboolean integral;
Michal Krol9ac96052006-02-27 14:41:41 +0000845 GLint size;
Michal Krol1d7f7192005-03-25 12:12:50 +0000846
847 assert (sizeof (GLfloat) == sizeof (GLint));
848
Michal Krol9ac96052006-02-27 14:41:41 +0000849 if (_mesa_get_object_parameter (obj, pname, (GLvoid *) params, &integral, &size))
850 if (!integral)
851 {
852 GLint i;
853
Michal Krol1d7f7192005-03-25 12:12:50 +0000854 for (i = 0; i < size; i++)
855 params[i] = (GLint) ((GLfloat *) params)[i];
Michal Krol9ac96052006-02-27 14:41:41 +0000856 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000857}
858
Michal Krol9ac96052006-02-27 14:41:41 +0000859static GLvoid
Michal Krol1d7f7192005-03-25 12:12:50 +0000860_mesa_get_string (const GLcharARB *src, GLsizei maxLength, GLsizei *length, GLcharARB *str)
861{
862 GLsizei len;
863
Michal Krol9ac96052006-02-27 14:41:41 +0000864 if (maxLength == 0)
865 {
866 if (length != NULL)
867 *length = 0;
868 return;
869 }
870
Michal Krol1d7f7192005-03-25 12:12:50 +0000871 if (src == NULL)
872 src = "";
873
874 len = _mesa_strlen (src);
Michal Krol9ac96052006-02-27 14:41:41 +0000875 if (len >= maxLength)
876 len = maxLength - 1;
Michal Krol1d7f7192005-03-25 12:12:50 +0000877
878 _mesa_memcpy (str, src, len * sizeof (GLcharARB));
Michal Krol9ac96052006-02-27 14:41:41 +0000879 str[len] = '\0';
Michal Krol1d7f7192005-03-25 12:12:50 +0000880 if (length != NULL)
Michal Krol6324f732005-01-13 14:12:50 +0000881 *length = len;
Michal Krolc1fe4692004-10-27 17:09:10 +0000882}
883
Michal Krol9ac96052006-02-27 14:41:41 +0000884GLvoid GLAPIENTRY
Michal Krol1d7f7192005-03-25 12:12:50 +0000885_mesa_GetInfoLogARB (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog)
886{
887 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000888 GET_GENERIC(gen, obj, "glGetInfoLogARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000889
Michal Krol9ac96052006-02-27 14:41:41 +0000890 if (gen != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000891 {
Michal Krol9ac96052006-02-27 14:41:41 +0000892 _mesa_get_string ((**gen).GetInfoLog (gen), maxLength, length, infoLog);
893 RELEASE_GENERIC(gen);
Michal Krol1d7f7192005-03-25 12:12:50 +0000894 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000895}
896
Michal Krol9ac96052006-02-27 14:41:41 +0000897GLvoid GLAPIENTRY
898_mesa_GetAttachedObjectsARB (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count,
899 GLhandleARB *obj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000900{
901 GET_CURRENT_CONTEXT(ctx);
Michal Krol1d7f7192005-03-25 12:12:50 +0000902 GLsizei cnt, i;
Michal Krol9ac96052006-02-27 14:41:41 +0000903 GET_CONTAINER(con, containerObj, "glGetAttachedObjectsARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000904
Michal Krol9ac96052006-02-27 14:41:41 +0000905 if (con != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000906 {
Michal Krol9ac96052006-02-27 14:41:41 +0000907 cnt = (**con).GetAttachedCount (con);
908 if (cnt > maxCount)
909 cnt = maxCount;
910 if (count != NULL)
911 *count = cnt;
912
913 for (i = 0; i < cnt; i++)
914 {
915 I_GENERIC x = (**con).GetAttached (con, i);
916 obj[i] = (**x).GetName (x);
917 RELEASE_GENERIC(x);
918 }
919 RELEASE_CONTAINER(con);
Michal Krol1d7f7192005-03-25 12:12:50 +0000920 }
Michal Krol9ac96052006-02-27 14:41:41 +0000921}
Michal Krolc1fe4692004-10-27 17:09:10 +0000922
923GLint GLAPIENTRY
924_mesa_GetUniformLocationARB (GLhandleARB programObj, const GLcharARB *name)
Michal Krol1d7f7192005-03-25 12:12:50 +0000925{
Michal Krol9ac96052006-02-27 14:41:41 +0000926 GET_CURRENT_CONTEXT(ctx);
Michal Krol1d7f7192005-03-25 12:12:50 +0000927 GLint loc = -1;
Michal Krol9ac96052006-02-27 14:41:41 +0000928 GET_LINKED_PROGRAM(pro, programObj, "glGetUniformLocationARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000929
Michal Krol9ac96052006-02-27 14:41:41 +0000930 if (pro != NULL)
931 {
932 if (name != NULL && (name[0] != 'g' || name[1] != 'l' || name[2] != '_'))
933 loc = _slang_get_uniform_location (pro, name);
934 RELEASE_PROGRAM(pro);
935 }
Michal Krol6324f732005-01-13 14:12:50 +0000936 return loc;
Michal Krolc1fe4692004-10-27 17:09:10 +0000937}
938
Michal Krol9ac96052006-02-27 14:41:41 +0000939GLvoid GLAPIENTRY
940_mesa_GetActiveUniformARB (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length,
941 GLint *size, GLenum *type, GLcharARB *name)
Michal Krol1d7f7192005-03-25 12:12:50 +0000942{
943 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000944 GET_PROGRAM(pro, programObj, "glGetActiveUniformARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000945
Michal Krol9ac96052006-02-27 14:41:41 +0000946 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000947 {
Michal Krol9ac96052006-02-27 14:41:41 +0000948 if (index < _slang_get_active_uniform_count (pro))
949 _slang_get_active_uniform (pro, index, maxLength, length, size, type, name);
950 else
951 _mesa_error (ctx, GL_INVALID_VALUE, "glGetActiveUniformARB");
952 RELEASE_PROGRAM(pro);
Michal Krol1d7f7192005-03-25 12:12:50 +0000953 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000954}
955
Michal Krol9ac96052006-02-27 14:41:41 +0000956GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000957_mesa_GetUniformfvARB (GLhandleARB programObj, GLint location, GLfloat *params)
Michal Krol1d7f7192005-03-25 12:12:50 +0000958{
959 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000960 GET_LINKED_PROGRAM(pro, programObj, "glGetUniformfvARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000961
Michal Krol9ac96052006-02-27 14:41:41 +0000962 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000963 {
Michal Krol9ac96052006-02-27 14:41:41 +0000964 /* TODO */
965 RELEASE_PROGRAM(pro);
Michal Krol1d7f7192005-03-25 12:12:50 +0000966 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000967}
968
Michal Krol9ac96052006-02-27 14:41:41 +0000969GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000970_mesa_GetUniformivARB (GLhandleARB programObj, GLint location, GLint *params)
Michal Krol1d7f7192005-03-25 12:12:50 +0000971{
972 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000973 GET_LINKED_PROGRAM(pro, programObj, "glGetUniformivARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000974
Michal Krol9ac96052006-02-27 14:41:41 +0000975 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000976 {
Michal Krol9ac96052006-02-27 14:41:41 +0000977 /* TODO */
978 RELEASE_PROGRAM(pro);
Michal Krol1d7f7192005-03-25 12:12:50 +0000979 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000980}
981
Michal Krol9ac96052006-02-27 14:41:41 +0000982GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000983_mesa_GetShaderSourceARB (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source)
Michal Krol1d7f7192005-03-25 12:12:50 +0000984{
985 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000986 GET_SHADER(sha, obj, "glGetShaderSourceARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000987
Michal Krol9ac96052006-02-27 14:41:41 +0000988 if (sha != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000989 {
Michal Krol9ac96052006-02-27 14:41:41 +0000990 _mesa_get_string ((**sha).GetSource (sha), maxLength, length, source);
991 RELEASE_SHADER(sha);
Michal Krol1d7f7192005-03-25 12:12:50 +0000992 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000993}
994
995/* GL_ARB_vertex_shader */
996
Michal Krol9ac96052006-02-27 14:41:41 +0000997GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000998_mesa_BindAttribLocationARB (GLhandleARB programObj, GLuint index, const GLcharARB *name)
Michal Krol1d7f7192005-03-25 12:12:50 +0000999{
1000 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +00001001 GET_PROGRAM(pro, programObj, "glBindAttribLocationARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001002
Michal Krol9ac96052006-02-27 14:41:41 +00001003 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +00001004 {
Michal Krol9ac96052006-02-27 14:41:41 +00001005 if (name != NULL && (name[0] != 'g' || name[1] != 'l' || name[2] != '_'))
1006 {
1007 /* TODO */
1008 }
1009 RELEASE_PROGRAM(pro);
Michal Krol1d7f7192005-03-25 12:12:50 +00001010 }
Michal Krolc1fe4692004-10-27 17:09:10 +00001011}
1012
Michal Krol9ac96052006-02-27 14:41:41 +00001013GLvoid GLAPIENTRY
1014_mesa_GetActiveAttribARB (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length,
1015 GLint *size, GLenum *type, GLcharARB *name)
Michal Krol1d7f7192005-03-25 12:12:50 +00001016{
1017 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +00001018 GET_PROGRAM(pro, programObj, "glGetActiveAttribARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001019
Michal Krol9ac96052006-02-27 14:41:41 +00001020 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +00001021 {
Michal Krol9ac96052006-02-27 14:41:41 +00001022 /* TODO */
1023 RELEASE_PROGRAM(pro);
Michal Krol1d7f7192005-03-25 12:12:50 +00001024 }
Michal Krolc1fe4692004-10-27 17:09:10 +00001025}
1026
1027GLint GLAPIENTRY
1028_mesa_GetAttribLocationARB (GLhandleARB programObj, const GLcharARB *name)
Michal Krol1d7f7192005-03-25 12:12:50 +00001029{
1030 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +00001031 GLint loc = -1;
1032 GET_PROGRAM(pro, programObj, "glGetAttribLocationARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001033
Michal Krol9ac96052006-02-27 14:41:41 +00001034 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +00001035 {
Michal Krol9ac96052006-02-27 14:41:41 +00001036 if (name != NULL && (name[0] != 'g' || name[1] != 'l' || name[2] != '_'))
1037 {
1038 /* TODO */
1039 }
1040 RELEASE_PROGRAM(pro);
Michal Krol1d7f7192005-03-25 12:12:50 +00001041 }
Michal Krol6324f732005-01-13 14:12:50 +00001042 return loc;
Michal Krolc1fe4692004-10-27 17:09:10 +00001043}
1044
Michal Krol9ac96052006-02-27 14:41:41 +00001045GLvoid
Michal Krol6324f732005-01-13 14:12:50 +00001046_mesa_init_shaderobjects (GLcontext *ctx)
Michal Krol1d7f7192005-03-25 12:12:50 +00001047{
Michal Krol44e9ccc2006-02-13 11:31:16 +00001048 ctx->ShaderObjects.CurrentProgram = NULL;
Michal Krol1d7f7192005-03-25 12:12:50 +00001049
1050 _mesa_init_shaderobjects_3dlabs (ctx);
Michal Krolc1fe4692004-10-27 17:09:10 +00001051}
Michal Krol1d7f7192005-03-25 12:12:50 +00001052