blob: f26ff12adf12c7536845b8e4c09ba8fca7619eb3 [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 Krol365582d2006-08-01 20:07:31 +000039#if FEATURE_ARB_shader_objects
40
Michal Krol9ac96052006-02-27 14:41:41 +000041#define RELEASE_GENERIC(x)\
Michal Krola1a02e62006-05-16 09:40:30 +000042 (**x)._unknown.Release ((struct gl2_unknown_intf **) (x))
Michal Krol9ac96052006-02-27 14:41:41 +000043
44#define RELEASE_CONTAINER(x)\
Michal Krola1a02e62006-05-16 09:40:30 +000045 (**x)._generic._unknown.Release ((struct gl2_unknown_intf **) (x))
Michal Krol9ac96052006-02-27 14:41:41 +000046
47#define RELEASE_PROGRAM(x)\
Michal Krola1a02e62006-05-16 09:40:30 +000048 (**x)._container._generic._unknown.Release ((struct gl2_unknown_intf **) (x))
Michal Krol9ac96052006-02-27 14:41:41 +000049
50#define RELEASE_SHADER(x)\
Michal Krola1a02e62006-05-16 09:40:30 +000051 (**x)._generic._unknown.Release ((struct gl2_unknown_intf **) (x))
Michal Krol9ac96052006-02-27 14:41:41 +000052
Michal Krola1a02e62006-05-16 09:40:30 +000053static struct gl2_unknown_intf **
Michal Krolbd4256a2006-05-16 10:37:16 +000054lookup_handle (GLcontext *ctx, GLhandleARB handle, enum gl2_uiid uiid, const char *function)
Michal Krola1a02e62006-05-16 09:40:30 +000055{
56 struct gl2_unknown_intf **unk;
Michal Krol9ac96052006-02-27 14:41:41 +000057
Michal Krola1a02e62006-05-16 09:40:30 +000058 /*
59 * Note: _mesa_HashLookup() requires non-zero input values, so the passed-in handle value
60 * must be checked beforehand.
61 */
62 if (handle == 0) {
63 _mesa_error (ctx, GL_INVALID_VALUE, function);
64 return NULL;
65 }
66 _glthread_LOCK_MUTEX (ctx->Shared->Mutex);
67 unk = (struct gl2_unknown_intf **) (_mesa_HashLookup (ctx->Shared->GL2Objects, handle));
68 _glthread_UNLOCK_MUTEX (ctx->Shared->Mutex);
69 if (unk == NULL)
70 _mesa_error (ctx, GL_INVALID_VALUE, function);
71 else {
Michal Krolbd4256a2006-05-16 10:37:16 +000072 unk = (**unk).QueryInterface (unk, uiid);
Michal Krola1a02e62006-05-16 09:40:30 +000073 if (unk == NULL)
74 _mesa_error (ctx, GL_INVALID_OPERATION, function);
75 }
76 return unk;
77}
Michal Krol9ac96052006-02-27 14:41:41 +000078
79#define GET_GENERIC(x, handle, function)\
Michal Krola1a02e62006-05-16 09:40:30 +000080 struct gl2_generic_intf **x = (struct gl2_generic_intf **)\
81 lookup_handle (ctx, handle, UIID_GENERIC, function);
Michal Krol9ac96052006-02-27 14:41:41 +000082
83#define GET_CONTAINER(x, handle, function)\
Michal Krola1a02e62006-05-16 09:40:30 +000084 struct gl2_container_intf **x = (struct gl2_container_intf **)\
85 lookup_handle (ctx, handle, UIID_CONTAINER, function);
Michal Krol9ac96052006-02-27 14:41:41 +000086
87#define GET_PROGRAM(x, handle, function)\
Michal Krola1a02e62006-05-16 09:40:30 +000088 struct gl2_program_intf **x = (struct gl2_program_intf **)\
89 lookup_handle (ctx, handle, UIID_PROGRAM, function);
Michal Krol9ac96052006-02-27 14:41:41 +000090
91#define GET_SHADER(x, handle, function)\
Michal Krola1a02e62006-05-16 09:40:30 +000092 struct gl2_shader_intf **x = (struct gl2_shader_intf **)\
93 lookup_handle (ctx, handle, UIID_SHADER, function);
Michal Krol9ac96052006-02-27 14:41:41 +000094
95#define GET_LINKED_PROGRAM(x, handle, function)\
Michal Krola1a02e62006-05-16 09:40:30 +000096 GET_PROGRAM(x, handle, function);\
97 if (x != NULL && (**x).GetLinkStatus (x) == GL_FALSE) {\
98 RELEASE_PROGRAM(x);\
99 x = NULL;\
100 _mesa_error (ctx, GL_INVALID_OPERATION, function);\
101 }
Michal Krol9ac96052006-02-27 14:41:41 +0000102
103#define GET_CURRENT_LINKED_PROGRAM(x, function)\
Michal Krola1a02e62006-05-16 09:40:30 +0000104 struct gl2_program_intf **x = NULL;\
105 if (ctx->ShaderObjects.CurrentProgram == NULL)\
106 _mesa_error (ctx, GL_INVALID_OPERATION, function);\
107 else {\
108 x = ctx->ShaderObjects.CurrentProgram;\
109 if (x != NULL && (**x).GetLinkStatus (x) == GL_FALSE) {\
110 x = NULL;\
111 _mesa_error (ctx, GL_INVALID_OPERATION, function);\
112 }\
113 }
Michal Krol9ac96052006-02-27 14:41:41 +0000114
Michal Krold55de652006-04-18 10:30:29 +0000115#define IS_NAME_WITH_GL_PREFIX(x) ((x)[0] == 'g' && (x)[1] == 'l' && (x)[2] == '_')
116
Michal Krol9ac96052006-02-27 14:41:41 +0000117
118GLvoid GLAPIENTRY
Michal Krol6324f732005-01-13 14:12:50 +0000119_mesa_DeleteObjectARB (GLhandleARB obj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000120{
Michal Krola1a02e62006-05-16 09:40:30 +0000121 if (obj != 0)
122 {
123 GET_CURRENT_CONTEXT(ctx);
124 GET_GENERIC(gen, obj, "glDeleteObjectARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000125
Michal Krola1a02e62006-05-16 09:40:30 +0000126 if (gen != NULL)
127 {
128 (**gen).Delete (gen);
129 RELEASE_GENERIC(gen);
130 }
131 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000132}
133
134GLhandleARB GLAPIENTRY
Michal Krol6324f732005-01-13 14:12:50 +0000135_mesa_GetHandleARB (GLenum pname)
Michal Krol1d7f7192005-03-25 12:12:50 +0000136{
137 GET_CURRENT_CONTEXT(ctx);
138
139 switch (pname)
140 {
Michal Krola1a02e62006-05-16 09:40:30 +0000141 case GL_PROGRAM_OBJECT_ARB:
142 {
143 struct gl2_program_intf **pro = ctx->ShaderObjects.CurrentProgram;
Michal Krol9ac96052006-02-27 14:41:41 +0000144
Michal Krola1a02e62006-05-16 09:40:30 +0000145 if (pro != NULL)
146 return (**pro)._container._generic.GetName ((struct gl2_generic_intf **) (pro));
147 }
148 break;
Michal Krol9ac96052006-02-27 14:41:41 +0000149 default:
150 _mesa_error (ctx, GL_INVALID_ENUM, "glGetHandleARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000151 }
Michal Krol6324f732005-01-13 14:12:50 +0000152
153 return 0;
Michal Krolc1fe4692004-10-27 17:09:10 +0000154}
155
Michal Krol9ac96052006-02-27 14:41:41 +0000156GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000157_mesa_DetachObjectARB (GLhandleARB containerObj, GLhandleARB attachedObj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000158{
159 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000160 GET_CONTAINER(con, containerObj, "glDetachObjectARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000161
Michal Krol9ac96052006-02-27 14:41:41 +0000162 if (con != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000163 {
Michal Krol9ac96052006-02-27 14:41:41 +0000164 GET_GENERIC(att, attachedObj, "glDetachObjectARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000165
Michal Krol9ac96052006-02-27 14:41:41 +0000166 if (att != NULL)
167 {
168 (**con).Detach (con, att);
169 RELEASE_GENERIC(att);
170 }
171 RELEASE_CONTAINER(con);
Michal Krol1d7f7192005-03-25 12:12:50 +0000172 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000173}
174
175GLhandleARB GLAPIENTRY
176_mesa_CreateShaderObjectARB (GLenum shaderType)
Michal Krol1d7f7192005-03-25 12:12:50 +0000177{
Michal Krol6324f732005-01-13 14:12:50 +0000178 return _mesa_3dlabs_create_shader_object (shaderType);
Michal Krolc1fe4692004-10-27 17:09:10 +0000179}
180
Michal Krol9ac96052006-02-27 14:41:41 +0000181GLvoid GLAPIENTRY
Michal Krol1d7f7192005-03-25 12:12:50 +0000182_mesa_ShaderSourceARB (GLhandleARB shaderObj, GLsizei count, const GLcharARB **string,
Michal Krol6324f732005-01-13 14:12:50 +0000183 const GLint *length)
Michal Krol1d7f7192005-03-25 12:12:50 +0000184{
185 GET_CURRENT_CONTEXT(ctx);
Michal Krol1d7f7192005-03-25 12:12:50 +0000186 GLint *offsets;
187 GLsizei i;
188 GLcharARB *source;
Michal Krol9ac96052006-02-27 14:41:41 +0000189 GET_SHADER(sha, shaderObj, "glShaderSourceARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000190
Michal Krol1d7f7192005-03-25 12:12:50 +0000191 if (sha == NULL)
Brian Paul93269622006-04-14 03:43:39 +0000192 return;
193
194 if (string == NULL)
195 {
196 RELEASE_SHADER(sha);
197 _mesa_error (ctx, GL_INVALID_VALUE, "glShaderSourceARB");
198 return;
Michal Krol07135702006-03-21 10:37:40 +0000199 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000200
Michal Krol9ac96052006-02-27 14:41:41 +0000201 /*
202 * This array holds offsets of where the appropriate string ends, thus the last
203 * element will be set to the total length of the source code.
204 */
Michal Krol1d7f7192005-03-25 12:12:50 +0000205 offsets = (GLint *) _mesa_malloc (count * sizeof (GLint));
206 if (offsets == NULL)
207 {
Michal Krol9ac96052006-02-27 14:41:41 +0000208 RELEASE_SHADER(sha);
Michal Krol1d7f7192005-03-25 12:12:50 +0000209 _mesa_error (ctx, GL_OUT_OF_MEMORY, "glShaderSourceARB");
210 return;
211 }
212
213 for (i = 0; i < count; i++)
Brian Paul93269622006-04-14 03:43:39 +0000214 {
215 if (string[i] == NULL)
216 {
217 _mesa_free ((GLvoid *) offsets);
218 RELEASE_SHADER(sha);
219 _mesa_error (ctx, GL_INVALID_VALUE, "glShaderSourceARB");
220 return;
Michal Krol07135702006-03-21 10:37:40 +0000221 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000222 if (length == NULL || length[i] < 0)
223 offsets[i] = _mesa_strlen (string[i]);
224 else
225 offsets[i] = length[i];
226 /* accumulate string lengths */
227 if (i > 0)
228 offsets[i] += offsets[i - 1];
229 }
230
231 source = (GLcharARB *) _mesa_malloc ((offsets[count - 1] + 1) * sizeof (GLcharARB));
232 if (source == NULL)
233 {
Michal Krol9ac96052006-02-27 14:41:41 +0000234 _mesa_free ((GLvoid *) offsets);
235 RELEASE_SHADER(sha);
Michal Krol1d7f7192005-03-25 12:12:50 +0000236 _mesa_error (ctx, GL_OUT_OF_MEMORY, "glShaderSourceARB");
237 return;
238 }
239
240 for (i = 0; i < count; i++)
241 {
242 GLint start = (i > 0) ? offsets[i - 1] : 0;
243 _mesa_memcpy (source + start, string[i], (offsets[i] - start) * sizeof (GLcharARB));
244 }
245 source[offsets[count - 1]] = '\0';
246
247 (**sha).SetSource (sha, source, offsets, count);
Michal Krol9ac96052006-02-27 14:41:41 +0000248 RELEASE_SHADER(sha);
Michal Krolc1fe4692004-10-27 17:09:10 +0000249}
250
Michal Krol9ac96052006-02-27 14:41:41 +0000251GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000252_mesa_CompileShaderARB (GLhandleARB shaderObj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000253{
254 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000255 GET_SHADER(sha, shaderObj, "glCompileShaderARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000256
Michal Krol9ac96052006-02-27 14:41:41 +0000257 if (sha != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000258 {
Michal Krol9ac96052006-02-27 14:41:41 +0000259 (**sha).Compile (sha);
260 RELEASE_SHADER(sha);
Michal Krol1d7f7192005-03-25 12:12:50 +0000261 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000262}
263
264GLhandleARB GLAPIENTRY
Michal Krol9ac96052006-02-27 14:41:41 +0000265_mesa_CreateProgramObjectARB (GLvoid)
Michal Krolc1fe4692004-10-27 17:09:10 +0000266{
Michal Krol6324f732005-01-13 14:12:50 +0000267 return _mesa_3dlabs_create_program_object ();
Michal Krolc1fe4692004-10-27 17:09:10 +0000268}
269
Michal Krol9ac96052006-02-27 14:41:41 +0000270GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000271_mesa_AttachObjectARB (GLhandleARB containerObj, GLhandleARB obj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000272{
273 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000274 GET_CONTAINER(con, containerObj, "glAttachObjectARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000275
Michal Krol9ac96052006-02-27 14:41:41 +0000276 if (con != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000277 {
Michal Krol9ac96052006-02-27 14:41:41 +0000278 GET_GENERIC(att, obj, "glAttachObjectARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000279
Michal Krol9ac96052006-02-27 14:41:41 +0000280 if (att != NULL)
281 {
282 (**con).Attach (con, att);
283 RELEASE_GENERIC(att);
284 }
285 RELEASE_CONTAINER(con);
Michal Krol1d7f7192005-03-25 12:12:50 +0000286 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000287}
288
Michal Krol9ac96052006-02-27 14:41:41 +0000289GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000290_mesa_LinkProgramARB (GLhandleARB programObj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000291{
292 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000293 GET_PROGRAM(pro, programObj, "glLinkProgramARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000294
Michal Krol9ac96052006-02-27 14:41:41 +0000295 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000296 {
Brian Paul93269622006-04-14 03:43:39 +0000297 (**pro).Link (pro);
298 if (pro == ctx->ShaderObjects.CurrentProgram)
299 {
300 if ((**pro).GetLinkStatus (pro))
301 _mesa_UseProgramObjectARB (programObj);
302 else
303 _mesa_UseProgramObjectARB (0);
Michal Krol9ac96052006-02-27 14:41:41 +0000304 }
Michal Krol9ac96052006-02-27 14:41:41 +0000305 RELEASE_PROGRAM(pro);
Michal Krol1d7f7192005-03-25 12:12:50 +0000306 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000307}
308
Michal Krol9ac96052006-02-27 14:41:41 +0000309GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000310_mesa_UseProgramObjectARB (GLhandleARB programObj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000311{
312 GET_CURRENT_CONTEXT(ctx);
Michal Krola1a02e62006-05-16 09:40:30 +0000313 struct gl2_program_intf **program = NULL;
Michal Krol9ac96052006-02-27 14:41:41 +0000314
Michal Krolcc159162006-02-21 12:35:06 +0000315 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000316
Michal Krol9ac96052006-02-27 14:41:41 +0000317 if (programObj != 0)
Brian Paul93269622006-04-14 03:43:39 +0000318 {
Michal Krol9ac96052006-02-27 14:41:41 +0000319 GET_PROGRAM(pro, programObj, "glUseProgramObjectARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000320
Michal Krol1d7f7192005-03-25 12:12:50 +0000321 if (pro == NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000322 return;
Michal Krol1d7f7192005-03-25 12:12:50 +0000323
324 if ((**pro).GetLinkStatus (pro) == GL_FALSE)
325 {
Michal Krol9ac96052006-02-27 14:41:41 +0000326 RELEASE_PROGRAM(pro);
Michal Krol1d7f7192005-03-25 12:12:50 +0000327 _mesa_error (ctx, GL_INVALID_OPERATION, "glUseProgramObjectARB");
328 return;
329 }
Michal Krol9ac96052006-02-27 14:41:41 +0000330
Brian Paul93269622006-04-14 03:43:39 +0000331 program = pro;
332
333 ctx->ShaderObjects._VertexShaderPresent = (**pro).IsShaderPresent (pro, GL_VERTEX_SHADER_ARB);
334 ctx->ShaderObjects._FragmentShaderPresent = (**pro).IsShaderPresent (pro,
Michal Krol07135702006-03-21 10:37:40 +0000335 GL_FRAGMENT_SHADER_ARB);
Brian Paul93269622006-04-14 03:43:39 +0000336 }
337 else
338 {
339 ctx->ShaderObjects._VertexShaderPresent = GL_FALSE;
340 ctx->ShaderObjects._FragmentShaderPresent = GL_FALSE;
Michal Krol1d7f7192005-03-25 12:12:50 +0000341 }
342
Michal Krol44e9ccc2006-02-13 11:31:16 +0000343 if (ctx->ShaderObjects.CurrentProgram != NULL)
Michal Krol9ac96052006-02-27 14:41:41 +0000344 RELEASE_PROGRAM(ctx->ShaderObjects.CurrentProgram);
345 ctx->ShaderObjects.CurrentProgram = program;
Michal Krolc1fe4692004-10-27 17:09:10 +0000346}
347
Michal Krol9ac96052006-02-27 14:41:41 +0000348GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000349_mesa_ValidateProgramARB (GLhandleARB programObj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000350{
351 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +0000352 GET_PROGRAM(pro, programObj, "glValidateProgramARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000353
Michal Krol9ac96052006-02-27 14:41:41 +0000354 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000355 {
Michal Krol9ac96052006-02-27 14:41:41 +0000356 (**pro).Validate (pro);
357 RELEASE_PROGRAM(pro);
Michal Krol1d7f7192005-03-25 12:12:50 +0000358 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000359}
360
Michal Krol9ac96052006-02-27 14:41:41 +0000361GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000362_mesa_Uniform1fARB (GLint location, GLfloat v0)
Michal Krol9ac96052006-02-27 14:41:41 +0000363{
364 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000365 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform1fARB");
366
Michal Krol8af48fc2006-03-14 11:23:16 +0000367 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol9ac96052006-02-27 14:41:41 +0000368
369 if (pro != NULL)
370 {
Michal Krold55de652006-04-18 10:30:29 +0000371 if (!(**pro).WriteUniform (pro, location, 1, &v0, GL_FLOAT))
Michal Krol9ac96052006-02-27 14:41:41 +0000372 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform1fARB");
373 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000374}
375
Michal Krol9ac96052006-02-27 14:41:41 +0000376GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000377_mesa_Uniform2fARB (GLint location, GLfloat v0, GLfloat v1)
Michal Krol1d7f7192005-03-25 12:12:50 +0000378{
379 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000380 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform2fARB");
381
Michal Krol8af48fc2006-03-14 11:23:16 +0000382 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000383
Michal Krol9ac96052006-02-27 14:41:41 +0000384 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000385 {
Brian Paul93269622006-04-14 03:43:39 +0000386 GLfloat v[2];
387 v[0] = v0;
388 v[1] = v1;
Michal Krol9ac96052006-02-27 14:41:41 +0000389
Michal Krold55de652006-04-18 10:30:29 +0000390 if (!(**pro).WriteUniform (pro, location, 1, v, GL_FLOAT_VEC2))
Michal Krol9ac96052006-02-27 14:41:41 +0000391 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform2fARB");
Michal Krol6324f732005-01-13 14:12:50 +0000392 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000393}
394
Michal Krol9ac96052006-02-27 14:41:41 +0000395GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000396_mesa_Uniform3fARB (GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
Michal Krol1d7f7192005-03-25 12:12:50 +0000397{
398 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000399 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform3fARB");
400
Michal Krol8af48fc2006-03-14 11:23:16 +0000401 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000402
Michal Krol9ac96052006-02-27 14:41:41 +0000403 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000404 {
Brian Paul93269622006-04-14 03:43:39 +0000405 GLfloat v[3];
406 v[0] = v0;
407 v[1] = v1;
408 v[2] = v2;
Michal Krol9ac96052006-02-27 14:41:41 +0000409
Michal Krold55de652006-04-18 10:30:29 +0000410 if (!(**pro).WriteUniform (pro, location, 1, v, GL_FLOAT_VEC3))
Michal Krol9ac96052006-02-27 14:41:41 +0000411 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform3fARB");
Michal Krol6324f732005-01-13 14:12:50 +0000412 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000413}
414
Michal Krol9ac96052006-02-27 14:41:41 +0000415GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000416_mesa_Uniform4fARB (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
Michal Krol1d7f7192005-03-25 12:12:50 +0000417{
418 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000419 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform4fARB");
420
Michal Krol8af48fc2006-03-14 11:23:16 +0000421 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000422
Michal Krol9ac96052006-02-27 14:41:41 +0000423 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000424 {
Brian Paul93269622006-04-14 03:43:39 +0000425 GLfloat v[4];
426 v[0] = v0;
427 v[1] = v1;
428 v[2] = v2;
429 v[3] = v3;
Michal Krol9ac96052006-02-27 14:41:41 +0000430
Michal Krold55de652006-04-18 10:30:29 +0000431 if (!(**pro).WriteUniform (pro, location, 1, v, GL_FLOAT_VEC4))
Michal Krol9ac96052006-02-27 14:41:41 +0000432 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform4fARB");
Michal Krol6324f732005-01-13 14:12:50 +0000433 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000434}
435
Michal Krol9ac96052006-02-27 14:41:41 +0000436GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000437_mesa_Uniform1iARB (GLint location, GLint v0)
Michal Krol1d7f7192005-03-25 12:12:50 +0000438{
439 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000440 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform1iARB");
441
Michal Krol8af48fc2006-03-14 11:23:16 +0000442 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000443
Michal Krol9ac96052006-02-27 14:41:41 +0000444 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000445 {
Michal Krold55de652006-04-18 10:30:29 +0000446 if (!(**pro).WriteUniform (pro, location, 1, &v0, GL_INT))
Michal Krol9ac96052006-02-27 14:41:41 +0000447 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform1iARB");
Michal Krol6324f732005-01-13 14:12:50 +0000448 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000449}
450
Michal Krol9ac96052006-02-27 14:41:41 +0000451GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000452_mesa_Uniform2iARB (GLint location, GLint v0, GLint v1)
Michal Krol1d7f7192005-03-25 12:12:50 +0000453{
454 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000455 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform2iARB");
456
Michal Krol8af48fc2006-03-14 11:23:16 +0000457 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000458
Michal Krol9ac96052006-02-27 14:41:41 +0000459 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000460 {
Brian Paul93269622006-04-14 03:43:39 +0000461 GLint v[2];
462 v[0] = v0;
463 v[1] = v1;
Michal Krol9ac96052006-02-27 14:41:41 +0000464
Michal Krold55de652006-04-18 10:30:29 +0000465 if (!(**pro).WriteUniform (pro, location, 1, v, GL_INT_VEC2))
Michal Krol9ac96052006-02-27 14:41:41 +0000466 _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);
Brian Paul93269622006-04-14 03:43:39 +0000474 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform3iARB");
475
Michal Krol8af48fc2006-03-14 11:23:16 +0000476 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 {
Brian Paul93269622006-04-14 03:43:39 +0000480 GLint v[3];
481 v[0] = v0;
482 v[1] = v1;
483 v[2] = v2;
Michal Krol9ac96052006-02-27 14:41:41 +0000484
Michal Krold55de652006-04-18 10:30:29 +0000485 if (!(**pro).WriteUniform (pro, location, 1, v, GL_INT_VEC3))
Michal Krol9ac96052006-02-27 14:41:41 +0000486 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform3iARB");
Michal Krol6324f732005-01-13 14:12:50 +0000487 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000488}
489
Michal Krol9ac96052006-02-27 14:41:41 +0000490GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000491_mesa_Uniform4iARB (GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
Michal Krol1d7f7192005-03-25 12:12:50 +0000492{
493 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000494 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform4iARB");
495
Michal Krol8af48fc2006-03-14 11:23:16 +0000496 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000497
Michal Krol9ac96052006-02-27 14:41:41 +0000498 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000499 {
Brian Paul93269622006-04-14 03:43:39 +0000500 GLint v[4];
501 v[0] = v0;
502 v[1] = v1;
503 v[2] = v2;
504 v[3] = v3;
Michal Krol9ac96052006-02-27 14:41:41 +0000505
Michal Krold55de652006-04-18 10:30:29 +0000506 if (!(**pro).WriteUniform (pro, location, 1, v, GL_INT_VEC4))
Michal Krol9ac96052006-02-27 14:41:41 +0000507 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform4iARB");
Michal Krol6324f732005-01-13 14:12:50 +0000508 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000509}
510
Michal Krol9ac96052006-02-27 14:41:41 +0000511GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000512_mesa_Uniform1fvARB (GLint location, GLsizei count, const GLfloat *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000513{
514 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000515 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform1fvARB");
516
Michal Krold55de652006-04-18 10:30:29 +0000517 if (value == NULL)
518 {
519 _mesa_error (ctx, GL_INVALID_VALUE, "glUniform1fvARB");
520 return;
521 }
522
Michal Krol8af48fc2006-03-14 11:23:16 +0000523 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000524
Michal Krol9ac96052006-02-27 14:41:41 +0000525 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000526 {
Michal Krold55de652006-04-18 10:30:29 +0000527 if (!(**pro).WriteUniform (pro, location, count, value, GL_FLOAT))
Michal Krol9ac96052006-02-27 14:41:41 +0000528 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform1fvARB");
Michal Krol6324f732005-01-13 14:12:50 +0000529 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000530}
531
Michal Krol9ac96052006-02-27 14:41:41 +0000532GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000533_mesa_Uniform2fvARB (GLint location, GLsizei count, const GLfloat *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000534{
535 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000536 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform2fvARB");
537
Michal Krold55de652006-04-18 10:30:29 +0000538 if (value == NULL)
539 {
540 _mesa_error (ctx, GL_INVALID_VALUE, "glUniform2fvARB");
541 return;
542 }
543
Michal Krol8af48fc2006-03-14 11:23:16 +0000544 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000545
Michal Krol9ac96052006-02-27 14:41:41 +0000546 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000547 {
Michal Krold55de652006-04-18 10:30:29 +0000548 if (!(**pro).WriteUniform (pro, location, count, value, GL_FLOAT_VEC2))
Michal Krol9ac96052006-02-27 14:41:41 +0000549 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform2fvARB");
Michal Krol6324f732005-01-13 14:12:50 +0000550 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000551}
552
Michal Krol9ac96052006-02-27 14:41:41 +0000553GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000554_mesa_Uniform3fvARB (GLint location, GLsizei count, const GLfloat *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000555{
556 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000557 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform3fvARB");
558
Michal Krold55de652006-04-18 10:30:29 +0000559 if (value == NULL)
560 {
561 _mesa_error (ctx, GL_INVALID_VALUE, "glUniform3fvARB");
562 return;
563 }
564
Michal Krol8af48fc2006-03-14 11:23:16 +0000565 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000566
Michal Krol9ac96052006-02-27 14:41:41 +0000567 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000568 {
Michal Krold55de652006-04-18 10:30:29 +0000569 if (!(**pro).WriteUniform (pro, location, count, value, GL_FLOAT_VEC3))
Michal Krol9ac96052006-02-27 14:41:41 +0000570 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform3fvARB");
Michal Krol6324f732005-01-13 14:12:50 +0000571 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000572}
573
Michal Krol9ac96052006-02-27 14:41:41 +0000574GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000575_mesa_Uniform4fvARB (GLint location, GLsizei count, const GLfloat *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000576{
Michal Krol9ac96052006-02-27 14:41:41 +0000577 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000578 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform4fvARB");
579
Michal Krold55de652006-04-18 10:30:29 +0000580 if (value == NULL)
581 {
582 _mesa_error (ctx, GL_INVALID_VALUE, "glUniform4fvARB");
583 return;
584 }
585
Michal Krol8af48fc2006-03-14 11:23:16 +0000586 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000587
Michal Krol9ac96052006-02-27 14:41:41 +0000588 if (pro != NULL)
589 {
Michal Krold55de652006-04-18 10:30:29 +0000590 if (!(**pro).WriteUniform (pro, location, count, value, GL_FLOAT_VEC4))
Michal Krol9ac96052006-02-27 14:41:41 +0000591 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform4fvARB");
592 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000593}
594
Michal Krol9ac96052006-02-27 14:41:41 +0000595GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000596_mesa_Uniform1ivARB (GLint location, GLsizei count, const GLint *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000597{
598 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000599 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform1ivARB");
600
Michal Krold55de652006-04-18 10:30:29 +0000601 if (value == NULL)
602 {
603 _mesa_error (ctx, GL_INVALID_VALUE, "glUniform1ivARB");
604 return;
605 }
606
Michal Krol8af48fc2006-03-14 11:23:16 +0000607 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000608
Michal Krol9ac96052006-02-27 14:41:41 +0000609 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000610 {
Michal Krold55de652006-04-18 10:30:29 +0000611 if (!(**pro).WriteUniform (pro, location, count, value, GL_INT))
Michal Krol9ac96052006-02-27 14:41:41 +0000612 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform1ivARB");
Michal Krol6324f732005-01-13 14:12:50 +0000613 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000614}
615
Michal Krol9ac96052006-02-27 14:41:41 +0000616GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000617_mesa_Uniform2ivARB (GLint location, GLsizei count, const GLint *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000618{
619 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000620 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform2ivARB");
621
Michal Krold55de652006-04-18 10:30:29 +0000622 if (value == NULL)
623 {
624 _mesa_error (ctx, GL_INVALID_VALUE, "glUniform2ivARB");
625 return;
626 }
627
Michal Krol8af48fc2006-03-14 11:23:16 +0000628 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000629
Michal Krol9ac96052006-02-27 14:41:41 +0000630 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000631 {
Michal Krold55de652006-04-18 10:30:29 +0000632 if (!(**pro).WriteUniform (pro, location, count, value, GL_INT_VEC2))
Michal Krol9ac96052006-02-27 14:41:41 +0000633 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform2ivARB");
Michal Krol6324f732005-01-13 14:12:50 +0000634 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000635}
636
Michal Krol9ac96052006-02-27 14:41:41 +0000637GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000638_mesa_Uniform3ivARB (GLint location, GLsizei count, const GLint *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000639{
640 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000641 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform3ivARB");
642
Michal Krold55de652006-04-18 10:30:29 +0000643 if (value == NULL)
644 {
645 _mesa_error (ctx, GL_INVALID_VALUE, "glUniform3ivARB");
646 return;
647 }
648
Michal Krol8af48fc2006-03-14 11:23:16 +0000649 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000650
Michal Krol9ac96052006-02-27 14:41:41 +0000651 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000652 {
Michal Krold55de652006-04-18 10:30:29 +0000653 if (!(**pro).WriteUniform (pro, location, count, value, GL_INT_VEC3))
Michal Krol9ac96052006-02-27 14:41:41 +0000654 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform3ivARB");
Michal Krol6324f732005-01-13 14:12:50 +0000655 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000656}
657
Michal Krol9ac96052006-02-27 14:41:41 +0000658GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000659_mesa_Uniform4ivARB (GLint location, GLsizei count, const GLint *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000660{
661 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000662 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform4ivARB");
663
Michal Krold55de652006-04-18 10:30:29 +0000664 if (value == NULL)
665 {
666 _mesa_error (ctx, GL_INVALID_VALUE, "glUniform4ivARB");
667 return;
668 }
669
Michal Krol8af48fc2006-03-14 11:23:16 +0000670 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 Krold55de652006-04-18 10:30:29 +0000674 if (!(**pro).WriteUniform (pro, location, count, value, GL_INT_VEC4))
Michal Krol9ac96052006-02-27 14:41:41 +0000675 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniform4ivARB");
Michal Krol6324f732005-01-13 14:12:50 +0000676 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000677}
678
Michal Krol9ac96052006-02-27 14:41:41 +0000679GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000680_mesa_UniformMatrix2fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000681{
682 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000683 GET_CURRENT_LINKED_PROGRAM(pro, "glUniformMatrix2fvARB");
684
Michal Krold55de652006-04-18 10:30:29 +0000685 if (value == NULL)
686 {
687 _mesa_error (ctx, GL_INVALID_VALUE, "glUniformMatrix2fvARB");
688 return;
689 }
690
Michal Krol8af48fc2006-03-14 11:23:16 +0000691 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000692
Michal Krol9ac96052006-02-27 14:41:41 +0000693 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000694 {
Michal Krol9ac96052006-02-27 14:41:41 +0000695 if (transpose)
696 {
697 GLfloat *trans, *pt;
698 const GLfloat *pv;
699
700 trans = (GLfloat *) _mesa_malloc (count * 4 * sizeof (GLfloat));
701 if (trans == NULL)
702 {
703 _mesa_error (ctx, GL_OUT_OF_MEMORY, "glUniformMatrix2fvARB");
704 return;
705 }
706 for (pt = trans, pv = value; pt != trans + count * 4; pt += 4, pv += 4)
707 {
708 pt[0] = pv[0];
709 pt[1] = pv[2];
710 pt[2] = pv[1];
711 pt[3] = pv[3];
712 }
Michal Krold55de652006-04-18 10:30:29 +0000713 if (!(**pro).WriteUniform (pro, location, count, trans, GL_FLOAT_MAT2))
Michal Krol9ac96052006-02-27 14:41:41 +0000714 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniformMatrix2fvARB");
715 _mesa_free (trans);
716 }
717 else
718 {
Michal Krold55de652006-04-18 10:30:29 +0000719 if (!(**pro).WriteUniform (pro, location, count, value, GL_FLOAT_MAT2))
Michal Krol9ac96052006-02-27 14:41:41 +0000720 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniformMatrix2fvARB");
721 }
Michal Krol6324f732005-01-13 14:12:50 +0000722 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000723}
724
Michal Krol9ac96052006-02-27 14:41:41 +0000725GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000726_mesa_UniformMatrix3fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000727{
728 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000729 GET_CURRENT_LINKED_PROGRAM(pro, "glUniformMatrix3fvARB");
730
Michal Krold55de652006-04-18 10:30:29 +0000731 if (value == NULL)
732 {
733 _mesa_error (ctx, GL_INVALID_VALUE, "glUniformMatrix3fvARB");
734 return;
735 }
736
Michal Krol8af48fc2006-03-14 11:23:16 +0000737 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000738
Michal Krol9ac96052006-02-27 14:41:41 +0000739 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000740 {
Michal Krol9ac96052006-02-27 14:41:41 +0000741 if (transpose)
742 {
743 GLfloat *trans, *pt;
744 const GLfloat *pv;
745
746 trans = (GLfloat *) _mesa_malloc (count * 9 * sizeof (GLfloat));
747 if (trans == NULL)
748 {
749 _mesa_error (ctx, GL_OUT_OF_MEMORY, "glUniformMatrix3fvARB");
750 return;
751 }
752 for (pt = trans, pv = value; pt != trans + count * 9; pt += 9, pv += 9)
753 {
754 pt[0] = pv[0];
755 pt[1] = pv[3];
756 pt[2] = pv[6];
757 pt[3] = pv[1];
758 pt[4] = pv[4];
759 pt[5] = pv[7];
760 pt[6] = pv[2];
761 pt[7] = pv[5];
762 pt[8] = pv[8];
763 }
Michal Krold55de652006-04-18 10:30:29 +0000764 if (!(**pro).WriteUniform (pro, location, count, trans, GL_FLOAT_MAT3))
Michal Krol9ac96052006-02-27 14:41:41 +0000765 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniformMatrix3fvARB");
766 _mesa_free (trans);
767 }
768 else
769 {
Michal Krold55de652006-04-18 10:30:29 +0000770 if (!(**pro).WriteUniform (pro, location, count, value, GL_FLOAT_MAT3))
Michal Krol9ac96052006-02-27 14:41:41 +0000771 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniformMatrix3fvARB");
772 }
Michal Krol6324f732005-01-13 14:12:50 +0000773 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000774}
775
Michal Krol9ac96052006-02-27 14:41:41 +0000776GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000777_mesa_UniformMatrix4fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000778{
779 GET_CURRENT_CONTEXT(ctx);
Brian Paul93269622006-04-14 03:43:39 +0000780 GET_CURRENT_LINKED_PROGRAM(pro, "glUniformMatrix4fvARB");
781
Michal Krold55de652006-04-18 10:30:29 +0000782 if (value == NULL)
783 {
784 _mesa_error (ctx, GL_INVALID_VALUE, "glUniformMatrix4fvARB");
785 return;
786 }
787
Michal Krol8af48fc2006-03-14 11:23:16 +0000788 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000789
Michal Krol9ac96052006-02-27 14:41:41 +0000790 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +0000791 {
Michal Krol9ac96052006-02-27 14:41:41 +0000792 if (transpose)
793 {
794 GLfloat *trans, *pt;
795 const GLfloat *pv;
796
797 trans = (GLfloat *) _mesa_malloc (count * 16 * sizeof (GLfloat));
798 if (trans == NULL)
799 {
800 _mesa_error (ctx, GL_OUT_OF_MEMORY, "glUniformMatrix4fvARB");
801 return;
802 }
803 for (pt = trans, pv = value; pt != trans + count * 16; pt += 16, pv += 16)
804 {
805 _math_transposef (pt, pv);
806 }
Michal Krold55de652006-04-18 10:30:29 +0000807 if (!(**pro).WriteUniform (pro, location, count, trans, GL_FLOAT_MAT4))
Michal Krol9ac96052006-02-27 14:41:41 +0000808 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniformMatrix4fvARB");
809 _mesa_free (trans);
810 }
811 else
812 {
Michal Krold55de652006-04-18 10:30:29 +0000813 if (!(**pro).WriteUniform (pro, location, count, value, GL_FLOAT_MAT4))
Michal Krol9ac96052006-02-27 14:41:41 +0000814 _mesa_error (ctx, GL_INVALID_OPERATION, "glUniformMatrix4fvARB");
815 }
Michal Krol6324f732005-01-13 14:12:50 +0000816 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000817}
818
819static GLboolean
820_mesa_get_object_parameter (GLhandleARB obj, GLenum pname, GLvoid *params, GLboolean *integral,
821 GLint *size)
822{
823 GET_CURRENT_CONTEXT(ctx);
Michal Krol1d7f7192005-03-25 12:12:50 +0000824 GLint *ipar = (GLint *) params;
Michal Krol1d7f7192005-03-25 12:12:50 +0000825
826 /* set default values */
827 *integral = GL_TRUE; /* indicates param type, TRUE: GLint, FALSE: GLfloat */
Michal Krol9ac96052006-02-27 14:41:41 +0000828 *size = 1; /* param array size */
Michal Krol1d7f7192005-03-25 12:12:50 +0000829
830 switch (pname)
831 {
832 case GL_OBJECT_TYPE_ARB:
Michal Krol9ac96052006-02-27 14:41:41 +0000833 case GL_OBJECT_DELETE_STATUS_ARB:
834 case GL_OBJECT_INFO_LOG_LENGTH_ARB:
835 {
836 GET_GENERIC(gen, obj, "glGetObjectParameterivARB");
837
838 if (gen == NULL)
839 return GL_FALSE;
840
841 switch (pname)
842 {
843 case GL_OBJECT_TYPE_ARB:
844 *ipar = (**gen).GetType (gen);
845 break;
846 case GL_OBJECT_DELETE_STATUS_ARB:
847 *ipar = (**gen).GetDeleteStatus (gen);
848 break;
Michal Krola1a02e62006-05-16 09:40:30 +0000849 case GL_OBJECT_INFO_LOG_LENGTH_ARB:
850 *ipar = (**gen).GetInfoLogLength (gen);
851 break;
Michal Krol9ac96052006-02-27 14:41:41 +0000852 }
853
854 RELEASE_GENERIC(gen);
Michal Krol1d7f7192005-03-25 12:12:50 +0000855 }
856 break;
Michal Krol9ac96052006-02-27 14:41:41 +0000857 case GL_OBJECT_SUBTYPE_ARB:
Michal Krol1d7f7192005-03-25 12:12:50 +0000858 case GL_OBJECT_COMPILE_STATUS_ARB:
Michal Krol9ac96052006-02-27 14:41:41 +0000859 case GL_OBJECT_SHADER_SOURCE_LENGTH_ARB:
860 {
861 GET_SHADER(sha, obj, "glGetObjectParameterivARB");
862
863 if (sha == NULL)
864 return GL_FALSE;
865
866 switch (pname)
867 {
868 case GL_OBJECT_SUBTYPE_ARB:
869 *ipar = (**sha).GetSubType (sha);
870 break;
871 case GL_OBJECT_COMPILE_STATUS_ARB:
872 *ipar = (**sha).GetCompileStatus (sha);
873 break;
874 case GL_OBJECT_SHADER_SOURCE_LENGTH_ARB:
875 {
876 const GLcharARB *src = (**sha).GetSource (sha);
877
878 if (src == NULL)
879 *ipar = 0;
880 else
881 *ipar = _mesa_strlen (src) + 1;
882 }
883 break;
884 }
885
886 RELEASE_SHADER(sha);
Michal Krol1d7f7192005-03-25 12:12:50 +0000887 }
888 break;
889 case GL_OBJECT_LINK_STATUS_ARB:
Michal Krol1d7f7192005-03-25 12:12:50 +0000890 case GL_OBJECT_VALIDATE_STATUS_ARB:
Michal Krol1d7f7192005-03-25 12:12:50 +0000891 case GL_OBJECT_ATTACHED_OBJECTS_ARB:
Michal Krol1d7f7192005-03-25 12:12:50 +0000892 case GL_OBJECT_ACTIVE_UNIFORMS_ARB:
Michal Krol1d7f7192005-03-25 12:12:50 +0000893 case GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB:
Michal Krol9ac96052006-02-27 14:41:41 +0000894 {
895 GET_PROGRAM(pro, obj, "glGetObjectParameterivARB");
896
897 if (pro == NULL)
898 return GL_FALSE;
899
900 switch (pname)
901 {
902 case GL_OBJECT_LINK_STATUS_ARB:
903 *ipar = (**pro).GetLinkStatus (pro);
904 break;
905 case GL_OBJECT_VALIDATE_STATUS_ARB:
906 *ipar = (**pro).GetValidateStatus (pro);
907 break;
Michal Krola1a02e62006-05-16 09:40:30 +0000908 case GL_OBJECT_ATTACHED_OBJECTS_ARB:
909 *ipar = (**pro)._container.GetAttachedCount ((struct gl2_container_intf **) (pro));
910 break;
Michal Krol9ac96052006-02-27 14:41:41 +0000911 case GL_OBJECT_ACTIVE_UNIFORMS_ARB:
Michal Krold55de652006-04-18 10:30:29 +0000912 *ipar = (**pro).GetActiveUniformCount (pro);
Michal Krol9ac96052006-02-27 14:41:41 +0000913 break;
914 case GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB:
Michal Krold55de652006-04-18 10:30:29 +0000915 *ipar = (**pro).GetActiveUniformMaxLength (pro);
916 break;
917 case GL_OBJECT_ACTIVE_ATTRIBUTES_ARB:
918 *ipar = (**pro).GetActiveAttribCount (pro);
919 break;
920 case GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB:
921 *ipar = (**pro).GetActiveAttribMaxLength (pro);
Michal Krol9ac96052006-02-27 14:41:41 +0000922 break;
923 }
924
925 RELEASE_PROGRAM(pro);
Michal Krol1d7f7192005-03-25 12:12:50 +0000926 }
927 break;
928 default:
929 _mesa_error (ctx, GL_INVALID_ENUM, "glGetObjectParameterivARB");
Michal Krol9ac96052006-02-27 14:41:41 +0000930 return GL_FALSE;
Michal Krol1d7f7192005-03-25 12:12:50 +0000931 }
932
Michal Krol9ac96052006-02-27 14:41:41 +0000933 return GL_TRUE;
Michal Krol1d7f7192005-03-25 12:12:50 +0000934}
935
Michal Krol9ac96052006-02-27 14:41:41 +0000936GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000937_mesa_GetObjectParameterfvARB (GLhandleARB obj, GLenum pname, GLfloat *params)
Michal Krol1d7f7192005-03-25 12:12:50 +0000938{
Michal Krold55de652006-04-18 10:30:29 +0000939 GET_CURRENT_CONTEXT(ctx);
Michal Krol1d7f7192005-03-25 12:12:50 +0000940 GLboolean integral;
Michal Krol9ac96052006-02-27 14:41:41 +0000941 GLint size;
Michal Krol1d7f7192005-03-25 12:12:50 +0000942
Michal Krold55de652006-04-18 10:30:29 +0000943 if (params == NULL)
944 {
945 _mesa_error (ctx, GL_INVALID_VALUE, "glGetObjectParameterfvARB");
946 return;
947 }
948
Michal Krol1d7f7192005-03-25 12:12:50 +0000949 assert (sizeof (GLfloat) == sizeof (GLint));
950
Michal Krol9ac96052006-02-27 14:41:41 +0000951 if (_mesa_get_object_parameter (obj, pname, (GLvoid *) params, &integral, &size))
952 if (integral)
953 {
954 GLint i;
955
Michal Krol1d7f7192005-03-25 12:12:50 +0000956 for (i = 0; i < size; i++)
957 params[i] = (GLfloat) ((GLint *) params)[i];
Michal Krol9ac96052006-02-27 14:41:41 +0000958 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000959}
960
Michal Krol9ac96052006-02-27 14:41:41 +0000961GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +0000962_mesa_GetObjectParameterivARB (GLhandleARB obj, GLenum pname, GLint *params)
Michal Krol1d7f7192005-03-25 12:12:50 +0000963{
Michal Krold55de652006-04-18 10:30:29 +0000964 GET_CURRENT_CONTEXT(ctx);
Michal Krol1d7f7192005-03-25 12:12:50 +0000965 GLboolean integral;
Michal Krol9ac96052006-02-27 14:41:41 +0000966 GLint size;
Michal Krol1d7f7192005-03-25 12:12:50 +0000967
Michal Krold55de652006-04-18 10:30:29 +0000968 if (params == NULL)
969 {
970 _mesa_error (ctx, GL_INVALID_VALUE, "glGetObjectParameterivARB");
971 return;
972 }
973
Michal Krol1d7f7192005-03-25 12:12:50 +0000974 assert (sizeof (GLfloat) == sizeof (GLint));
975
Michal Krol9ac96052006-02-27 14:41:41 +0000976 if (_mesa_get_object_parameter (obj, pname, (GLvoid *) params, &integral, &size))
977 if (!integral)
978 {
979 GLint i;
980
Michal Krol1d7f7192005-03-25 12:12:50 +0000981 for (i = 0; i < size; i++)
982 params[i] = (GLint) ((GLfloat *) params)[i];
Michal Krol9ac96052006-02-27 14:41:41 +0000983 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000984}
985
Brian Paul93269622006-04-14 03:43:39 +0000986
987/**
988 * Copy string from <src> to <dst>, up to maxLength characters, returning
989 * length of <dst> in <length>.
990 * \param src the strings source
991 * \param maxLength max chars to copy
992 * \param length returns numberof chars copied
993 * \param dst the string destination
994 */
Michal Krol9ac96052006-02-27 14:41:41 +0000995static GLvoid
Brian Paul93269622006-04-14 03:43:39 +0000996copy_string(const GLcharARB *src, GLsizei maxLength, GLsizei *length,
997 GLcharARB *dst)
Michal Krol1d7f7192005-03-25 12:12:50 +0000998{
999 GLsizei len;
Brian Paul93269622006-04-14 03:43:39 +00001000 for (len = 0; len < maxLength - 1 && src && src[len]; len++)
1001 dst[len] = src[len];
1002 if (maxLength > 0)
1003 dst[len] = 0;
1004 if (length)
Michal Krol6324f732005-01-13 14:12:50 +00001005 *length = len;
Michal Krolc1fe4692004-10-27 17:09:10 +00001006}
1007
Brian Paul93269622006-04-14 03:43:39 +00001008
Michal Krol9ac96052006-02-27 14:41:41 +00001009GLvoid GLAPIENTRY
Michal Krol1d7f7192005-03-25 12:12:50 +00001010_mesa_GetInfoLogARB (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog)
1011{
1012 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +00001013 GET_GENERIC(gen, obj, "glGetInfoLogARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001014
Michal Krold55de652006-04-18 10:30:29 +00001015 if (gen == NULL)
1016 return;
1017
1018 if (infoLog == NULL)
1019 _mesa_error (ctx, GL_INVALID_VALUE, "glGetInfoLogARB");
Michal Krola1a02e62006-05-16 09:40:30 +00001020 else {
1021 GLsizei actualsize = (**gen).GetInfoLogLength (gen);
1022 if (actualsize > maxLength)
1023 actualsize = maxLength;
1024 (**gen).GetInfoLog (gen, actualsize, infoLog);
1025 if (length != NULL)
1026 *length = (actualsize > 0) ? actualsize - 1 : 0;
1027 }
Michal Krold55de652006-04-18 10:30:29 +00001028 RELEASE_GENERIC(gen);
Michal Krol1d7f7192005-03-25 12:12:50 +00001029}
1030
Michal Krol9ac96052006-02-27 14:41:41 +00001031GLvoid GLAPIENTRY
1032_mesa_GetAttachedObjectsARB (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count,
1033 GLhandleARB *obj)
Michal Krol1d7f7192005-03-25 12:12:50 +00001034{
1035 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +00001036 GET_CONTAINER(con, containerObj, "glGetAttachedObjectsARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001037
Michal Krold55de652006-04-18 10:30:29 +00001038 if (con == NULL)
1039 return;
1040
1041 if (obj == NULL)
1042 _mesa_error (ctx, GL_INVALID_VALUE, "glGetAttachedObjectsARB");
1043 else
Michal Krol1d7f7192005-03-25 12:12:50 +00001044 {
Michal Krold55de652006-04-18 10:30:29 +00001045 GLsizei cnt, i;
1046
Michal Krol9ac96052006-02-27 14:41:41 +00001047 cnt = (**con).GetAttachedCount (con);
1048 if (cnt > maxCount)
1049 cnt = maxCount;
1050 if (count != NULL)
1051 *count = cnt;
1052
1053 for (i = 0; i < cnt; i++)
1054 {
Michal Krola1a02e62006-05-16 09:40:30 +00001055 struct gl2_generic_intf **x = (**con).GetAttached (con, i);
Michal Krol9ac96052006-02-27 14:41:41 +00001056 obj[i] = (**x).GetName (x);
1057 RELEASE_GENERIC(x);
1058 }
Michal Krol1d7f7192005-03-25 12:12:50 +00001059 }
Michal Krold55de652006-04-18 10:30:29 +00001060 RELEASE_CONTAINER(con);
Michal Krol9ac96052006-02-27 14:41:41 +00001061}
Michal Krolc1fe4692004-10-27 17:09:10 +00001062
1063GLint GLAPIENTRY
1064_mesa_GetUniformLocationARB (GLhandleARB programObj, const GLcharARB *name)
Michal Krol1d7f7192005-03-25 12:12:50 +00001065{
Michal Krol9ac96052006-02-27 14:41:41 +00001066 GET_CURRENT_CONTEXT(ctx);
Michal Krol1d7f7192005-03-25 12:12:50 +00001067 GLint loc = -1;
Michal Krol9ac96052006-02-27 14:41:41 +00001068 GET_LINKED_PROGRAM(pro, programObj, "glGetUniformLocationARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001069
Michal Krold55de652006-04-18 10:30:29 +00001070 if (pro == NULL)
1071 return -1;
1072
1073 if (name == NULL)
1074 _mesa_error (ctx, GL_INVALID_VALUE, "glGetUniformLocationARB");
1075 else
Michal Krol9ac96052006-02-27 14:41:41 +00001076 {
Michal Krold55de652006-04-18 10:30:29 +00001077 if (!IS_NAME_WITH_GL_PREFIX(name))
1078 loc = (**pro).GetUniformLocation (pro, name);
Michal Krol9ac96052006-02-27 14:41:41 +00001079 }
Michal Krold55de652006-04-18 10:30:29 +00001080 RELEASE_PROGRAM(pro);
Michal Krol6324f732005-01-13 14:12:50 +00001081 return loc;
Michal Krolc1fe4692004-10-27 17:09:10 +00001082}
1083
Michal Krol9ac96052006-02-27 14:41:41 +00001084GLvoid GLAPIENTRY
1085_mesa_GetActiveUniformARB (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length,
1086 GLint *size, GLenum *type, GLcharARB *name)
Michal Krol1d7f7192005-03-25 12:12:50 +00001087{
1088 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +00001089 GET_PROGRAM(pro, programObj, "glGetActiveUniformARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001090
Michal Krold55de652006-04-18 10:30:29 +00001091 if (pro == NULL)
1092 return;
1093
1094 if (size == NULL || type == NULL || name == NULL)
1095 _mesa_error (ctx, GL_INVALID_VALUE, "glGetActiveUniformARB");
1096 else
Michal Krol1d7f7192005-03-25 12:12:50 +00001097 {
Michal Krold55de652006-04-18 10:30:29 +00001098 if (index < (**pro).GetActiveUniformCount (pro))
1099 (**pro).GetActiveUniform (pro, index, maxLength, length, size, type, name);
Michal Krol9ac96052006-02-27 14:41:41 +00001100 else
1101 _mesa_error (ctx, GL_INVALID_VALUE, "glGetActiveUniformARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001102 }
Michal Krold55de652006-04-18 10:30:29 +00001103 RELEASE_PROGRAM(pro);
Michal Krolc1fe4692004-10-27 17:09:10 +00001104}
1105
Michal Krol9ac96052006-02-27 14:41:41 +00001106GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +00001107_mesa_GetUniformfvARB (GLhandleARB programObj, GLint location, GLfloat *params)
Michal Krol1d7f7192005-03-25 12:12:50 +00001108{
1109 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +00001110 GET_LINKED_PROGRAM(pro, programObj, "glGetUniformfvARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001111
Michal Krol9ac96052006-02-27 14:41:41 +00001112 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +00001113 {
Michal Krol9ac96052006-02-27 14:41:41 +00001114 /* TODO */
1115 RELEASE_PROGRAM(pro);
Michal Krol1d7f7192005-03-25 12:12:50 +00001116 }
Michal Krolc1fe4692004-10-27 17:09:10 +00001117}
1118
Michal Krol9ac96052006-02-27 14:41:41 +00001119GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +00001120_mesa_GetUniformivARB (GLhandleARB programObj, GLint location, GLint *params)
Michal Krol1d7f7192005-03-25 12:12:50 +00001121{
1122 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +00001123 GET_LINKED_PROGRAM(pro, programObj, "glGetUniformivARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001124
Michal Krol9ac96052006-02-27 14:41:41 +00001125 if (pro != NULL)
Michal Krol1d7f7192005-03-25 12:12:50 +00001126 {
Michal Krol9ac96052006-02-27 14:41:41 +00001127 /* TODO */
1128 RELEASE_PROGRAM(pro);
Michal Krol1d7f7192005-03-25 12:12:50 +00001129 }
Michal Krolc1fe4692004-10-27 17:09:10 +00001130}
1131
Michal Krol9ac96052006-02-27 14:41:41 +00001132GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +00001133_mesa_GetShaderSourceARB (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source)
Michal Krol1d7f7192005-03-25 12:12:50 +00001134{
1135 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +00001136 GET_SHADER(sha, obj, "glGetShaderSourceARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001137
Michal Krold55de652006-04-18 10:30:29 +00001138 if (sha == NULL)
1139 return;
1140
1141 if (source == NULL)
1142 _mesa_error (ctx, GL_INVALID_VALUE, "glGetShaderSourceARB");
1143 else
1144 copy_string ((**sha).GetSource (sha), maxLength, length, source);
1145 RELEASE_SHADER(sha);
Michal Krolc1fe4692004-10-27 17:09:10 +00001146}
1147
1148/* GL_ARB_vertex_shader */
1149
Michal Krol9ac96052006-02-27 14:41:41 +00001150GLvoid GLAPIENTRY
Michal Krolc1fe4692004-10-27 17:09:10 +00001151_mesa_BindAttribLocationARB (GLhandleARB programObj, GLuint index, const GLcharARB *name)
Michal Krol1d7f7192005-03-25 12:12:50 +00001152{
1153 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +00001154 GET_PROGRAM(pro, programObj, "glBindAttribLocationARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001155
Michal Krold55de652006-04-18 10:30:29 +00001156 if (pro == NULL)
1157 return;
1158
1159 if (name == NULL || index >= MAX_VERTEX_ATTRIBS)
1160 _mesa_error (ctx, GL_INVALID_VALUE, "glBindAttribLocationARB");
1161 else if (IS_NAME_WITH_GL_PREFIX(name))
1162 _mesa_error (ctx, GL_INVALID_OPERATION, "glBindAttribLocationARB");
1163 else
1164 (**pro).OverrideAttribBinding (pro, index, name);
1165 RELEASE_PROGRAM(pro);
Michal Krolc1fe4692004-10-27 17:09:10 +00001166}
1167
Michal Krol9ac96052006-02-27 14:41:41 +00001168GLvoid GLAPIENTRY
1169_mesa_GetActiveAttribARB (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length,
Michal Krold55de652006-04-18 10:30:29 +00001170 GLint *size, GLenum *type, GLcharARB *name)
Michal Krol1d7f7192005-03-25 12:12:50 +00001171{
1172 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +00001173 GET_PROGRAM(pro, programObj, "glGetActiveAttribARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001174
Michal Krold55de652006-04-18 10:30:29 +00001175 if (pro == NULL)
1176 return;
1177
1178 if (name == NULL || index >= (**pro).GetActiveAttribCount (pro))
1179 _mesa_error (ctx, GL_INVALID_VALUE, "glGetActiveAttribARB");
1180 else
1181 (**pro).GetActiveAttrib (pro, index, maxLength, length, size, type, name);
1182 RELEASE_PROGRAM(pro);
Michal Krolc1fe4692004-10-27 17:09:10 +00001183}
1184
1185GLint GLAPIENTRY
1186_mesa_GetAttribLocationARB (GLhandleARB programObj, const GLcharARB *name)
Michal Krol1d7f7192005-03-25 12:12:50 +00001187{
1188 GET_CURRENT_CONTEXT(ctx);
Michal Krol9ac96052006-02-27 14:41:41 +00001189 GLint loc = -1;
Michal Krold55de652006-04-18 10:30:29 +00001190 GET_LINKED_PROGRAM(pro, programObj, "glGetAttribLocationARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001191
Michal Krold55de652006-04-18 10:30:29 +00001192 if (pro == NULL)
1193 return -1;
1194
1195 if (name == NULL)
1196 _mesa_error (ctx, GL_INVALID_VALUE, "glGetAttribLocationARB");
1197 else if (!IS_NAME_WITH_GL_PREFIX(name))
1198 loc = (**pro).GetAttribLocation (pro, name);
1199 RELEASE_PROGRAM(pro);
Michal Krol6324f732005-01-13 14:12:50 +00001200 return loc;
Michal Krolc1fe4692004-10-27 17:09:10 +00001201}
1202
Michal Krol365582d2006-08-01 20:07:31 +00001203#endif
1204
Michal Krol9ac96052006-02-27 14:41:41 +00001205GLvoid
Michal Krol6324f732005-01-13 14:12:50 +00001206_mesa_init_shaderobjects (GLcontext *ctx)
Michal Krol1d7f7192005-03-25 12:12:50 +00001207{
Brian Paul93269622006-04-14 03:43:39 +00001208 ctx->ShaderObjects.CurrentProgram = NULL;
1209 ctx->ShaderObjects._FragmentShaderPresent = GL_FALSE;
Michal Krol07135702006-03-21 10:37:40 +00001210 ctx->ShaderObjects._VertexShaderPresent = GL_FALSE;
Michal Krol1d7f7192005-03-25 12:12:50 +00001211
1212 _mesa_init_shaderobjects_3dlabs (ctx);
Michal Krolc1fe4692004-10-27 17:09:10 +00001213}
Michal Krol1d7f7192005-03-25 12:12:50 +00001214