blob: 986cec6526ddd05f57361411d3ca345331e37118 [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 RELEASE_GENERIC(x)\
Michal Krola1a02e62006-05-16 09:40:30 +000040 (**x)._unknown.Release ((struct gl2_unknown_intf **) (x))
Michal Krol9ac96052006-02-27 14:41:41 +000041
42#define RELEASE_CONTAINER(x)\
Michal Krola1a02e62006-05-16 09:40:30 +000043 (**x)._generic._unknown.Release ((struct gl2_unknown_intf **) (x))
Michal Krol9ac96052006-02-27 14:41:41 +000044
45#define RELEASE_PROGRAM(x)\
Michal Krola1a02e62006-05-16 09:40:30 +000046 (**x)._container._generic._unknown.Release ((struct gl2_unknown_intf **) (x))
Michal Krol9ac96052006-02-27 14:41:41 +000047
48#define RELEASE_SHADER(x)\
Michal Krola1a02e62006-05-16 09:40:30 +000049 (**x)._generic._unknown.Release ((struct gl2_unknown_intf **) (x))
Michal Krol9ac96052006-02-27 14:41:41 +000050
Michal Krola1a02e62006-05-16 09:40:30 +000051static struct gl2_unknown_intf **
52lookup_handle (GLcontext *ctx, GLhandleARB handle, enum gl2_uuid uuid, const char *function)
53{
54 struct gl2_unknown_intf **unk;
Michal Krol9ac96052006-02-27 14:41:41 +000055
Michal Krola1a02e62006-05-16 09:40:30 +000056 /*
57 * Note: _mesa_HashLookup() requires non-zero input values, so the passed-in handle value
58 * must be checked beforehand.
59 */
60 if (handle == 0) {
61 _mesa_error (ctx, GL_INVALID_VALUE, function);
62 return NULL;
63 }
64 _glthread_LOCK_MUTEX (ctx->Shared->Mutex);
65 unk = (struct gl2_unknown_intf **) (_mesa_HashLookup (ctx->Shared->GL2Objects, handle));
66 _glthread_UNLOCK_MUTEX (ctx->Shared->Mutex);
67 if (unk == NULL)
68 _mesa_error (ctx, GL_INVALID_VALUE, function);
69 else {
70 unk = (**unk).QueryInterface (unk, uuid);
71 if (unk == NULL)
72 _mesa_error (ctx, GL_INVALID_OPERATION, function);
73 }
74 return unk;
75}
Michal Krol9ac96052006-02-27 14:41:41 +000076
77#define GET_GENERIC(x, handle, function)\
Michal Krola1a02e62006-05-16 09:40:30 +000078 struct gl2_generic_intf **x = (struct gl2_generic_intf **)\
79 lookup_handle (ctx, handle, UIID_GENERIC, function);
Michal Krol9ac96052006-02-27 14:41:41 +000080
81#define GET_CONTAINER(x, handle, function)\
Michal Krola1a02e62006-05-16 09:40:30 +000082 struct gl2_container_intf **x = (struct gl2_container_intf **)\
83 lookup_handle (ctx, handle, UIID_CONTAINER, function);
Michal Krol9ac96052006-02-27 14:41:41 +000084
85#define GET_PROGRAM(x, handle, function)\
Michal Krola1a02e62006-05-16 09:40:30 +000086 struct gl2_program_intf **x = (struct gl2_program_intf **)\
87 lookup_handle (ctx, handle, UIID_PROGRAM, function);
Michal Krol9ac96052006-02-27 14:41:41 +000088
89#define GET_SHADER(x, handle, function)\
Michal Krola1a02e62006-05-16 09:40:30 +000090 struct gl2_shader_intf **x = (struct gl2_shader_intf **)\
91 lookup_handle (ctx, handle, UIID_SHADER, function);
Michal Krol9ac96052006-02-27 14:41:41 +000092
93#define GET_LINKED_PROGRAM(x, handle, function)\
Michal Krola1a02e62006-05-16 09:40:30 +000094 GET_PROGRAM(x, handle, function);\
95 if (x != NULL && (**x).GetLinkStatus (x) == GL_FALSE) {\
96 RELEASE_PROGRAM(x);\
97 x = NULL;\
98 _mesa_error (ctx, GL_INVALID_OPERATION, function);\
99 }
Michal Krol9ac96052006-02-27 14:41:41 +0000100
101#define GET_CURRENT_LINKED_PROGRAM(x, function)\
Michal Krola1a02e62006-05-16 09:40:30 +0000102 struct gl2_program_intf **x = NULL;\
103 if (ctx->ShaderObjects.CurrentProgram == NULL)\
104 _mesa_error (ctx, GL_INVALID_OPERATION, function);\
105 else {\
106 x = ctx->ShaderObjects.CurrentProgram;\
107 if (x != NULL && (**x).GetLinkStatus (x) == GL_FALSE) {\
108 x = NULL;\
109 _mesa_error (ctx, GL_INVALID_OPERATION, function);\
110 }\
111 }
Michal Krol9ac96052006-02-27 14:41:41 +0000112
Michal Krold55de652006-04-18 10:30:29 +0000113#define IS_NAME_WITH_GL_PREFIX(x) ((x)[0] == 'g' && (x)[1] == 'l' && (x)[2] == '_')
114
Michal Krol9ac96052006-02-27 14:41:41 +0000115
116GLvoid GLAPIENTRY
Michal Krol6324f732005-01-13 14:12:50 +0000117_mesa_DeleteObjectARB (GLhandleARB obj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000118{
Michal Krola1a02e62006-05-16 09:40:30 +0000119 if (obj != 0)
120 {
121 GET_CURRENT_CONTEXT(ctx);
122 GET_GENERIC(gen, obj, "glDeleteObjectARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000123
Michal Krola1a02e62006-05-16 09:40:30 +0000124 if (gen != NULL)
125 {
126 (**gen).Delete (gen);
127 RELEASE_GENERIC(gen);
128 }
129 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000130}
131
132GLhandleARB GLAPIENTRY
Michal Krol6324f732005-01-13 14:12:50 +0000133_mesa_GetHandleARB (GLenum pname)
Michal Krol1d7f7192005-03-25 12:12:50 +0000134{
135 GET_CURRENT_CONTEXT(ctx);
136
137 switch (pname)
138 {
Michal Krola1a02e62006-05-16 09:40:30 +0000139 case GL_PROGRAM_OBJECT_ARB:
140 {
141 struct gl2_program_intf **pro = ctx->ShaderObjects.CurrentProgram;
Michal Krol9ac96052006-02-27 14:41:41 +0000142
Michal Krola1a02e62006-05-16 09:40:30 +0000143 if (pro != NULL)
144 return (**pro)._container._generic.GetName ((struct gl2_generic_intf **) (pro));
145 }
146 break;
Michal Krol9ac96052006-02-27 14:41:41 +0000147 default:
148 _mesa_error (ctx, GL_INVALID_ENUM, "glGetHandleARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000149 }
Michal Krol6324f732005-01-13 14:12:50 +0000150
151 return 0;
Michal Krolc1fe4692004-10-27 17:09:10 +0000152}
153
Michal Krol9ac96052006-02-27 14:41:41 +0000154GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000155_mesa_DetachObjectARB (GLhandleARB containerObj, GLhandleARB attachedObj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000156{
157 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000158 GET_CONTAINER(con, containerObj, "glDetachObjectARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000159
Michal Krol9ac96052006-02-27 14:41:41 +0000160 if (con != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000161 {
Michal Krol9ac96052006-02-27 14:41:41 +0000162 GET_GENERIC(att, attachedObj, "glDetachObjectARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000163
Michal Krol9ac96052006-02-27 14:41:41 +0000164 if (att != NULL)
165 {
166 (**con).Detach (con, att);
167 RELEASE_GENERIC(att);
168 }
169 RELEASE_CONTAINER(con);
Michal Krol1d7f7192005-03-25 12:12:50 +0000170 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000171}
172
173GLhandleARB GLAPIENTRY
174_mesa_CreateShaderObjectARB (GLenum shaderType)
Michal Krol1d7f7192005-03-25 12:12:50 +0000175{
Michal Krol6324f732005-01-13 14:12:50 +0000176 return _mesa_3dlabs_create_shader_object (shaderType);
Michal Krolc1fe4692004-10-27 17:09:10 +0000177}
178
Michal Krol9ac96052006-02-27 14:41:41 +0000179GLvoid GLAPIENTRY
Michal Krol1d7f7192005-03-25 12:12:50 +0000180_mesa_ShaderSourceARB (GLhandleARB shaderObj, GLsizei count, const GLcharARB **string,
Michal Krol6324f732005-01-13 14:12:50 +0000181 const GLint *length)
Michal Krol1d7f7192005-03-25 12:12:50 +0000182{
183 GET_CURRENT_CONTEXT(ctx);
Michal Krol1d7f7192005-03-25 12:12:50 +0000184 GLint *offsets;
185 GLsizei i;
186 GLcharARB *source;
Michal Krol9ac96052006-02-27 14:41:41 +0000187 GET_SHADER(sha, shaderObj, "glShaderSourceARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000188
Michal Krol1d7f7192005-03-25 12:12:50 +0000189 if (sha == NULL)
Brian Paul93269622006-04-14 03:43:39 +0000190 return;
191
192 if (string == NULL)
193 {
194 RELEASE_SHADER(sha);
195 _mesa_error (ctx, GL_INVALID_VALUE, "glShaderSourceARB");
196 return;
Michal Krol07135702006-03-21 10:37:40 +0000197 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000198
Michal Krol9ac96052006-02-27 14:41:41 +0000199 /*
200 * This array holds offsets of where the appropriate string ends, thus the last
201 * element will be set to the total length of the source code.
202 */
Michal Krol1d7f7192005-03-25 12:12:50 +0000203 offsets = (GLint *) _mesa_malloc (count * sizeof (GLint));
204 if (offsets == NULL)
205 {
Michal Krol9ac96052006-02-27 14:41:41 +0000206 RELEASE_SHADER(sha);
Michal Krol1d7f7192005-03-25 12:12:50 +0000207 _mesa_error (ctx, GL_OUT_OF_MEMORY, "glShaderSourceARB");
208 return;
209 }
210
211 for (i = 0; i < count; i++)
Brian Paul93269622006-04-14 03:43:39 +0000212 {
213 if (string[i] == NULL)
214 {
215 _mesa_free ((GLvoid *) offsets);
216 RELEASE_SHADER(sha);
217 _mesa_error (ctx, GL_INVALID_VALUE, "glShaderSourceARB");
218 return;
Michal Krol07135702006-03-21 10:37:40 +0000219 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000220 if (length == NULL || length[i] < 0)
221 offsets[i] = _mesa_strlen (string[i]);
222 else
223 offsets[i] = length[i];
224 /* accumulate string lengths */
225 if (i > 0)
226 offsets[i] += offsets[i - 1];
227 }
228
229 source = (GLcharARB *) _mesa_malloc ((offsets[count - 1] + 1) * sizeof (GLcharARB));
230 if (source == NULL)
231 {
Michal Krol9ac96052006-02-27 14:41:41 +0000232 _mesa_free ((GLvoid *) offsets);
233 RELEASE_SHADER(sha);
Michal Krol1d7f7192005-03-25 12:12:50 +0000234 _mesa_error (ctx, GL_OUT_OF_MEMORY, "glShaderSourceARB");
235 return;
236 }
237
238 for (i = 0; i < count; i++)
239 {
240 GLint start = (i > 0) ? offsets[i - 1] : 0;
241 _mesa_memcpy (source + start, string[i], (offsets[i] - start) * sizeof (GLcharARB));
242 }
243 source[offsets[count - 1]] = '\0';
244
245 (**sha).SetSource (sha, source, offsets, count);
Michal Krol9ac96052006-02-27 14:41:41 +0000246 RELEASE_SHADER(sha);
Michal Krolc1fe4692004-10-27 17:09:10 +0000247}
248
Michal Krol9ac96052006-02-27 14:41:41 +0000249GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000250_mesa_CompileShaderARB (GLhandleARB shaderObj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000251{
252 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000253 GET_SHADER(sha, shaderObj, "glCompileShaderARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000254
Michal Krol9ac96052006-02-27 14:41:41 +0000255 if (sha != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000256 {
Michal Krol9ac96052006-02-27 14:41:41 +0000257 (**sha).Compile (sha);
258 RELEASE_SHADER(sha);
Michal Krol1d7f7192005-03-25 12:12:50 +0000259 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000260}
261
262GLhandleARB GLAPIENTRY
Michal Krol9ac96052006-02-27 14:41:41 +0000263_mesa_CreateProgramObjectARB (GLvoid)
Michal Krolc1fe4692004-10-27 17:09:10 +0000264{
Michal Krol6324f732005-01-13 14:12:50 +0000265 return _mesa_3dlabs_create_program_object ();
Michal Krolc1fe4692004-10-27 17:09:10 +0000266}
267
Michal Krol9ac96052006-02-27 14:41:41 +0000268GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000269_mesa_AttachObjectARB (GLhandleARB containerObj, GLhandleARB obj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000270{
271 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000272 GET_CONTAINER(con, containerObj, "glAttachObjectARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000273
Michal Krol9ac96052006-02-27 14:41:41 +0000274 if (con != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000275 {
Michal Krol9ac96052006-02-27 14:41:41 +0000276 GET_GENERIC(att, obj, "glAttachObjectARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000277
Michal Krol9ac96052006-02-27 14:41:41 +0000278 if (att != NULL)
279 {
280 (**con).Attach (con, att);
281 RELEASE_GENERIC(att);
282 }
283 RELEASE_CONTAINER(con);
Michal Krol1d7f7192005-03-25 12:12:50 +0000284 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000285}
286
Michal Krol9ac96052006-02-27 14:41:41 +0000287GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000288_mesa_LinkProgramARB (GLhandleARB programObj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000289{
290 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000291 GET_PROGRAM(pro, programObj, "glLinkProgramARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000292
Michal Krol9ac96052006-02-27 14:41:41 +0000293 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000294 {
Brian Paul93269622006-04-14 03:43:39 +0000295 (**pro).Link (pro);
296 if (pro == ctx->ShaderObjects.CurrentProgram)
297 {
298 if ((**pro).GetLinkStatus (pro))
299 _mesa_UseProgramObjectARB (programObj);
300 else
301 _mesa_UseProgramObjectARB (0);
Michal Krol9ac96052006-02-27 14:41:41 +0000302 }
Michal Krol9ac96052006-02-27 14:41:41 +0000303 RELEASE_PROGRAM(pro);
Michal Krol1d7f7192005-03-25 12:12:50 +0000304 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000305}
306
Michal Krol9ac96052006-02-27 14:41:41 +0000307GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000308_mesa_UseProgramObjectARB (GLhandleARB programObj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000309{
310 GET_CURRENT_CONTEXT(ctx);
Michal Krola1a02e62006-05-16 09:40:30 +0000311 struct gl2_program_intf **program = NULL;
Michal Krol9ac96052006-02-27 14:41:41 +0000312
Michal Krolcc159162006-02-21 12:35:06 +0000313 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000314
Michal Krol9ac96052006-02-27 14:41:41 +0000315 if (programObj != 0)
Brian Paul93269622006-04-14 03:43:39 +0000316 {
Michal Krol9ac96052006-02-27 14:41:41 +0000317 GET_PROGRAM(pro, programObj, "glUseProgramObjectARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000318
Michal Krol1d7f7192005-03-25 12:12:50 +0000319 if (pro == NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000320 return;
Michal Krol1d7f7192005-03-25 12:12:50 +0000321
322 if ((**pro).GetLinkStatus (pro) == GL_FALSE)
323 {
Michal Krol9ac96052006-02-27 14:41:41 +0000324 RELEASE_PROGRAM(pro);
Michal Krol1d7f7192005-03-25 12:12:50 +0000325 _mesa_error (ctx, GL_INVALID_OPERATION, "glUseProgramObjectARB");
326 return;
327 }
Michal Krol9ac96052006-02-27 14:41:41 +0000328
Brian Paul93269622006-04-14 03:43:39 +0000329 program = pro;
330
331 ctx->ShaderObjects._VertexShaderPresent = (**pro).IsShaderPresent (pro, GL_VERTEX_SHADER_ARB);
332 ctx->ShaderObjects._FragmentShaderPresent = (**pro).IsShaderPresent (pro,
Michal Krol07135702006-03-21 10:37:40 +0000333 GL_FRAGMENT_SHADER_ARB);
Brian Paul93269622006-04-14 03:43:39 +0000334 }
335 else
336 {
337 ctx->ShaderObjects._VertexShaderPresent = GL_FALSE;
338 ctx->ShaderObjects._FragmentShaderPresent = GL_FALSE;
Michal Krol1d7f7192005-03-25 12:12:50 +0000339 }
340
Michal Krol44e9ccc2006-02-13 11:31:16 +0000341 if (ctx->ShaderObjects.CurrentProgram != NULL)
Michal Krol9ac96052006-02-27 14:41:41 +0000342 RELEASE_PROGRAM(ctx->ShaderObjects.CurrentProgram);
343 ctx->ShaderObjects.CurrentProgram = program;
Michal Krolc1fe4692004-10-27 17:09:10 +0000344}
345
Michal Krol9ac96052006-02-27 14:41:41 +0000346GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000347_mesa_ValidateProgramARB (GLhandleARB programObj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000348{
349 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000350 GET_PROGRAM(pro, programObj, "glValidateProgramARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000351
Michal Krol9ac96052006-02-27 14:41:41 +0000352 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000353 {
Michal Krol9ac96052006-02-27 14:41:41 +0000354 (**pro).Validate (pro);
355 RELEASE_PROGRAM(pro);
Michal Krol1d7f7192005-03-25 12:12:50 +0000356 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000357}
358
Michal Krol9ac96052006-02-27 14:41:41 +0000359GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000360_mesa_Uniform1fARB (GLint location, GLfloat v0)
Michal Krol9ac96052006-02-27 14:41:41 +0000361{
362 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000363 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform1fARB");
364
Michal Krol8af48fc2006-03-14 11:23:16 +0000365 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol9ac96052006-02-27 14:41:41 +0000366
367 if (pro != NULL)
368 {
Michal Krold55de652006-04-18 10:30:29 +0000369 if (!(**pro).WriteUniform (pro, location, 1, &v0, GL_FLOAT))
Michal Krol9ac96052006-02-27 14:41:41 +0000370 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform1fARB");
371 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000372}
373
Michal Krol9ac96052006-02-27 14:41:41 +0000374GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000375_mesa_Uniform2fARB (GLint location, GLfloat v0, GLfloat v1)
Michal Krol1d7f7192005-03-25 12:12:50 +0000376{
377 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000378 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform2fARB");
379
Michal Krol8af48fc2006-03-14 11:23:16 +0000380 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000381
Michal Krol9ac96052006-02-27 14:41:41 +0000382 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000383 {
Brian Paul93269622006-04-14 03:43:39 +0000384 GLfloat v[2];
385 v[0] = v0;
386 v[1] = v1;
Michal Krol9ac96052006-02-27 14:41:41 +0000387
Michal Krold55de652006-04-18 10:30:29 +0000388 if (!(**pro).WriteUniform (pro, location, 1, v, GL_FLOAT_VEC2))
Michal Krol9ac96052006-02-27 14:41:41 +0000389 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform2fARB");
Michal Krol6324f732005-01-13 14:12:50 +0000390 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000391}
392
Michal Krol9ac96052006-02-27 14:41:41 +0000393GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000394_mesa_Uniform3fARB (GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
Michal Krol1d7f7192005-03-25 12:12:50 +0000395{
396 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000397 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform3fARB");
398
Michal Krol8af48fc2006-03-14 11:23:16 +0000399 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000400
Michal Krol9ac96052006-02-27 14:41:41 +0000401 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000402 {
Brian Paul93269622006-04-14 03:43:39 +0000403 GLfloat v[3];
404 v[0] = v0;
405 v[1] = v1;
406 v[2] = v2;
Michal Krol9ac96052006-02-27 14:41:41 +0000407
Michal Krold55de652006-04-18 10:30:29 +0000408 if (!(**pro).WriteUniform (pro, location, 1, v, GL_FLOAT_VEC3))
Michal Krol9ac96052006-02-27 14:41:41 +0000409 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform3fARB");
Michal Krol6324f732005-01-13 14:12:50 +0000410 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000411}
412
Michal Krol9ac96052006-02-27 14:41:41 +0000413GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000414_mesa_Uniform4fARB (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
Michal Krol1d7f7192005-03-25 12:12:50 +0000415{
416 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000417 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform4fARB");
418
Michal Krol8af48fc2006-03-14 11:23:16 +0000419 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000420
Michal Krol9ac96052006-02-27 14:41:41 +0000421 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000422 {
Brian Paul93269622006-04-14 03:43:39 +0000423 GLfloat v[4];
424 v[0] = v0;
425 v[1] = v1;
426 v[2] = v2;
427 v[3] = v3;
Michal Krol9ac96052006-02-27 14:41:41 +0000428
Michal Krold55de652006-04-18 10:30:29 +0000429 if (!(**pro).WriteUniform (pro, location, 1, v, GL_FLOAT_VEC4))
Michal Krol9ac96052006-02-27 14:41:41 +0000430 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform4fARB");
Michal Krol6324f732005-01-13 14:12:50 +0000431 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000432}
433
Michal Krol9ac96052006-02-27 14:41:41 +0000434GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000435_mesa_Uniform1iARB (GLint location, GLint v0)
Michal Krol1d7f7192005-03-25 12:12:50 +0000436{
437 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000438 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform1iARB");
439
Michal Krol8af48fc2006-03-14 11:23:16 +0000440 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000441
Michal Krol9ac96052006-02-27 14:41:41 +0000442 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000443 {
Michal Krold55de652006-04-18 10:30:29 +0000444 if (!(**pro).WriteUniform (pro, location, 1, &v0, GL_INT))
Michal Krol9ac96052006-02-27 14:41:41 +0000445 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform1iARB");
Michal Krol6324f732005-01-13 14:12:50 +0000446 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000447}
448
Michal Krol9ac96052006-02-27 14:41:41 +0000449GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000450_mesa_Uniform2iARB (GLint location, GLint v0, GLint v1)
Michal Krol1d7f7192005-03-25 12:12:50 +0000451{
452 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000453 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform2iARB");
454
Michal Krol8af48fc2006-03-14 11:23:16 +0000455 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000456
Michal Krol9ac96052006-02-27 14:41:41 +0000457 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000458 {
Brian Paul93269622006-04-14 03:43:39 +0000459 GLint v[2];
460 v[0] = v0;
461 v[1] = v1;
Michal Krol9ac96052006-02-27 14:41:41 +0000462
Michal Krold55de652006-04-18 10:30:29 +0000463 if (!(**pro).WriteUniform (pro, location, 1, v, GL_INT_VEC2))
Michal Krol9ac96052006-02-27 14:41:41 +0000464 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform2iARB");
Michal Krol6324f732005-01-13 14:12:50 +0000465 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000466}
467
Michal Krol9ac96052006-02-27 14:41:41 +0000468GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000469_mesa_Uniform3iARB (GLint location, GLint v0, GLint v1, GLint v2)
Michal Krol1d7f7192005-03-25 12:12:50 +0000470{
471 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000472 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform3iARB");
473
Michal Krol8af48fc2006-03-14 11:23:16 +0000474 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
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 {
Brian Paul93269622006-04-14 03:43:39 +0000478 GLint v[3];
479 v[0] = v0;
480 v[1] = v1;
481 v[2] = v2;
Michal Krol9ac96052006-02-27 14:41:41 +0000482
Michal Krold55de652006-04-18 10:30:29 +0000483 if (!(**pro).WriteUniform (pro, location, 1, v, GL_INT_VEC3))
Michal Krol9ac96052006-02-27 14:41:41 +0000484 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform3iARB");
Michal Krol6324f732005-01-13 14:12:50 +0000485 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000486}
487
Michal Krol9ac96052006-02-27 14:41:41 +0000488GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000489_mesa_Uniform4iARB (GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
Michal Krol1d7f7192005-03-25 12:12:50 +0000490{
491 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000492 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform4iARB");
493
Michal Krol8af48fc2006-03-14 11:23:16 +0000494 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000495
Michal Krol9ac96052006-02-27 14:41:41 +0000496 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000497 {
Brian Paul93269622006-04-14 03:43:39 +0000498 GLint v[4];
499 v[0] = v0;
500 v[1] = v1;
501 v[2] = v2;
502 v[3] = v3;
Michal Krol9ac96052006-02-27 14:41:41 +0000503
Michal Krold55de652006-04-18 10:30:29 +0000504 if (!(**pro).WriteUniform (pro, location, 1, v, GL_INT_VEC4))
Michal Krol9ac96052006-02-27 14:41:41 +0000505 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform4iARB");
Michal Krol6324f732005-01-13 14:12:50 +0000506 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000507}
508
Michal Krol9ac96052006-02-27 14:41:41 +0000509GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000510_mesa_Uniform1fvARB (GLint location, GLsizei count, const GLfloat *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000511{
512 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000513 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform1fvARB");
514
Michal Krold55de652006-04-18 10:30:29 +0000515 if (value == NULL)
516 {
517 _mesa_error (ctx, GL_INVALID_VALUE, "glUniform1fvARB");
518 return;
519 }
520
Michal Krol8af48fc2006-03-14 11:23:16 +0000521 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000522
Michal Krol9ac96052006-02-27 14:41:41 +0000523 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000524 {
Michal Krold55de652006-04-18 10:30:29 +0000525 if (!(**pro).WriteUniform (pro, location, count, value, GL_FLOAT))
Michal Krol9ac96052006-02-27 14:41:41 +0000526 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform1fvARB");
Michal Krol6324f732005-01-13 14:12:50 +0000527 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000528}
529
Michal Krol9ac96052006-02-27 14:41:41 +0000530GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000531_mesa_Uniform2fvARB (GLint location, GLsizei count, const GLfloat *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000532{
533 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000534 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform2fvARB");
535
Michal Krold55de652006-04-18 10:30:29 +0000536 if (value == NULL)
537 {
538 _mesa_error (ctx, GL_INVALID_VALUE, "glUniform2fvARB");
539 return;
540 }
541
Michal Krol8af48fc2006-03-14 11:23:16 +0000542 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000543
Michal Krol9ac96052006-02-27 14:41:41 +0000544 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000545 {
Michal Krold55de652006-04-18 10:30:29 +0000546 if (!(**pro).WriteUniform (pro, location, count, value, GL_FLOAT_VEC2))
Michal Krol9ac96052006-02-27 14:41:41 +0000547 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform2fvARB");
Michal Krol6324f732005-01-13 14:12:50 +0000548 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000549}
550
Michal Krol9ac96052006-02-27 14:41:41 +0000551GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000552_mesa_Uniform3fvARB (GLint location, GLsizei count, const GLfloat *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000553{
554 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000555 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform3fvARB");
556
Michal Krold55de652006-04-18 10:30:29 +0000557 if (value == NULL)
558 {
559 _mesa_error (ctx, GL_INVALID_VALUE, "glUniform3fvARB");
560 return;
561 }
562
Michal Krol8af48fc2006-03-14 11:23:16 +0000563 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000564
Michal Krol9ac96052006-02-27 14:41:41 +0000565 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000566 {
Michal Krold55de652006-04-18 10:30:29 +0000567 if (!(**pro).WriteUniform (pro, location, count, value, GL_FLOAT_VEC3))
Michal Krol9ac96052006-02-27 14:41:41 +0000568 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform3fvARB");
Michal Krol6324f732005-01-13 14:12:50 +0000569 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000570}
571
Michal Krol9ac96052006-02-27 14:41:41 +0000572GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000573_mesa_Uniform4fvARB (GLint location, GLsizei count, const GLfloat *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000574{
Michal Krol9ac96052006-02-27 14:41:41 +0000575 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000576 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform4fvARB");
577
Michal Krold55de652006-04-18 10:30:29 +0000578 if (value == NULL)
579 {
580 _mesa_error (ctx, GL_INVALID_VALUE, "glUniform4fvARB");
581 return;
582 }
583
Michal Krol8af48fc2006-03-14 11:23:16 +0000584 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000585
Michal Krol9ac96052006-02-27 14:41:41 +0000586 if (pro != NULL)
587 {
Michal Krold55de652006-04-18 10:30:29 +0000588 if (!(**pro).WriteUniform (pro, location, count, value, GL_FLOAT_VEC4))
Michal Krol9ac96052006-02-27 14:41:41 +0000589 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform4fvARB");
590 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000591}
592
Michal Krol9ac96052006-02-27 14:41:41 +0000593GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000594_mesa_Uniform1ivARB (GLint location, GLsizei count, const GLint *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000595{
596 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000597 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform1ivARB");
598
Michal Krold55de652006-04-18 10:30:29 +0000599 if (value == NULL)
600 {
601 _mesa_error (ctx, GL_INVALID_VALUE, "glUniform1ivARB");
602 return;
603 }
604
Michal Krol8af48fc2006-03-14 11:23:16 +0000605 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000606
Michal Krol9ac96052006-02-27 14:41:41 +0000607 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000608 {
Michal Krold55de652006-04-18 10:30:29 +0000609 if (!(**pro).WriteUniform (pro, location, count, value, GL_INT))
Michal Krol9ac96052006-02-27 14:41:41 +0000610 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform1ivARB");
Michal Krol6324f732005-01-13 14:12:50 +0000611 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000612}
613
Michal Krol9ac96052006-02-27 14:41:41 +0000614GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000615_mesa_Uniform2ivARB (GLint location, GLsizei count, const GLint *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000616{
617 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000618 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform2ivARB");
619
Michal Krold55de652006-04-18 10:30:29 +0000620 if (value == NULL)
621 {
622 _mesa_error (ctx, GL_INVALID_VALUE, "glUniform2ivARB");
623 return;
624 }
625
Michal Krol8af48fc2006-03-14 11:23:16 +0000626 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000627
Michal Krol9ac96052006-02-27 14:41:41 +0000628 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000629 {
Michal Krold55de652006-04-18 10:30:29 +0000630 if (!(**pro).WriteUniform (pro, location, count, value, GL_INT_VEC2))
Michal Krol9ac96052006-02-27 14:41:41 +0000631 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform2ivARB");
Michal Krol6324f732005-01-13 14:12:50 +0000632 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000633}
634
Michal Krol9ac96052006-02-27 14:41:41 +0000635GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000636_mesa_Uniform3ivARB (GLint location, GLsizei count, const GLint *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000637{
638 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000639 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform3ivARB");
640
Michal Krold55de652006-04-18 10:30:29 +0000641 if (value == NULL)
642 {
643 _mesa_error (ctx, GL_INVALID_VALUE, "glUniform3ivARB");
644 return;
645 }
646
Michal Krol8af48fc2006-03-14 11:23:16 +0000647 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000648
Michal Krol9ac96052006-02-27 14:41:41 +0000649 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000650 {
Michal Krold55de652006-04-18 10:30:29 +0000651 if (!(**pro).WriteUniform (pro, location, count, value, GL_INT_VEC3))
Michal Krol9ac96052006-02-27 14:41:41 +0000652 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform3ivARB");
Michal Krol6324f732005-01-13 14:12:50 +0000653 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000654}
655
Michal Krol9ac96052006-02-27 14:41:41 +0000656GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000657_mesa_Uniform4ivARB (GLint location, GLsizei count, const GLint *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000658{
659 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000660 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform4ivARB");
661
Michal Krold55de652006-04-18 10:30:29 +0000662 if (value == NULL)
663 {
664 _mesa_error (ctx, GL_INVALID_VALUE, "glUniform4ivARB");
665 return;
666 }
667
Michal Krol8af48fc2006-03-14 11:23:16 +0000668 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000669
Michal Krol9ac96052006-02-27 14:41:41 +0000670 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000671 {
Michal Krold55de652006-04-18 10:30:29 +0000672 if (!(**pro).WriteUniform (pro, location, count, value, GL_INT_VEC4))
Michal Krol9ac96052006-02-27 14:41:41 +0000673 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform4ivARB");
Michal Krol6324f732005-01-13 14:12:50 +0000674 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000675}
676
Michal Krol9ac96052006-02-27 14:41:41 +0000677GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000678_mesa_UniformMatrix2fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000679{
680 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000681 GET_CURRENT_LINKED_PROGRAM(pro, "glUniformMatrix2fvARB");
682
Michal Krold55de652006-04-18 10:30:29 +0000683 if (value == NULL)
684 {
685 _mesa_error (ctx, GL_INVALID_VALUE, "glUniformMatrix2fvARB");
686 return;
687 }
688
Michal Krol8af48fc2006-03-14 11:23:16 +0000689 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000690
Michal Krol9ac96052006-02-27 14:41:41 +0000691 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000692 {
Michal Krol9ac96052006-02-27 14:41:41 +0000693 if (transpose)
694 {
695 GLfloat *trans, *pt;
696 const GLfloat *pv;
697
698 trans = (GLfloat *) _mesa_malloc (count * 4 * sizeof (GLfloat));
699 if (trans == NULL)
700 {
701 _mesa_error (ctx, GL_OUT_OF_MEMORY, "glUniformMatrix2fvARB");
702 return;
703 }
704 for (pt = trans, pv = value; pt != trans + count * 4; pt += 4, pv += 4)
705 {
706 pt[0] = pv[0];
707 pt[1] = pv[2];
708 pt[2] = pv[1];
709 pt[3] = pv[3];
710 }
Michal Krold55de652006-04-18 10:30:29 +0000711 if (!(**pro).WriteUniform (pro, location, count, trans, GL_FLOAT_MAT2))
Michal Krol9ac96052006-02-27 14:41:41 +0000712 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniformMatrix2fvARB");
713 _mesa_free (trans);
714 }
715 else
716 {
Michal Krold55de652006-04-18 10:30:29 +0000717 if (!(**pro).WriteUniform (pro, location, count, value, GL_FLOAT_MAT2))
Michal Krol9ac96052006-02-27 14:41:41 +0000718 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniformMatrix2fvARB");
719 }
Michal Krol6324f732005-01-13 14:12:50 +0000720 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000721}
722
Michal Krol9ac96052006-02-27 14:41:41 +0000723GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000724_mesa_UniformMatrix3fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000725{
726 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000727 GET_CURRENT_LINKED_PROGRAM(pro, "glUniformMatrix3fvARB");
728
Michal Krold55de652006-04-18 10:30:29 +0000729 if (value == NULL)
730 {
731 _mesa_error (ctx, GL_INVALID_VALUE, "glUniformMatrix3fvARB");
732 return;
733 }
734
Michal Krol8af48fc2006-03-14 11:23:16 +0000735 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000736
Michal Krol9ac96052006-02-27 14:41:41 +0000737 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000738 {
Michal Krol9ac96052006-02-27 14:41:41 +0000739 if (transpose)
740 {
741 GLfloat *trans, *pt;
742 const GLfloat *pv;
743
744 trans = (GLfloat *) _mesa_malloc (count * 9 * sizeof (GLfloat));
745 if (trans == NULL)
746 {
747 _mesa_error (ctx, GL_OUT_OF_MEMORY, "glUniformMatrix3fvARB");
748 return;
749 }
750 for (pt = trans, pv = value; pt != trans + count * 9; pt += 9, pv += 9)
751 {
752 pt[0] = pv[0];
753 pt[1] = pv[3];
754 pt[2] = pv[6];
755 pt[3] = pv[1];
756 pt[4] = pv[4];
757 pt[5] = pv[7];
758 pt[6] = pv[2];
759 pt[7] = pv[5];
760 pt[8] = pv[8];
761 }
Michal Krold55de652006-04-18 10:30:29 +0000762 if (!(**pro).WriteUniform (pro, location, count, trans, GL_FLOAT_MAT3))
Michal Krol9ac96052006-02-27 14:41:41 +0000763 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniformMatrix3fvARB");
764 _mesa_free (trans);
765 }
766 else
767 {
Michal Krold55de652006-04-18 10:30:29 +0000768 if (!(**pro).WriteUniform (pro, location, count, value, GL_FLOAT_MAT3))
Michal Krol9ac96052006-02-27 14:41:41 +0000769 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniformMatrix3fvARB");
770 }
Michal Krol6324f732005-01-13 14:12:50 +0000771 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000772}
773
Michal Krol9ac96052006-02-27 14:41:41 +0000774GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000775_mesa_UniformMatrix4fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000776{
777 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000778 GET_CURRENT_LINKED_PROGRAM(pro, "glUniformMatrix4fvARB");
779
Michal Krold55de652006-04-18 10:30:29 +0000780 if (value == NULL)
781 {
782 _mesa_error (ctx, GL_INVALID_VALUE, "glUniformMatrix4fvARB");
783 return;
784 }
785
Michal Krol8af48fc2006-03-14 11:23:16 +0000786 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000787
Michal Krol9ac96052006-02-27 14:41:41 +0000788 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000789 {
Michal Krol9ac96052006-02-27 14:41:41 +0000790 if (transpose)
791 {
792 GLfloat *trans, *pt;
793 const GLfloat *pv;
794
795 trans = (GLfloat *) _mesa_malloc (count * 16 * sizeof (GLfloat));
796 if (trans == NULL)
797 {
798 _mesa_error (ctx, GL_OUT_OF_MEMORY, "glUniformMatrix4fvARB");
799 return;
800 }
801 for (pt = trans, pv = value; pt != trans + count * 16; pt += 16, pv += 16)
802 {
803 _math_transposef (pt, pv);
804 }
Michal Krold55de652006-04-18 10:30:29 +0000805 if (!(**pro).WriteUniform (pro, location, count, trans, GL_FLOAT_MAT4))
Michal Krol9ac96052006-02-27 14:41:41 +0000806 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniformMatrix4fvARB");
807 _mesa_free (trans);
808 }
809 else
810 {
Michal Krold55de652006-04-18 10:30:29 +0000811 if (!(**pro).WriteUniform (pro, location, count, value, GL_FLOAT_MAT4))
Michal Krol9ac96052006-02-27 14:41:41 +0000812 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniformMatrix4fvARB");
813 }
Michal Krol6324f732005-01-13 14:12:50 +0000814 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000815}
816
817static GLboolean
818_mesa_get_object_parameter (GLhandleARB obj, GLenum pname, GLvoid *params, GLboolean *integral,
819 GLint *size)
820{
821 GET_CURRENT_CONTEXT(ctx);
Michal Krol1d7f7192005-03-25 12:12:50 +0000822 GLint *ipar = (GLint *) params;
Michal Krol1d7f7192005-03-25 12:12:50 +0000823
824 /* set default values */
825 *integral = GL_TRUE; /* indicates param type, TRUE: GLint, FALSE: GLfloat */
Michal Krol9ac96052006-02-27 14:41:41 +0000826 *size = 1; /* param array size */
Michal Krol1d7f7192005-03-25 12:12:50 +0000827
828 switch (pname)
829 {
830 case GL_OBJECT_TYPE_ARB:
Michal Krol9ac96052006-02-27 14:41:41 +0000831 case GL_OBJECT_DELETE_STATUS_ARB:
832 case GL_OBJECT_INFO_LOG_LENGTH_ARB:
833 {
834 GET_GENERIC(gen, obj, "glGetObjectParameterivARB");
835
836 if (gen == NULL)
837 return GL_FALSE;
838
839 switch (pname)
840 {
841 case GL_OBJECT_TYPE_ARB:
842 *ipar = (**gen).GetType (gen);
843 break;
844 case GL_OBJECT_DELETE_STATUS_ARB:
845 *ipar = (**gen).GetDeleteStatus (gen);
846 break;
Michal Krola1a02e62006-05-16 09:40:30 +0000847 case GL_OBJECT_INFO_LOG_LENGTH_ARB:
848 *ipar = (**gen).GetInfoLogLength (gen);
849 break;
Michal Krol9ac96052006-02-27 14:41:41 +0000850 }
851
852 RELEASE_GENERIC(gen);
Michal Krol1d7f7192005-03-25 12:12:50 +0000853 }
854 break;
Michal Krol9ac96052006-02-27 14:41:41 +0000855 case GL_OBJECT_SUBTYPE_ARB:
Michal Krol1d7f7192005-03-25 12:12:50 +0000856 case GL_OBJECT_COMPILE_STATUS_ARB:
Michal Krol9ac96052006-02-27 14:41:41 +0000857 case GL_OBJECT_SHADER_SOURCE_LENGTH_ARB:
858 {
859 GET_SHADER(sha, obj, "glGetObjectParameterivARB");
860
861 if (sha == NULL)
862 return GL_FALSE;
863
864 switch (pname)
865 {
866 case GL_OBJECT_SUBTYPE_ARB:
867 *ipar = (**sha).GetSubType (sha);
868 break;
869 case GL_OBJECT_COMPILE_STATUS_ARB:
870 *ipar = (**sha).GetCompileStatus (sha);
871 break;
872 case GL_OBJECT_SHADER_SOURCE_LENGTH_ARB:
873 {
874 const GLcharARB *src = (**sha).GetSource (sha);
875
876 if (src == NULL)
877 *ipar = 0;
878 else
879 *ipar = _mesa_strlen (src) + 1;
880 }
881 break;
882 }
883
884 RELEASE_SHADER(sha);
Michal Krol1d7f7192005-03-25 12:12:50 +0000885 }
886 break;
887 case GL_OBJECT_LINK_STATUS_ARB:
Michal Krol1d7f7192005-03-25 12:12:50 +0000888 case GL_OBJECT_VALIDATE_STATUS_ARB:
Michal Krol1d7f7192005-03-25 12:12:50 +0000889 case GL_OBJECT_ATTACHED_OBJECTS_ARB:
Michal Krol1d7f7192005-03-25 12:12:50 +0000890 case GL_OBJECT_ACTIVE_UNIFORMS_ARB:
Michal Krol1d7f7192005-03-25 12:12:50 +0000891 case GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB:
Michal Krol9ac96052006-02-27 14:41:41 +0000892 {
893 GET_PROGRAM(pro, obj, "glGetObjectParameterivARB");
894
895 if (pro == NULL)
896 return GL_FALSE;
897
898 switch (pname)
899 {
900 case GL_OBJECT_LINK_STATUS_ARB:
901 *ipar = (**pro).GetLinkStatus (pro);
902 break;
903 case GL_OBJECT_VALIDATE_STATUS_ARB:
904 *ipar = (**pro).GetValidateStatus (pro);
905 break;
Michal Krola1a02e62006-05-16 09:40:30 +0000906 case GL_OBJECT_ATTACHED_OBJECTS_ARB:
907 *ipar = (**pro)._container.GetAttachedCount ((struct gl2_container_intf **) (pro));
908 break;
Michal Krol9ac96052006-02-27 14:41:41 +0000909 case GL_OBJECT_ACTIVE_UNIFORMS_ARB:
Michal Krold55de652006-04-18 10:30:29 +0000910 *ipar = (**pro).GetActiveUniformCount (pro);
Michal Krol9ac96052006-02-27 14:41:41 +0000911 break;
912 case GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB:
Michal Krold55de652006-04-18 10:30:29 +0000913 *ipar = (**pro).GetActiveUniformMaxLength (pro);
914 break;
915 case GL_OBJECT_ACTIVE_ATTRIBUTES_ARB:
916 *ipar = (**pro).GetActiveAttribCount (pro);
917 break;
918 case GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB:
919 *ipar = (**pro).GetActiveAttribMaxLength (pro);
Michal Krol9ac96052006-02-27 14:41:41 +0000920 break;
921 }
922
923 RELEASE_PROGRAM(pro);
Michal Krol1d7f7192005-03-25 12:12:50 +0000924 }
925 break;
926 default:
927 _mesa_error (ctx, GL_INVALID_ENUM, "glGetObjectParameterivARB");
Michal Krol9ac96052006-02-27 14:41:41 +0000928 return GL_FALSE;
Michal Krol1d7f7192005-03-25 12:12:50 +0000929 }
930
Michal Krol9ac96052006-02-27 14:41:41 +0000931 return GL_TRUE;
Michal Krol1d7f7192005-03-25 12:12:50 +0000932}
933
Michal Krol9ac96052006-02-27 14:41:41 +0000934GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000935_mesa_GetObjectParameterfvARB (GLhandleARB obj, GLenum pname, GLfloat *params)
Michal Krol1d7f7192005-03-25 12:12:50 +0000936{
Michal Krold55de652006-04-18 10:30:29 +0000937 GET_CURRENT_CONTEXT(ctx);
Michal Krol1d7f7192005-03-25 12:12:50 +0000938 GLboolean integral;
Michal Krol9ac96052006-02-27 14:41:41 +0000939 GLint size;
Michal Krol1d7f7192005-03-25 12:12:50 +0000940
Michal Krold55de652006-04-18 10:30:29 +0000941 if (params == NULL)
942 {
943 _mesa_error (ctx, GL_INVALID_VALUE, "glGetObjectParameterfvARB");
944 return;
945 }
946
Michal Krol1d7f7192005-03-25 12:12:50 +0000947 assert (sizeof (GLfloat) == sizeof (GLint));
948
Michal Krol9ac96052006-02-27 14:41:41 +0000949 if (_mesa_get_object_parameter (obj, pname, (GLvoid *) params, &integral, &size))
950 if (integral)
951 {
952 GLint i;
953
Michal Krol1d7f7192005-03-25 12:12:50 +0000954 for (i = 0; i < size; i++)
955 params[i] = (GLfloat) ((GLint *) params)[i];
Michal Krol9ac96052006-02-27 14:41:41 +0000956 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000957}
958
Michal Krol9ac96052006-02-27 14:41:41 +0000959GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000960_mesa_GetObjectParameterivARB (GLhandleARB obj, GLenum pname, GLint *params)
Michal Krol1d7f7192005-03-25 12:12:50 +0000961{
Michal Krold55de652006-04-18 10:30:29 +0000962 GET_CURRENT_CONTEXT(ctx);
Michal Krol1d7f7192005-03-25 12:12:50 +0000963 GLboolean integral;
Michal Krol9ac96052006-02-27 14:41:41 +0000964 GLint size;
Michal Krol1d7f7192005-03-25 12:12:50 +0000965
Michal Krold55de652006-04-18 10:30:29 +0000966 if (params == NULL)
967 {
968 _mesa_error (ctx, GL_INVALID_VALUE, "glGetObjectParameterivARB");
969 return;
970 }
971
Michal Krol1d7f7192005-03-25 12:12:50 +0000972 assert (sizeof (GLfloat) == sizeof (GLint));
973
Michal Krol9ac96052006-02-27 14:41:41 +0000974 if (_mesa_get_object_parameter (obj, pname, (GLvoid *) params, &integral, &size))
975 if (!integral)
976 {
977 GLint i;
978
Michal Krol1d7f7192005-03-25 12:12:50 +0000979 for (i = 0; i < size; i++)
980 params[i] = (GLint) ((GLfloat *) params)[i];
Michal Krol9ac96052006-02-27 14:41:41 +0000981 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000982}
983
Brian Paul93269622006-04-14 03:43:39 +0000984
985/**
986 * Copy string from <src> to <dst>, up to maxLength characters, returning
987 * length of <dst> in <length>.
988 * \param src the strings source
989 * \param maxLength max chars to copy
990 * \param length returns numberof chars copied
991 * \param dst the string destination
992 */
Michal Krol9ac96052006-02-27 14:41:41 +0000993static GLvoid
Brian Paul93269622006-04-14 03:43:39 +0000994copy_string(const GLcharARB *src, GLsizei maxLength, GLsizei *length,
995 GLcharARB *dst)
Michal Krol1d7f7192005-03-25 12:12:50 +0000996{
997 GLsizei len;
Brian Paul93269622006-04-14 03:43:39 +0000998 for (len = 0; len < maxLength - 1 && src && src[len]; len++)
999 dst[len] = src[len];
1000 if (maxLength > 0)
1001 dst[len] = 0;
1002 if (length)
Michal Krol6324f732005-01-13 14:12:50 +00001003 *length = len;
Michal Krolc1fe4692004-10-27 17:09:10 +00001004}
1005
Brian Paul93269622006-04-14 03:43:39 +00001006
Michal Krol9ac96052006-02-27 14:41:41 +00001007GLvoid GLAPIENTRY
Michal Krol1d7f7192005-03-25 12:12:50 +00001008_mesa_GetInfoLogARB (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog)
1009{
1010 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +00001011 GET_GENERIC(gen, obj, "glGetInfoLogARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001012
Michal Krold55de652006-04-18 10:30:29 +00001013 if (gen == NULL)
1014 return;
1015
1016 if (infoLog == NULL)
1017 _mesa_error (ctx, GL_INVALID_VALUE, "glGetInfoLogARB");
Michal Krola1a02e62006-05-16 09:40:30 +00001018 else {
1019 GLsizei actualsize = (**gen).GetInfoLogLength (gen);
1020 if (actualsize > maxLength)
1021 actualsize = maxLength;
1022 (**gen).GetInfoLog (gen, actualsize, infoLog);
1023 if (length != NULL)
1024 *length = (actualsize > 0) ? actualsize - 1 : 0;
1025 }
Michal Krold55de652006-04-18 10:30:29 +00001026 RELEASE_GENERIC(gen);
Michal Krol1d7f7192005-03-25 12:12:50 +00001027}
1028
Michal Krol9ac96052006-02-27 14:41:41 +00001029GLvoid GLAPIENTRY
1030_mesa_GetAttachedObjectsARB (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count,
1031 GLhandleARB *obj)
Michal Krol1d7f7192005-03-25 12:12:50 +00001032{
1033 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +00001034 GET_CONTAINER(con, containerObj, "glGetAttachedObjectsARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001035
Michal Krold55de652006-04-18 10:30:29 +00001036 if (con == NULL)
1037 return;
1038
1039 if (obj == NULL)
1040 _mesa_error (ctx, GL_INVALID_VALUE, "glGetAttachedObjectsARB");
1041 else
Michal Krol1d7f7192005-03-25 12:12:50 +00001042 {
Michal Krold55de652006-04-18 10:30:29 +00001043 GLsizei cnt, i;
1044
Michal Krol9ac96052006-02-27 14:41:41 +00001045 cnt = (**con).GetAttachedCount (con);
1046 if (cnt > maxCount)
1047 cnt = maxCount;
1048 if (count != NULL)
1049 *count = cnt;
1050
1051 for (i = 0; i < cnt; i++)
1052 {
Michal Krola1a02e62006-05-16 09:40:30 +00001053 struct gl2_generic_intf **x = (**con).GetAttached (con, i);
Michal Krol9ac96052006-02-27 14:41:41 +00001054 obj[i] = (**x).GetName (x);
1055 RELEASE_GENERIC(x);
1056 }
Michal Krol1d7f7192005-03-25 12:12:50 +00001057 }
Michal Krold55de652006-04-18 10:30:29 +00001058 RELEASE_CONTAINER(con);
Michal Krol9ac96052006-02-27 14:41:41 +00001059}
Michal Krolc1fe4692004-10-27 17:09:10 +00001060
1061GLint GLAPIENTRY
1062_mesa_GetUniformLocationARB (GLhandleARB programObj, const GLcharARB *name)
Michal Krol1d7f7192005-03-25 12:12:50 +00001063{
Michal Krol9ac96052006-02-27 14:41:41 +00001064 GET_CURRENT_CONTEXT(ctx);
Michal Krol1d7f7192005-03-25 12:12:50 +00001065 GLint loc = -1;
Michal Krol9ac96052006-02-27 14:41:41 +00001066 GET_LINKED_PROGRAM(pro, programObj, "glGetUniformLocationARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001067
Michal Krold55de652006-04-18 10:30:29 +00001068 if (pro == NULL)
1069 return -1;
1070
1071 if (name == NULL)
1072 _mesa_error (ctx, GL_INVALID_VALUE, "glGetUniformLocationARB");
1073 else
Michal Krol9ac96052006-02-27 14:41:41 +00001074 {
Michal Krold55de652006-04-18 10:30:29 +00001075 if (!IS_NAME_WITH_GL_PREFIX(name))
1076 loc = (**pro).GetUniformLocation (pro, name);
Michal Krol9ac96052006-02-27 14:41:41 +00001077 }
Michal Krold55de652006-04-18 10:30:29 +00001078 RELEASE_PROGRAM(pro);
Michal Krol6324f732005-01-13 14:12:50 +00001079 return loc;
Michal Krolc1fe4692004-10-27 17:09:10 +00001080}
1081
Michal Krol9ac96052006-02-27 14:41:41 +00001082GLvoid GLAPIENTRY
1083_mesa_GetActiveUniformARB (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length,
1084 GLint *size, GLenum *type, GLcharARB *name)
Michal Krol1d7f7192005-03-25 12:12:50 +00001085{
1086 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +00001087 GET_PROGRAM(pro, programObj, "glGetActiveUniformARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001088
Michal Krold55de652006-04-18 10:30:29 +00001089 if (pro == NULL)
1090 return;
1091
1092 if (size == NULL || type == NULL || name == NULL)
1093 _mesa_error (ctx, GL_INVALID_VALUE, "glGetActiveUniformARB");
1094 else
Michal Krol1d7f7192005-03-25 12:12:50 +00001095 {
Michal Krold55de652006-04-18 10:30:29 +00001096 if (index < (**pro).GetActiveUniformCount (pro))
1097 (**pro).GetActiveUniform (pro, index, maxLength, length, size, type, name);
Michal Krol9ac96052006-02-27 14:41:41 +00001098 else
1099 _mesa_error (ctx, GL_INVALID_VALUE, "glGetActiveUniformARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001100 }
Michal Krold55de652006-04-18 10:30:29 +00001101 RELEASE_PROGRAM(pro);
Michal Krolc1fe4692004-10-27 17:09:10 +00001102}
1103
Michal Krol9ac96052006-02-27 14:41:41 +00001104GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +00001105_mesa_GetUniformfvARB (GLhandleARB programObj, GLint location, GLfloat *params)
Michal Krol1d7f7192005-03-25 12:12:50 +00001106{
1107 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +00001108 GET_LINKED_PROGRAM(pro, programObj, "glGetUniformfvARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001109
Michal Krol9ac96052006-02-27 14:41:41 +00001110 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +00001111 {
Michal Krol9ac96052006-02-27 14:41:41 +00001112 /* TODO */
1113 RELEASE_PROGRAM(pro);
Michal Krol1d7f7192005-03-25 12:12:50 +00001114 }
Michal Krolc1fe4692004-10-27 17:09:10 +00001115}
1116
Michal Krol9ac96052006-02-27 14:41:41 +00001117GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +00001118_mesa_GetUniformivARB (GLhandleARB programObj, GLint location, GLint *params)
Michal Krol1d7f7192005-03-25 12:12:50 +00001119{
1120 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +00001121 GET_LINKED_PROGRAM(pro, programObj, "glGetUniformivARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001122
Michal Krol9ac96052006-02-27 14:41:41 +00001123 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +00001124 {
Michal Krol9ac96052006-02-27 14:41:41 +00001125 /* TODO */
1126 RELEASE_PROGRAM(pro);
Michal Krol1d7f7192005-03-25 12:12:50 +00001127 }
Michal Krolc1fe4692004-10-27 17:09:10 +00001128}
1129
Michal Krol9ac96052006-02-27 14:41:41 +00001130GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +00001131_mesa_GetShaderSourceARB (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source)
Michal Krol1d7f7192005-03-25 12:12:50 +00001132{
1133 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +00001134 GET_SHADER(sha, obj, "glGetShaderSourceARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001135
Michal Krold55de652006-04-18 10:30:29 +00001136 if (sha == NULL)
1137 return;
1138
1139 if (source == NULL)
1140 _mesa_error (ctx, GL_INVALID_VALUE, "glGetShaderSourceARB");
1141 else
1142 copy_string ((**sha).GetSource (sha), maxLength, length, source);
1143 RELEASE_SHADER(sha);
Michal Krolc1fe4692004-10-27 17:09:10 +00001144}
1145
1146/* GL_ARB_vertex_shader */
1147
Michal Krol9ac96052006-02-27 14:41:41 +00001148GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +00001149_mesa_BindAttribLocationARB (GLhandleARB programObj, GLuint index, const GLcharARB *name)
Michal Krol1d7f7192005-03-25 12:12:50 +00001150{
1151 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +00001152 GET_PROGRAM(pro, programObj, "glBindAttribLocationARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001153
Michal Krold55de652006-04-18 10:30:29 +00001154 if (pro == NULL)
1155 return;
1156
1157 if (name == NULL || index >= MAX_VERTEX_ATTRIBS)
1158 _mesa_error (ctx, GL_INVALID_VALUE, "glBindAttribLocationARB");
1159 else if (IS_NAME_WITH_GL_PREFIX(name))
1160 _mesa_error (ctx, GL_INVALID_OPERATION, "glBindAttribLocationARB");
1161 else
1162 (**pro).OverrideAttribBinding (pro, index, name);
1163 RELEASE_PROGRAM(pro);
Michal Krolc1fe4692004-10-27 17:09:10 +00001164}
1165
Michal Krol9ac96052006-02-27 14:41:41 +00001166GLvoid GLAPIENTRY
1167_mesa_GetActiveAttribARB (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length,
Michal Krold55de652006-04-18 10:30:29 +00001168 GLint *size, GLenum *type, GLcharARB *name)
Michal Krol1d7f7192005-03-25 12:12:50 +00001169{
1170 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +00001171 GET_PROGRAM(pro, programObj, "glGetActiveAttribARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001172
Michal Krold55de652006-04-18 10:30:29 +00001173 if (pro == NULL)
1174 return;
1175
1176 if (name == NULL || index >= (**pro).GetActiveAttribCount (pro))
1177 _mesa_error (ctx, GL_INVALID_VALUE, "glGetActiveAttribARB");
1178 else
1179 (**pro).GetActiveAttrib (pro, index, maxLength, length, size, type, name);
1180 RELEASE_PROGRAM(pro);
Michal Krolc1fe4692004-10-27 17:09:10 +00001181}
1182
1183GLint GLAPIENTRY
1184_mesa_GetAttribLocationARB (GLhandleARB programObj, const GLcharARB *name)
Michal Krol1d7f7192005-03-25 12:12:50 +00001185{
1186 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +00001187 GLint loc = -1;
Michal Krold55de652006-04-18 10:30:29 +00001188 GET_LINKED_PROGRAM(pro, programObj, "glGetAttribLocationARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001189
Michal Krold55de652006-04-18 10:30:29 +00001190 if (pro == NULL)
1191 return -1;
1192
1193 if (name == NULL)
1194 _mesa_error (ctx, GL_INVALID_VALUE, "glGetAttribLocationARB");
1195 else if (!IS_NAME_WITH_GL_PREFIX(name))
1196 loc = (**pro).GetAttribLocation (pro, name);
1197 RELEASE_PROGRAM(pro);
Michal Krol6324f732005-01-13 14:12:50 +00001198 return loc;
Michal Krolc1fe4692004-10-27 17:09:10 +00001199}
1200
Michal Krol9ac96052006-02-27 14:41:41 +00001201GLvoid
Michal Krol6324f732005-01-13 14:12:50 +00001202_mesa_init_shaderobjects (GLcontext *ctx)
Michal Krol1d7f7192005-03-25 12:12:50 +00001203{
Brian Paul93269622006-04-14 03:43:39 +00001204 ctx->ShaderObjects.CurrentProgram = NULL;
1205 ctx->ShaderObjects._FragmentShaderPresent = GL_FALSE;
Michal Krol07135702006-03-21 10:37:40 +00001206 ctx->ShaderObjects._VertexShaderPresent = GL_FALSE;
Michal Krol1d7f7192005-03-25 12:12:50 +00001207
1208 _mesa_init_shaderobjects_3dlabs (ctx);
Michal Krolc1fe4692004-10-27 17:09:10 +00001209}
Michal Krol1d7f7192005-03-25 12:12:50 +00001210