blob: 998d4e455e11256f254f042fee19ce42496b527d [file] [log] [blame]
Michal Krol1d7f7192005-03-25 12:12:50 +00001/*
2 * Mesa 3-D graphics library
Michal Krol07135702006-03-21 10:37:40 +00003 * Version: 6.5
Michal Krol1d7f7192005-03-25 12:12:50 +00004 *
Michal Krol07135702006-03-21 10:37:40 +00005 * Copyright (C) 2004-2006 Brian Paul All Rights Reserved.
Michal Krol1d7f7192005-03-25 12:12:50 +00006 *
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the "Software"),
9 * to deal in the Software without restriction, including without limitation
10 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 * and/or sell copies of the Software, and to permit persons to whom the
12 * Software is furnished to do so, subject to the following conditions:
13 *
14 * The above copyright notice and this permission notice shall be included
15 * in all copies or substantial portions of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 */
24
25/**
26 * \file shaderobjects.c
27 * ARB_shader_objects state management functions
28 * \author Michal Krol
29 */
30
Michal Krolc1fe4692004-10-27 17:09:10 +000031
32#include "glheader.h"
Michal Krol9ac96052006-02-27 14:41:41 +000033#include "context.h"
34#include "hash.h"
Michal Krol1d7f7192005-03-25 12:12:50 +000035#include "shaderobjects.h"
Michal Krol6324f732005-01-13 14:12:50 +000036#include "shaderobjects_3dlabs.h"
Michal Krol1d7f7192005-03-25 12:12:50 +000037
38
Michal Krol9ac96052006-02-27 14:41:41 +000039#define I_UNKNOWN struct gl2_unknown_intf **
40#define I_GENERIC struct gl2_generic_intf **
41#define I_CONTAINER struct gl2_container_intf **
42#define I_PROGRAM struct gl2_program_intf **
43#define I_SHADER struct gl2_shader_intf **
44
45#define RELEASE_GENERIC(x)\
46 (**x)._unknown.Release ((I_UNKNOWN) x)
47
48#define RELEASE_CONTAINER(x)\
49 (**x)._generic._unknown.Release ((I_UNKNOWN) x)
50
51#define RELEASE_PROGRAM(x)\
52 (**x)._container._generic._unknown.Release ((I_UNKNOWN) x)
53
54#define RELEASE_SHADER(x)\
55 (**x)._generic._unknown.Release ((I_UNKNOWN) x);
56
57#define _LOOKUP_HANDLE(handle, function)\
58 I_UNKNOWN unk;\
59 _glthread_LOCK_MUTEX (ctx->Shared->Mutex);\
60 unk = (I_UNKNOWN) _mesa_HashLookup (ctx->Shared->GL2Objects, handle);\
61 _glthread_UNLOCK_MUTEX (ctx->Shared->Mutex);\
62 if (unk == NULL) {\
63 _mesa_error (ctx, GL_INVALID_VALUE, function);\
64 break;\
65 }
66
67#define _QUERY_INTERFACE(x, type, uuid, function)\
68 x = (type) (**unk).QueryInterface (unk, uuid);\
69 if (x == NULL) {\
70 _mesa_error (ctx, GL_INVALID_OPERATION, function);\
71 break;\
72 }
73
74#define GET_GENERIC(x, handle, function)\
75 I_GENERIC x = NULL;\
76 do {\
77 _LOOKUP_HANDLE(handle, function);\
78 _QUERY_INTERFACE(x, I_GENERIC, UIID_GENERIC, function);\
79 } while (0)
80
81#define GET_CONTAINER(x, handle, function)\
82 I_CONTAINER x = NULL;\
83 do {\
84 _LOOKUP_HANDLE(handle, function);\
85 _QUERY_INTERFACE(x, I_CONTAINER, UIID_CONTAINER, function);\
86 } while (0)
87
88#define GET_PROGRAM(x, handle, function)\
89 I_PROGRAM x = NULL;\
90 do {\
91 _LOOKUP_HANDLE(handle, function);\
92 _QUERY_INTERFACE(x, I_PROGRAM, UIID_PROGRAM, function);\
93 } while (0)
94
95#define GET_SHADER(x, handle, function)\
96 I_SHADER x = NULL;\
97 do {\
98 _LOOKUP_HANDLE(handle, function);\
99 _QUERY_INTERFACE(x, I_SHADER, UIID_SHADER, function);\
100 } while (0)
101
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 Krol07135702006-03-21 10:37:40 +0000203 return;
204
205 if (string == NULL)
206 {
207 RELEASE_SHADER(sha);
208 _mesa_error (ctx, GL_INVALID_VALUE, "glShaderSourceARB");
209 return;
210 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000211
Michal Krol9ac96052006-02-27 14:41:41 +0000212 /*
213 * This array holds offsets of where the appropriate string ends, thus the last
214 * element will be set to the total length of the source code.
215 */
Michal Krol1d7f7192005-03-25 12:12:50 +0000216 offsets = (GLint *) _mesa_malloc (count * sizeof (GLint));
217 if (offsets == NULL)
218 {
Michal Krol9ac96052006-02-27 14:41:41 +0000219 RELEASE_SHADER(sha);
Michal Krol1d7f7192005-03-25 12:12:50 +0000220 _mesa_error (ctx, GL_OUT_OF_MEMORY, "glShaderSourceARB");
221 return;
222 }
223
224 for (i = 0; i < count; i++)
Michal Krol07135702006-03-21 10:37:40 +0000225 {
226 if (string[i] == NULL)
227 {
228 _mesa_free ((GLvoid *) offsets);
229 RELEASE_SHADER(sha);
230 _mesa_error (ctx, GL_INVALID_VALUE, "glShaderSourceARB");
231 return;
232 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000233 if (length == NULL || length[i] < 0)
234 offsets[i] = _mesa_strlen (string[i]);
235 else
236 offsets[i] = length[i];
237 /* accumulate string lengths */
238 if (i > 0)
239 offsets[i] += offsets[i - 1];
240 }
241
242 source = (GLcharARB *) _mesa_malloc ((offsets[count - 1] + 1) * sizeof (GLcharARB));
243 if (source == NULL)
244 {
Michal Krol9ac96052006-02-27 14:41:41 +0000245 _mesa_free ((GLvoid *) offsets);
246 RELEASE_SHADER(sha);
Michal Krol1d7f7192005-03-25 12:12:50 +0000247 _mesa_error (ctx, GL_OUT_OF_MEMORY, "glShaderSourceARB");
248 return;
249 }
250
251 for (i = 0; i < count; i++)
252 {
253 GLint start = (i > 0) ? offsets[i - 1] : 0;
254 _mesa_memcpy (source + start, string[i], (offsets[i] - start) * sizeof (GLcharARB));
255 }
256 source[offsets[count - 1]] = '\0';
257
258 (**sha).SetSource (sha, source, offsets, count);
Michal Krol9ac96052006-02-27 14:41:41 +0000259 RELEASE_SHADER(sha);
Michal Krolc1fe4692004-10-27 17:09:10 +0000260}
261
Michal Krol9ac96052006-02-27 14:41:41 +0000262GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000263_mesa_CompileShaderARB (GLhandleARB shaderObj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000264{
265 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000266 GET_SHADER(sha, shaderObj, "glCompileShaderARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000267
Michal Krol9ac96052006-02-27 14:41:41 +0000268 if (sha != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000269 {
Michal Krol9ac96052006-02-27 14:41:41 +0000270 (**sha).Compile (sha);
271 RELEASE_SHADER(sha);
Michal Krol1d7f7192005-03-25 12:12:50 +0000272 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000273}
274
275GLhandleARB GLAPIENTRY
Michal Krol9ac96052006-02-27 14:41:41 +0000276_mesa_CreateProgramObjectARB (GLvoid)
Michal Krolc1fe4692004-10-27 17:09:10 +0000277{
Michal Krol6324f732005-01-13 14:12:50 +0000278 return _mesa_3dlabs_create_program_object ();
Michal Krolc1fe4692004-10-27 17:09:10 +0000279}
280
Michal Krol9ac96052006-02-27 14:41:41 +0000281GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000282_mesa_AttachObjectARB (GLhandleARB containerObj, GLhandleARB obj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000283{
284 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000285 GET_CONTAINER(con, containerObj, "glAttachObjectARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000286
Michal Krol9ac96052006-02-27 14:41:41 +0000287 if (con != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000288 {
Michal Krol9ac96052006-02-27 14:41:41 +0000289 GET_GENERIC(att, obj, "glAttachObjectARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000290
Michal Krol9ac96052006-02-27 14:41:41 +0000291 if (att != NULL)
292 {
293 (**con).Attach (con, att);
294 RELEASE_GENERIC(att);
295 }
296 RELEASE_CONTAINER(con);
Michal Krol1d7f7192005-03-25 12:12:50 +0000297 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000298}
299
Michal Krol9ac96052006-02-27 14:41:41 +0000300GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000301_mesa_LinkProgramARB (GLhandleARB programObj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000302{
303 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000304 GET_PROGRAM(pro, programObj, "glLinkProgramARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000305
Michal Krol9ac96052006-02-27 14:41:41 +0000306 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000307 {
Michal Krol07135702006-03-21 10:37:40 +0000308 (**pro).Link (pro);
309 if (pro == ctx->ShaderObjects.CurrentProgram)
310 {
311 if ((**pro).GetLinkStatus (pro))
312 _mesa_UseProgramObjectARB (programObj);
313 else
314 _mesa_UseProgramObjectARB (0);
Michal Krol9ac96052006-02-27 14:41:41 +0000315 }
Michal Krol9ac96052006-02-27 14:41:41 +0000316 RELEASE_PROGRAM(pro);
Michal Krol1d7f7192005-03-25 12:12:50 +0000317 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000318}
319
Michal Krol9ac96052006-02-27 14:41:41 +0000320GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000321_mesa_UseProgramObjectARB (GLhandleARB programObj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000322{
323 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000324 I_PROGRAM program = NULL;
325
Michal Krolcc159162006-02-21 12:35:06 +0000326 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000327
Michal Krol9ac96052006-02-27 14:41:41 +0000328 if (programObj != 0)
Michal Krol07135702006-03-21 10:37:40 +0000329 {
Michal Krol9ac96052006-02-27 14:41:41 +0000330 GET_PROGRAM(pro, programObj, "glUseProgramObjectARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000331
Michal Krol1d7f7192005-03-25 12:12:50 +0000332 if (pro == NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000333 return;
Michal Krol1d7f7192005-03-25 12:12:50 +0000334
335 if ((**pro).GetLinkStatus (pro) == GL_FALSE)
336 {
Michal Krol9ac96052006-02-27 14:41:41 +0000337 RELEASE_PROGRAM(pro);
Michal Krol1d7f7192005-03-25 12:12:50 +0000338 _mesa_error (ctx, GL_INVALID_OPERATION, "glUseProgramObjectARB");
339 return;
340 }
Michal Krol9ac96052006-02-27 14:41:41 +0000341
Michal Krol07135702006-03-21 10:37:40 +0000342 program = pro;
343
344 ctx->ShaderObjects._VertexShaderPresent = (**pro).IsShaderPresent (pro, GL_VERTEX_SHADER_ARB);
345 ctx->ShaderObjects._FragmentShaderPresent = (**pro).IsShaderPresent (pro,
346 GL_FRAGMENT_SHADER_ARB);
347 }
348 else
349 {
350 ctx->ShaderObjects._VertexShaderPresent = GL_FALSE;
351 ctx->ShaderObjects._FragmentShaderPresent = GL_FALSE;
Michal Krol1d7f7192005-03-25 12:12:50 +0000352 }
353
Michal Krol44e9ccc2006-02-13 11:31:16 +0000354 if (ctx->ShaderObjects.CurrentProgram != NULL)
Michal Krol9ac96052006-02-27 14:41:41 +0000355 RELEASE_PROGRAM(ctx->ShaderObjects.CurrentProgram);
356 ctx->ShaderObjects.CurrentProgram = program;
Michal Krolc1fe4692004-10-27 17:09:10 +0000357}
358
Michal Krol9ac96052006-02-27 14:41:41 +0000359GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000360_mesa_ValidateProgramARB (GLhandleARB programObj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000361{
362 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000363 GET_PROGRAM(pro, programObj, "glValidateProgramARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000364
Michal Krol9ac96052006-02-27 14:41:41 +0000365 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000366 {
Michal Krol9ac96052006-02-27 14:41:41 +0000367 (**pro).Validate (pro);
368 RELEASE_PROGRAM(pro);
Michal Krol1d7f7192005-03-25 12:12:50 +0000369 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000370}
371
Michal Krol9ac96052006-02-27 14:41:41 +0000372GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000373_mesa_Uniform1fARB (GLint location, GLfloat v0)
Michal Krol9ac96052006-02-27 14:41:41 +0000374{
375 GET_CURRENT_CONTEXT(ctx);
Michal Krol8af48fc2006-03-14 11:23:16 +0000376 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform1fARB");
377
378 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol9ac96052006-02-27 14:41:41 +0000379
380 if (pro != NULL)
381 {
382 if (!_slang_write_uniform (pro, location, 1, &v0, GL_FLOAT))
383 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform1fARB");
384 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000385}
386
Michal Krol9ac96052006-02-27 14:41:41 +0000387GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000388_mesa_Uniform2fARB (GLint location, GLfloat v0, GLfloat v1)
Michal Krol1d7f7192005-03-25 12:12:50 +0000389{
390 GET_CURRENT_CONTEXT(ctx);
Michal Krol8af48fc2006-03-14 11:23:16 +0000391 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform2fARB");
392
393 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000394
Michal Krol9ac96052006-02-27 14:41:41 +0000395 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000396 {
Michal Krol9ac96052006-02-27 14:41:41 +0000397 GLfloat v[2] = { v0, v1 };
398
399 if (!_slang_write_uniform (pro, location, 1, v, GL_FLOAT_VEC2))
400 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform2fARB");
Michal Krol6324f732005-01-13 14:12:50 +0000401 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000402}
403
Michal Krol9ac96052006-02-27 14:41:41 +0000404GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000405_mesa_Uniform3fARB (GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
Michal Krol1d7f7192005-03-25 12:12:50 +0000406{
407 GET_CURRENT_CONTEXT(ctx);
Michal Krol8af48fc2006-03-14 11:23:16 +0000408 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform3fARB");
409
410 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000411
Michal Krol9ac96052006-02-27 14:41:41 +0000412 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000413 {
Michal Krol9ac96052006-02-27 14:41:41 +0000414 GLfloat v[3] = { v0, v1, v2 };
415
416 if (!_slang_write_uniform (pro, location, 1, v, GL_FLOAT_VEC3))
417 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform3fARB");
Michal Krol6324f732005-01-13 14:12:50 +0000418 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000419}
420
Michal Krol9ac96052006-02-27 14:41:41 +0000421GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000422_mesa_Uniform4fARB (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
Michal Krol1d7f7192005-03-25 12:12:50 +0000423{
424 GET_CURRENT_CONTEXT(ctx);
Michal Krol8af48fc2006-03-14 11:23:16 +0000425 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform4fARB");
426
427 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000428
Michal Krol9ac96052006-02-27 14:41:41 +0000429 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000430 {
Michal Krol9ac96052006-02-27 14:41:41 +0000431 GLfloat v[4] = { v0, v1, v2, v3 };
432
433 if (!_slang_write_uniform (pro, location, 1, v, GL_FLOAT_VEC4))
434 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform4fARB");
Michal Krol6324f732005-01-13 14:12:50 +0000435 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000436}
437
Michal Krol9ac96052006-02-27 14:41:41 +0000438GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000439_mesa_Uniform1iARB (GLint location, GLint v0)
Michal Krol1d7f7192005-03-25 12:12:50 +0000440{
441 GET_CURRENT_CONTEXT(ctx);
Michal Krol8af48fc2006-03-14 11:23:16 +0000442 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform1iARB");
443
444 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
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 if (!_slang_write_uniform (pro, location, 1, &v0, GL_INT))
449 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform1iARB");
Michal Krol6324f732005-01-13 14:12:50 +0000450 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000451}
452
Michal Krol9ac96052006-02-27 14:41:41 +0000453GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000454_mesa_Uniform2iARB (GLint location, GLint v0, GLint v1)
Michal Krol1d7f7192005-03-25 12:12:50 +0000455{
456 GET_CURRENT_CONTEXT(ctx);
Michal Krol8af48fc2006-03-14 11:23:16 +0000457 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform2iARB");
458
459 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
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[2] = { v0, v1 };
464
465 if (!_slang_write_uniform (pro, location, 1, v, GL_INT_VEC2))
466 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform2iARB");
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_Uniform3iARB (GLint location, GLint v0, GLint v1, GLint v2)
Michal Krol1d7f7192005-03-25 12:12:50 +0000472{
473 GET_CURRENT_CONTEXT(ctx);
Michal Krol8af48fc2006-03-14 11:23:16 +0000474 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform3iARB");
475
476 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000477
Michal Krol9ac96052006-02-27 14:41:41 +0000478 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000479 {
Michal Krol9ac96052006-02-27 14:41:41 +0000480 GLint v[3] = { v0, v1, v2 };
481
482 if (!_slang_write_uniform (pro, location, 1, v, GL_INT_VEC3))
483 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform3iARB");
Michal Krol6324f732005-01-13 14:12:50 +0000484 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000485}
486
Michal Krol9ac96052006-02-27 14:41:41 +0000487GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000488_mesa_Uniform4iARB (GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
Michal Krol1d7f7192005-03-25 12:12:50 +0000489{
490 GET_CURRENT_CONTEXT(ctx);
Michal Krol8af48fc2006-03-14 11:23:16 +0000491 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform4iARB");
492
493 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000494
Michal Krol9ac96052006-02-27 14:41:41 +0000495 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000496 {
Michal Krol9ac96052006-02-27 14:41:41 +0000497 GLint v[4] = { v0, v1, v2, v3 };
498
499 if (!_slang_write_uniform (pro, location, 1, v, GL_INT_VEC4))
500 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform4iARB");
Michal Krol6324f732005-01-13 14:12:50 +0000501 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000502}
503
Michal Krol9ac96052006-02-27 14:41:41 +0000504GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000505_mesa_Uniform1fvARB (GLint location, GLsizei count, const GLfloat *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000506{
507 GET_CURRENT_CONTEXT(ctx);
Michal Krol8af48fc2006-03-14 11:23:16 +0000508 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform1fvARB");
509
510 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000511
Michal Krol9ac96052006-02-27 14:41:41 +0000512 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000513 {
Michal Krol9ac96052006-02-27 14:41:41 +0000514 if (!_slang_write_uniform (pro, location, count, value, GL_FLOAT))
515 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform1fvARB");
Michal Krol6324f732005-01-13 14:12:50 +0000516 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000517}
518
Michal Krol9ac96052006-02-27 14:41:41 +0000519GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000520_mesa_Uniform2fvARB (GLint location, GLsizei count, const GLfloat *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000521{
522 GET_CURRENT_CONTEXT(ctx);
Michal Krol8af48fc2006-03-14 11:23:16 +0000523 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform2fvARB");
524
525 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000526
Michal Krol9ac96052006-02-27 14:41:41 +0000527 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000528 {
Michal Krol9ac96052006-02-27 14:41:41 +0000529 if (!_slang_write_uniform (pro, location, count, value, GL_FLOAT_VEC2))
530 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform2fvARB");
Michal Krol6324f732005-01-13 14:12:50 +0000531 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000532}
533
Michal Krol9ac96052006-02-27 14:41:41 +0000534GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000535_mesa_Uniform3fvARB (GLint location, GLsizei count, const GLfloat *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000536{
537 GET_CURRENT_CONTEXT(ctx);
Michal Krol8af48fc2006-03-14 11:23:16 +0000538 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform3fvARB");
539
540 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000541
Michal Krol9ac96052006-02-27 14:41:41 +0000542 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000543 {
Michal Krol9ac96052006-02-27 14:41:41 +0000544 if (!_slang_write_uniform (pro, location, count, value, GL_FLOAT_VEC3))
545 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform3fvARB");
Michal Krol6324f732005-01-13 14:12:50 +0000546 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000547}
548
Michal Krol9ac96052006-02-27 14:41:41 +0000549GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000550_mesa_Uniform4fvARB (GLint location, GLsizei count, const GLfloat *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000551{
Michal Krol9ac96052006-02-27 14:41:41 +0000552 GET_CURRENT_CONTEXT(ctx);
Michal Krol8af48fc2006-03-14 11:23:16 +0000553 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform4fvARB");
554
555 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000556
Michal Krol9ac96052006-02-27 14:41:41 +0000557 if (pro != NULL)
558 {
559 if (!_slang_write_uniform (pro, location, count, value, GL_FLOAT_VEC4))
560 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform4fvARB");
561 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000562}
563
Michal Krol9ac96052006-02-27 14:41:41 +0000564GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000565_mesa_Uniform1ivARB (GLint location, GLsizei count, const GLint *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000566{
567 GET_CURRENT_CONTEXT(ctx);
Michal Krol8af48fc2006-03-14 11:23:16 +0000568 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform1ivARB");
569
570 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000571
Michal Krol9ac96052006-02-27 14:41:41 +0000572 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000573 {
Michal Krol9ac96052006-02-27 14:41:41 +0000574 if (!_slang_write_uniform (pro, location, count, value, GL_INT))
575 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform1ivARB");
Michal Krol6324f732005-01-13 14:12:50 +0000576 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000577}
578
Michal Krol9ac96052006-02-27 14:41:41 +0000579GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000580_mesa_Uniform2ivARB (GLint location, GLsizei count, const GLint *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000581{
582 GET_CURRENT_CONTEXT(ctx);
Michal Krol8af48fc2006-03-14 11:23:16 +0000583 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform2ivARB");
584
585 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000586
Michal Krol9ac96052006-02-27 14:41:41 +0000587 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000588 {
Michal Krol9ac96052006-02-27 14:41:41 +0000589 if (!_slang_write_uniform (pro, location, count, value, GL_INT_VEC2))
590 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform2ivARB");
Michal Krol6324f732005-01-13 14:12:50 +0000591 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000592}
593
Michal Krol9ac96052006-02-27 14:41:41 +0000594GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000595_mesa_Uniform3ivARB (GLint location, GLsizei count, const GLint *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000596{
597 GET_CURRENT_CONTEXT(ctx);
Michal Krol8af48fc2006-03-14 11:23:16 +0000598 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform3ivARB");
599
600 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000601
Michal Krol9ac96052006-02-27 14:41:41 +0000602 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000603 {
Michal Krol9ac96052006-02-27 14:41:41 +0000604 if (!_slang_write_uniform (pro, location, count, value, GL_INT_VEC3))
605 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform3ivARB");
Michal Krol6324f732005-01-13 14:12:50 +0000606 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000607}
608
Michal Krol9ac96052006-02-27 14:41:41 +0000609GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000610_mesa_Uniform4ivARB (GLint location, GLsizei count, const GLint *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000611{
612 GET_CURRENT_CONTEXT(ctx);
Michal Krol8af48fc2006-03-14 11:23:16 +0000613 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform4ivARB");
614
615 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000616
Michal Krol9ac96052006-02-27 14:41:41 +0000617 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000618 {
Michal Krol9ac96052006-02-27 14:41:41 +0000619 if (!_slang_write_uniform (pro, location, count, value, GL_INT_VEC4))
620 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform4ivARB");
Michal Krol6324f732005-01-13 14:12:50 +0000621 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000622}
623
Michal Krol9ac96052006-02-27 14:41:41 +0000624GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000625_mesa_UniformMatrix2fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000626{
627 GET_CURRENT_CONTEXT(ctx);
Michal Krol8af48fc2006-03-14 11:23:16 +0000628 GET_CURRENT_LINKED_PROGRAM(pro, "glUniformMatrix2fvARB");
629
630 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000631
Michal Krol9ac96052006-02-27 14:41:41 +0000632 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000633 {
Michal Krol9ac96052006-02-27 14:41:41 +0000634 if (transpose)
635 {
636 GLfloat *trans, *pt;
637 const GLfloat *pv;
638
639 trans = (GLfloat *) _mesa_malloc (count * 4 * sizeof (GLfloat));
640 if (trans == NULL)
641 {
642 _mesa_error (ctx, GL_OUT_OF_MEMORY, "glUniformMatrix2fvARB");
643 return;
644 }
645 for (pt = trans, pv = value; pt != trans + count * 4; pt += 4, pv += 4)
646 {
647 pt[0] = pv[0];
648 pt[1] = pv[2];
649 pt[2] = pv[1];
650 pt[3] = pv[3];
651 }
652 if (!_slang_write_uniform (pro, location, count, trans, GL_FLOAT_MAT2))
653 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniformMatrix2fvARB");
654 _mesa_free (trans);
655 }
656 else
657 {
658 if (!_slang_write_uniform (pro, location, count, value, GL_FLOAT_MAT2))
659 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniformMatrix2fvARB");
660 }
Michal Krol6324f732005-01-13 14:12:50 +0000661 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000662}
663
Michal Krol9ac96052006-02-27 14:41:41 +0000664GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000665_mesa_UniformMatrix3fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000666{
667 GET_CURRENT_CONTEXT(ctx);
Michal Krol8af48fc2006-03-14 11:23:16 +0000668 GET_CURRENT_LINKED_PROGRAM(pro, "glUniformMatrix3fvARB");
669
670 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000671
Michal Krol9ac96052006-02-27 14:41:41 +0000672 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000673 {
Michal Krol9ac96052006-02-27 14:41:41 +0000674 if (transpose)
675 {
676 GLfloat *trans, *pt;
677 const GLfloat *pv;
678
679 trans = (GLfloat *) _mesa_malloc (count * 9 * sizeof (GLfloat));
680 if (trans == NULL)
681 {
682 _mesa_error (ctx, GL_OUT_OF_MEMORY, "glUniformMatrix3fvARB");
683 return;
684 }
685 for (pt = trans, pv = value; pt != trans + count * 9; pt += 9, pv += 9)
686 {
687 pt[0] = pv[0];
688 pt[1] = pv[3];
689 pt[2] = pv[6];
690 pt[3] = pv[1];
691 pt[4] = pv[4];
692 pt[5] = pv[7];
693 pt[6] = pv[2];
694 pt[7] = pv[5];
695 pt[8] = pv[8];
696 }
697 if (!_slang_write_uniform (pro, location, count, trans, GL_FLOAT_MAT3))
698 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniformMatrix3fvARB");
699 _mesa_free (trans);
700 }
701 else
702 {
703 if (!_slang_write_uniform (pro, location, count, value, GL_FLOAT_MAT3))
704 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniformMatrix3fvARB");
705 }
Michal Krol6324f732005-01-13 14:12:50 +0000706 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000707}
708
Michal Krol9ac96052006-02-27 14:41:41 +0000709GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000710_mesa_UniformMatrix4fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000711{
712 GET_CURRENT_CONTEXT(ctx);
Michal Krol8af48fc2006-03-14 11:23:16 +0000713 GET_CURRENT_LINKED_PROGRAM(pro, "glUniformMatrix4fvARB");
714
715 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000716
Michal Krol9ac96052006-02-27 14:41:41 +0000717 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000718 {
Michal Krol9ac96052006-02-27 14:41:41 +0000719 if (transpose)
720 {
721 GLfloat *trans, *pt;
722 const GLfloat *pv;
723
724 trans = (GLfloat *) _mesa_malloc (count * 16 * sizeof (GLfloat));
725 if (trans == NULL)
726 {
727 _mesa_error (ctx, GL_OUT_OF_MEMORY, "glUniformMatrix4fvARB");
728 return;
729 }
730 for (pt = trans, pv = value; pt != trans + count * 16; pt += 16, pv += 16)
731 {
732 _math_transposef (pt, pv);
733 }
734 if (!_slang_write_uniform (pro, location, count, trans, GL_FLOAT_MAT4))
735 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniformMatrix4fvARB");
736 _mesa_free (trans);
737 }
738 else
739 {
740 if (!_slang_write_uniform (pro, location, count, value, GL_FLOAT_MAT4))
741 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniformMatrix4fvARB");
742 }
Michal Krol6324f732005-01-13 14:12:50 +0000743 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000744}
745
746static GLboolean
747_mesa_get_object_parameter (GLhandleARB obj, GLenum pname, GLvoid *params, GLboolean *integral,
748 GLint *size)
749{
750 GET_CURRENT_CONTEXT(ctx);
Michal Krol1d7f7192005-03-25 12:12:50 +0000751 GLint *ipar = (GLint *) params;
Michal Krol1d7f7192005-03-25 12:12:50 +0000752
753 /* set default values */
754 *integral = GL_TRUE; /* indicates param type, TRUE: GLint, FALSE: GLfloat */
Michal Krol9ac96052006-02-27 14:41:41 +0000755 *size = 1; /* param array size */
Michal Krol1d7f7192005-03-25 12:12:50 +0000756
757 switch (pname)
758 {
759 case GL_OBJECT_TYPE_ARB:
Michal Krol9ac96052006-02-27 14:41:41 +0000760 case GL_OBJECT_DELETE_STATUS_ARB:
761 case GL_OBJECT_INFO_LOG_LENGTH_ARB:
762 {
763 GET_GENERIC(gen, obj, "glGetObjectParameterivARB");
764
765 if (gen == NULL)
766 return GL_FALSE;
767
768 switch (pname)
769 {
770 case GL_OBJECT_TYPE_ARB:
771 *ipar = (**gen).GetType (gen);
772 break;
773 case GL_OBJECT_DELETE_STATUS_ARB:
774 *ipar = (**gen).GetDeleteStatus (gen);
775 break;
776 case GL_OBJECT_INFO_LOG_LENGTH_ARB:
777 {
778 const GLcharARB *info = (**gen).GetInfoLog (gen);
779
780 if (info == NULL)
781 *ipar = 0;
782 else
783 *ipar = _mesa_strlen (info) + 1;
784 }
785 break;
786 }
787
788 RELEASE_GENERIC(gen);
Michal Krol1d7f7192005-03-25 12:12:50 +0000789 }
790 break;
Michal Krol9ac96052006-02-27 14:41:41 +0000791 case GL_OBJECT_SUBTYPE_ARB:
Michal Krol1d7f7192005-03-25 12:12:50 +0000792 case GL_OBJECT_COMPILE_STATUS_ARB:
Michal Krol9ac96052006-02-27 14:41:41 +0000793 case GL_OBJECT_SHADER_SOURCE_LENGTH_ARB:
794 {
795 GET_SHADER(sha, obj, "glGetObjectParameterivARB");
796
797 if (sha == NULL)
798 return GL_FALSE;
799
800 switch (pname)
801 {
802 case GL_OBJECT_SUBTYPE_ARB:
803 *ipar = (**sha).GetSubType (sha);
804 break;
805 case GL_OBJECT_COMPILE_STATUS_ARB:
806 *ipar = (**sha).GetCompileStatus (sha);
807 break;
808 case GL_OBJECT_SHADER_SOURCE_LENGTH_ARB:
809 {
810 const GLcharARB *src = (**sha).GetSource (sha);
811
812 if (src == NULL)
813 *ipar = 0;
814 else
815 *ipar = _mesa_strlen (src) + 1;
816 }
817 break;
818 }
819
820 RELEASE_SHADER(sha);
Michal Krol1d7f7192005-03-25 12:12:50 +0000821 }
822 break;
823 case GL_OBJECT_LINK_STATUS_ARB:
Michal Krol1d7f7192005-03-25 12:12:50 +0000824 case GL_OBJECT_VALIDATE_STATUS_ARB:
Michal Krol1d7f7192005-03-25 12:12:50 +0000825 case GL_OBJECT_ATTACHED_OBJECTS_ARB:
Michal Krol1d7f7192005-03-25 12:12:50 +0000826 case GL_OBJECT_ACTIVE_UNIFORMS_ARB:
Michal Krol1d7f7192005-03-25 12:12:50 +0000827 case GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB:
Michal Krol9ac96052006-02-27 14:41:41 +0000828 {
829 GET_PROGRAM(pro, obj, "glGetObjectParameterivARB");
830
831 if (pro == NULL)
832 return GL_FALSE;
833
834 switch (pname)
835 {
836 case GL_OBJECT_LINK_STATUS_ARB:
837 *ipar = (**pro).GetLinkStatus (pro);
838 break;
839 case GL_OBJECT_VALIDATE_STATUS_ARB:
840 *ipar = (**pro).GetValidateStatus (pro);
841 break;
842 case GL_OBJECT_ATTACHED_OBJECTS_ARB:
843 *ipar = (**pro)._container.GetAttachedCount ((I_CONTAINER) pro);
844 break;
845 case GL_OBJECT_ACTIVE_UNIFORMS_ARB:
846 *ipar = _slang_get_active_uniform_count (pro);
847 break;
848 case GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB:
849 *ipar = _slang_get_active_uniform_max_length (pro);
850 break;
851 }
852
853 RELEASE_PROGRAM(pro);
Michal Krol1d7f7192005-03-25 12:12:50 +0000854 }
855 break;
856 default:
857 _mesa_error (ctx, GL_INVALID_ENUM, "glGetObjectParameterivARB");
Michal Krol9ac96052006-02-27 14:41:41 +0000858 return GL_FALSE;
Michal Krol1d7f7192005-03-25 12:12:50 +0000859 }
860
Michal Krol9ac96052006-02-27 14:41:41 +0000861 return GL_TRUE;
Michal Krol1d7f7192005-03-25 12:12:50 +0000862}
863
Michal Krol9ac96052006-02-27 14:41:41 +0000864GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000865_mesa_GetObjectParameterfvARB (GLhandleARB obj, GLenum pname, GLfloat *params)
Michal Krol1d7f7192005-03-25 12:12:50 +0000866{
867 GLboolean integral;
Michal Krol9ac96052006-02-27 14:41:41 +0000868 GLint size;
Michal Krol1d7f7192005-03-25 12:12:50 +0000869
870 assert (sizeof (GLfloat) == sizeof (GLint));
871
Michal Krol9ac96052006-02-27 14:41:41 +0000872 if (_mesa_get_object_parameter (obj, pname, (GLvoid *) params, &integral, &size))
873 if (integral)
874 {
875 GLint i;
876
Michal Krol1d7f7192005-03-25 12:12:50 +0000877 for (i = 0; i < size; i++)
878 params[i] = (GLfloat) ((GLint *) params)[i];
Michal Krol9ac96052006-02-27 14:41:41 +0000879 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000880}
881
Michal Krol9ac96052006-02-27 14:41:41 +0000882GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000883_mesa_GetObjectParameterivARB (GLhandleARB obj, GLenum pname, GLint *params)
Michal Krol1d7f7192005-03-25 12:12:50 +0000884{
885 GLboolean integral;
Michal Krol9ac96052006-02-27 14:41:41 +0000886 GLint size;
Michal Krol1d7f7192005-03-25 12:12:50 +0000887
888 assert (sizeof (GLfloat) == sizeof (GLint));
889
Michal Krol9ac96052006-02-27 14:41:41 +0000890 if (_mesa_get_object_parameter (obj, pname, (GLvoid *) params, &integral, &size))
891 if (!integral)
892 {
893 GLint i;
894
Michal Krol1d7f7192005-03-25 12:12:50 +0000895 for (i = 0; i < size; i++)
896 params[i] = (GLint) ((GLfloat *) params)[i];
Michal Krol9ac96052006-02-27 14:41:41 +0000897 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000898}
899
Michal Krol9ac96052006-02-27 14:41:41 +0000900static GLvoid
Michal Krol1d7f7192005-03-25 12:12:50 +0000901_mesa_get_string (const GLcharARB *src, GLsizei maxLength, GLsizei *length, GLcharARB *str)
902{
903 GLsizei len;
904
Michal Krol9ac96052006-02-27 14:41:41 +0000905 if (maxLength == 0)
906 {
907 if (length != NULL)
908 *length = 0;
909 return;
910 }
911
Michal Krol1d7f7192005-03-25 12:12:50 +0000912 if (src == NULL)
913 src = "";
914
915 len = _mesa_strlen (src);
Michal Krol9ac96052006-02-27 14:41:41 +0000916 if (len >= maxLength)
917 len = maxLength - 1;
Michal Krol1d7f7192005-03-25 12:12:50 +0000918
919 _mesa_memcpy (str, src, len * sizeof (GLcharARB));
Michal Krol9ac96052006-02-27 14:41:41 +0000920 str[len] = '\0';
Michal Krol1d7f7192005-03-25 12:12:50 +0000921 if (length != NULL)
Michal Krol6324f732005-01-13 14:12:50 +0000922 *length = len;
Michal Krolc1fe4692004-10-27 17:09:10 +0000923}
924
Michal Krol9ac96052006-02-27 14:41:41 +0000925GLvoid GLAPIENTRY
Michal Krol1d7f7192005-03-25 12:12:50 +0000926_mesa_GetInfoLogARB (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog)
927{
928 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000929 GET_GENERIC(gen, obj, "glGetInfoLogARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000930
Michal Krol9ac96052006-02-27 14:41:41 +0000931 if (gen != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000932 {
Michal Krol9ac96052006-02-27 14:41:41 +0000933 _mesa_get_string ((**gen).GetInfoLog (gen), maxLength, length, infoLog);
934 RELEASE_GENERIC(gen);
Michal Krol1d7f7192005-03-25 12:12:50 +0000935 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000936}
937
Michal Krol9ac96052006-02-27 14:41:41 +0000938GLvoid GLAPIENTRY
939_mesa_GetAttachedObjectsARB (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count,
940 GLhandleARB *obj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000941{
942 GET_CURRENT_CONTEXT(ctx);
Michal Krol1d7f7192005-03-25 12:12:50 +0000943 GLsizei cnt, i;
Michal Krol9ac96052006-02-27 14:41:41 +0000944 GET_CONTAINER(con, containerObj, "glGetAttachedObjectsARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000945
Michal Krol9ac96052006-02-27 14:41:41 +0000946 if (con != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000947 {
Michal Krol9ac96052006-02-27 14:41:41 +0000948 cnt = (**con).GetAttachedCount (con);
949 if (cnt > maxCount)
950 cnt = maxCount;
951 if (count != NULL)
952 *count = cnt;
953
954 for (i = 0; i < cnt; i++)
955 {
956 I_GENERIC x = (**con).GetAttached (con, i);
957 obj[i] = (**x).GetName (x);
958 RELEASE_GENERIC(x);
959 }
960 RELEASE_CONTAINER(con);
Michal Krol1d7f7192005-03-25 12:12:50 +0000961 }
Michal Krol9ac96052006-02-27 14:41:41 +0000962}
Michal Krolc1fe4692004-10-27 17:09:10 +0000963
964GLint GLAPIENTRY
965_mesa_GetUniformLocationARB (GLhandleARB programObj, const GLcharARB *name)
Michal Krol1d7f7192005-03-25 12:12:50 +0000966{
Michal Krol9ac96052006-02-27 14:41:41 +0000967 GET_CURRENT_CONTEXT(ctx);
Michal Krol1d7f7192005-03-25 12:12:50 +0000968 GLint loc = -1;
Michal Krol9ac96052006-02-27 14:41:41 +0000969 GET_LINKED_PROGRAM(pro, programObj, "glGetUniformLocationARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000970
Michal Krol9ac96052006-02-27 14:41:41 +0000971 if (pro != NULL)
972 {
973 if (name != NULL && (name[0] != 'g' || name[1] != 'l' || name[2] != '_'))
974 loc = _slang_get_uniform_location (pro, name);
975 RELEASE_PROGRAM(pro);
976 }
Michal Krol6324f732005-01-13 14:12:50 +0000977 return loc;
Michal Krolc1fe4692004-10-27 17:09:10 +0000978}
979
Michal Krol9ac96052006-02-27 14:41:41 +0000980GLvoid GLAPIENTRY
981_mesa_GetActiveUniformARB (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length,
982 GLint *size, GLenum *type, GLcharARB *name)
Michal Krol1d7f7192005-03-25 12:12:50 +0000983{
984 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000985 GET_PROGRAM(pro, programObj, "glGetActiveUniformARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000986
Michal Krol9ac96052006-02-27 14:41:41 +0000987 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000988 {
Michal Krol9ac96052006-02-27 14:41:41 +0000989 if (index < _slang_get_active_uniform_count (pro))
990 _slang_get_active_uniform (pro, index, maxLength, length, size, type, name);
991 else
992 _mesa_error (ctx, GL_INVALID_VALUE, "glGetActiveUniformARB");
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_GetUniformfvARB (GLhandleARB programObj, GLint location, GLfloat *params)
Michal Krol1d7f7192005-03-25 12:12:50 +0000999{
1000 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +00001001 GET_LINKED_PROGRAM(pro, programObj, "glGetUniformfvARB");
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 /* TODO */
1006 RELEASE_PROGRAM(pro);
Michal Krol1d7f7192005-03-25 12:12:50 +00001007 }
Michal Krolc1fe4692004-10-27 17:09:10 +00001008}
1009
Michal Krol9ac96052006-02-27 14:41:41 +00001010GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +00001011_mesa_GetUniformivARB (GLhandleARB programObj, GLint location, GLint *params)
Michal Krol1d7f7192005-03-25 12:12:50 +00001012{
1013 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +00001014 GET_LINKED_PROGRAM(pro, programObj, "glGetUniformivARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001015
Michal Krol9ac96052006-02-27 14:41:41 +00001016 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +00001017 {
Michal Krol9ac96052006-02-27 14:41:41 +00001018 /* TODO */
1019 RELEASE_PROGRAM(pro);
Michal Krol1d7f7192005-03-25 12:12:50 +00001020 }
Michal Krolc1fe4692004-10-27 17:09:10 +00001021}
1022
Michal Krol9ac96052006-02-27 14:41:41 +00001023GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +00001024_mesa_GetShaderSourceARB (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source)
Michal Krol1d7f7192005-03-25 12:12:50 +00001025{
1026 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +00001027 GET_SHADER(sha, obj, "glGetShaderSourceARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001028
Michal Krol9ac96052006-02-27 14:41:41 +00001029 if (sha != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +00001030 {
Michal Krol9ac96052006-02-27 14:41:41 +00001031 _mesa_get_string ((**sha).GetSource (sha), maxLength, length, source);
1032 RELEASE_SHADER(sha);
Michal Krol1d7f7192005-03-25 12:12:50 +00001033 }
Michal Krolc1fe4692004-10-27 17:09:10 +00001034}
1035
1036/* GL_ARB_vertex_shader */
1037
Michal Krol9ac96052006-02-27 14:41:41 +00001038GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +00001039_mesa_BindAttribLocationARB (GLhandleARB programObj, GLuint index, const GLcharARB *name)
Michal Krol1d7f7192005-03-25 12:12:50 +00001040{
1041 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +00001042 GET_PROGRAM(pro, programObj, "glBindAttribLocationARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001043
Michal Krol9ac96052006-02-27 14:41:41 +00001044 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +00001045 {
Michal Krol9ac96052006-02-27 14:41:41 +00001046 if (name != NULL && (name[0] != 'g' || name[1] != 'l' || name[2] != '_'))
1047 {
1048 /* TODO */
1049 }
1050 RELEASE_PROGRAM(pro);
Michal Krol1d7f7192005-03-25 12:12:50 +00001051 }
Michal Krolc1fe4692004-10-27 17:09:10 +00001052}
1053
Michal Krol9ac96052006-02-27 14:41:41 +00001054GLvoid GLAPIENTRY
1055_mesa_GetActiveAttribARB (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length,
1056 GLint *size, GLenum *type, GLcharARB *name)
Michal Krol1d7f7192005-03-25 12:12:50 +00001057{
1058 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +00001059 GET_PROGRAM(pro, programObj, "glGetActiveAttribARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001060
Michal Krol9ac96052006-02-27 14:41:41 +00001061 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +00001062 {
Michal Krol9ac96052006-02-27 14:41:41 +00001063 /* TODO */
1064 RELEASE_PROGRAM(pro);
Michal Krol1d7f7192005-03-25 12:12:50 +00001065 }
Michal Krolc1fe4692004-10-27 17:09:10 +00001066}
1067
1068GLint GLAPIENTRY
1069_mesa_GetAttribLocationARB (GLhandleARB programObj, const GLcharARB *name)
Michal Krol1d7f7192005-03-25 12:12:50 +00001070{
1071 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +00001072 GLint loc = -1;
1073 GET_PROGRAM(pro, programObj, "glGetAttribLocationARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001074
Michal Krol9ac96052006-02-27 14:41:41 +00001075 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +00001076 {
Michal Krol9ac96052006-02-27 14:41:41 +00001077 if (name != NULL && (name[0] != 'g' || name[1] != 'l' || name[2] != '_'))
1078 {
1079 /* TODO */
1080 }
1081 RELEASE_PROGRAM(pro);
Michal Krol1d7f7192005-03-25 12:12:50 +00001082 }
Michal Krol6324f732005-01-13 14:12:50 +00001083 return loc;
Michal Krolc1fe4692004-10-27 17:09:10 +00001084}
1085
Michal Krol9ac96052006-02-27 14:41:41 +00001086GLvoid
Michal Krol6324f732005-01-13 14:12:50 +00001087_mesa_init_shaderobjects (GLcontext *ctx)
Michal Krol1d7f7192005-03-25 12:12:50 +00001088{
Michal Krol07135702006-03-21 10:37:40 +00001089 ctx->ShaderObjects.CurrentProgram = NULL;
1090 ctx->ShaderObjects._FragmentShaderPresent = GL_FALSE;
1091 ctx->ShaderObjects._VertexShaderPresent = GL_FALSE;
Michal Krol1d7f7192005-03-25 12:12:50 +00001092
1093 _mesa_init_shaderobjects_3dlabs (ctx);
Michal Krolc1fe4692004-10-27 17:09:10 +00001094}
Michal Krol1d7f7192005-03-25 12:12:50 +00001095