blob: 6540525e6e60951c20c739a2866f1f7d400fd9a1 [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 **
Brian Paule71e4c92006-11-02 16:09:10 +000054lookup_handle(GLcontext * ctx, GLhandleARB handle, enum gl2_uiid uiid,
55 const char *function)
Michal Krola1a02e62006-05-16 09:40:30 +000056{
57 struct gl2_unknown_intf **unk;
Michal Krol9ac96052006-02-27 14:41:41 +000058
Michal Krola1a02e62006-05-16 09:40:30 +000059 /*
60 * Note: _mesa_HashLookup() requires non-zero input values, so the passed-in handle value
61 * must be checked beforehand.
62 */
63 if (handle == 0) {
Brian Paule71e4c92006-11-02 16:09:10 +000064 _mesa_error(ctx, GL_INVALID_VALUE, function);
Michal Krola1a02e62006-05-16 09:40:30 +000065 return NULL;
66 }
Brian Paule71e4c92006-11-02 16:09:10 +000067 _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
68 unk =
69 (struct gl2_unknown_intf
70 **) (_mesa_HashLookup(ctx->Shared->GL2Objects, handle));
71 _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
Michal Krola1a02e62006-05-16 09:40:30 +000072 if (unk == NULL)
Brian Paule71e4c92006-11-02 16:09:10 +000073 _mesa_error(ctx, GL_INVALID_VALUE, function);
Michal Krola1a02e62006-05-16 09:40:30 +000074 else {
Brian Paule71e4c92006-11-02 16:09:10 +000075 unk = (**unk).QueryInterface(unk, uiid);
Michal Krola1a02e62006-05-16 09:40:30 +000076 if (unk == NULL)
Brian Paule71e4c92006-11-02 16:09:10 +000077 _mesa_error(ctx, GL_INVALID_OPERATION, function);
Michal Krola1a02e62006-05-16 09:40:30 +000078 }
79 return unk;
80}
Michal Krol9ac96052006-02-27 14:41:41 +000081
82#define GET_GENERIC(x, handle, function)\
Michal Krola1a02e62006-05-16 09:40:30 +000083 struct gl2_generic_intf **x = (struct gl2_generic_intf **)\
84 lookup_handle (ctx, handle, UIID_GENERIC, function);
Michal Krol9ac96052006-02-27 14:41:41 +000085
86#define GET_CONTAINER(x, handle, function)\
Michal Krola1a02e62006-05-16 09:40:30 +000087 struct gl2_container_intf **x = (struct gl2_container_intf **)\
88 lookup_handle (ctx, handle, UIID_CONTAINER, function);
Michal Krol9ac96052006-02-27 14:41:41 +000089
90#define GET_PROGRAM(x, handle, function)\
Michal Krola1a02e62006-05-16 09:40:30 +000091 struct gl2_program_intf **x = (struct gl2_program_intf **)\
92 lookup_handle (ctx, handle, UIID_PROGRAM, function);
Michal Krol9ac96052006-02-27 14:41:41 +000093
94#define GET_SHADER(x, handle, function)\
Michal Krola1a02e62006-05-16 09:40:30 +000095 struct gl2_shader_intf **x = (struct gl2_shader_intf **)\
96 lookup_handle (ctx, handle, UIID_SHADER, function);
Michal Krol9ac96052006-02-27 14:41:41 +000097
98#define GET_LINKED_PROGRAM(x, handle, function)\
Michal Krola1a02e62006-05-16 09:40:30 +000099 GET_PROGRAM(x, handle, function);\
100 if (x != NULL && (**x).GetLinkStatus (x) == GL_FALSE) {\
101 RELEASE_PROGRAM(x);\
102 x = NULL;\
103 _mesa_error (ctx, GL_INVALID_OPERATION, function);\
104 }
Michal Krol9ac96052006-02-27 14:41:41 +0000105
106#define GET_CURRENT_LINKED_PROGRAM(x, function)\
Michal Krola1a02e62006-05-16 09:40:30 +0000107 struct gl2_program_intf **x = NULL;\
108 if (ctx->ShaderObjects.CurrentProgram == NULL)\
109 _mesa_error (ctx, GL_INVALID_OPERATION, function);\
110 else {\
111 x = ctx->ShaderObjects.CurrentProgram;\
112 if (x != NULL && (**x).GetLinkStatus (x) == GL_FALSE) {\
113 x = NULL;\
114 _mesa_error (ctx, GL_INVALID_OPERATION, function);\
115 }\
116 }
Michal Krol9ac96052006-02-27 14:41:41 +0000117
Michal Krold55de652006-04-18 10:30:29 +0000118#define IS_NAME_WITH_GL_PREFIX(x) ((x)[0] == 'g' && (x)[1] == 'l' && (x)[2] == '_')
119
Michal Krol9ac96052006-02-27 14:41:41 +0000120
121GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000122_mesa_DeleteObjectARB(GLhandleARB obj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000123{
Brian Paule71e4c92006-11-02 16:09:10 +0000124 if (obj != 0) {
Michal Krola1a02e62006-05-16 09:40:30 +0000125 GET_CURRENT_CONTEXT(ctx);
126 GET_GENERIC(gen, obj, "glDeleteObjectARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000127
Brian Paule71e4c92006-11-02 16:09:10 +0000128 if (gen != NULL) {
129 (**gen).Delete(gen);
Michal Krola1a02e62006-05-16 09:40:30 +0000130 RELEASE_GENERIC(gen);
131 }
132 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000133}
134
135GLhandleARB GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000136_mesa_GetHandleARB(GLenum pname)
Michal Krol1d7f7192005-03-25 12:12:50 +0000137{
Brian Paule71e4c92006-11-02 16:09:10 +0000138 GET_CURRENT_CONTEXT(ctx);
Michal Krol1d7f7192005-03-25 12:12:50 +0000139
Brian Paule71e4c92006-11-02 16:09:10 +0000140 switch (pname) {
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)
Brian Paule71e4c92006-11-02 16:09:10 +0000146 return (**pro)._container._generic.
147 GetName((struct gl2_generic_intf **) (pro));
Michal Krola1a02e62006-05-16 09:40:30 +0000148 }
149 break;
Brian Paule71e4c92006-11-02 16:09:10 +0000150 default:
151 _mesa_error(ctx, GL_INVALID_ENUM, "glGetHandleARB");
152 }
Michal Krol6324f732005-01-13 14:12:50 +0000153
Brian Paule71e4c92006-11-02 16:09:10 +0000154 return 0;
Michal Krolc1fe4692004-10-27 17:09:10 +0000155}
156
Michal Krol9ac96052006-02-27 14:41:41 +0000157GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000158_mesa_DetachObjectARB(GLhandleARB containerObj, GLhandleARB attachedObj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000159{
Brian Paule71e4c92006-11-02 16:09:10 +0000160 GET_CURRENT_CONTEXT(ctx);
161 GET_CONTAINER(con, containerObj, "glDetachObjectARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000162
Brian Paule71e4c92006-11-02 16:09:10 +0000163 if (con != NULL) {
164 GET_GENERIC(att, attachedObj, "glDetachObjectARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000165
Brian Paule71e4c92006-11-02 16:09:10 +0000166 if (att != NULL) {
167 (**con).Detach(con, att);
168 RELEASE_GENERIC(att);
169 }
170 RELEASE_CONTAINER(con);
171 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000172}
173
174GLhandleARB GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000175_mesa_CreateShaderObjectARB(GLenum shaderType)
Michal Krol1d7f7192005-03-25 12:12:50 +0000176{
Brian Paule71e4c92006-11-02 16:09:10 +0000177 return _mesa_3dlabs_create_shader_object(shaderType);
Michal Krolc1fe4692004-10-27 17:09:10 +0000178}
179
Michal Krol9ac96052006-02-27 14:41:41 +0000180GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000181_mesa_ShaderSourceARB(GLhandleARB shaderObj, GLsizei count,
182 const GLcharARB ** string, const GLint * length)
Michal Krol1d7f7192005-03-25 12:12:50 +0000183{
Brian Paule71e4c92006-11-02 16:09:10 +0000184 GET_CURRENT_CONTEXT(ctx);
185 GLint *offsets;
186 GLsizei i;
187 GLcharARB *source;
188 GET_SHADER(sha, shaderObj, "glShaderSourceARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000189
Brian Paule71e4c92006-11-02 16:09:10 +0000190 if (sha == NULL)
191 return;
Brian Paul93269622006-04-14 03:43:39 +0000192
Brian Paule71e4c92006-11-02 16:09:10 +0000193 if (string == NULL) {
194 RELEASE_SHADER(sha);
195 _mesa_error(ctx, GL_INVALID_VALUE, "glShaderSourceARB");
196 return;
197 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000198
Brian Paule71e4c92006-11-02 16:09:10 +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 */
203 offsets = (GLint *) _mesa_malloc(count * sizeof(GLint));
204 if (offsets == NULL) {
205 RELEASE_SHADER(sha);
206 _mesa_error(ctx, GL_OUT_OF_MEMORY, "glShaderSourceARB");
207 return;
208 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000209
Brian Paule71e4c92006-11-02 16:09:10 +0000210 for (i = 0; i < count; i++) {
211 if (string[i] == NULL) {
212 _mesa_free((GLvoid *) offsets);
213 RELEASE_SHADER(sha);
214 _mesa_error(ctx, GL_INVALID_VALUE, "glShaderSourceARB");
215 return;
216 }
217 if (length == NULL || length[i] < 0)
218 offsets[i] = _mesa_strlen(string[i]);
219 else
220 offsets[i] = length[i];
221 /* accumulate string lengths */
222 if (i > 0)
223 offsets[i] += offsets[i - 1];
224 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000225
Brian Paule71e4c92006-11-02 16:09:10 +0000226 source =
227 (GLcharARB *) _mesa_malloc((offsets[count - 1] + 1) *
228 sizeof(GLcharARB));
229 if (source == NULL) {
230 _mesa_free((GLvoid *) offsets);
231 RELEASE_SHADER(sha);
232 _mesa_error(ctx, GL_OUT_OF_MEMORY, "glShaderSourceARB");
233 return;
234 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000235
Brian Paule71e4c92006-11-02 16:09:10 +0000236 for (i = 0; i < count; i++) {
237 GLint start = (i > 0) ? offsets[i - 1] : 0;
238 _mesa_memcpy(source + start, string[i],
239 (offsets[i] - start) * sizeof(GLcharARB));
240 }
241 source[offsets[count - 1]] = '\0';
Michal Krol1d7f7192005-03-25 12:12:50 +0000242
Brian Paule71e4c92006-11-02 16:09:10 +0000243 (**sha).SetSource(sha, source, offsets, count);
244 RELEASE_SHADER(sha);
Michal Krolc1fe4692004-10-27 17:09:10 +0000245}
246
Brian Paule71e4c92006-11-02 16:09:10 +0000247GLvoid GLAPIENTRY
248_mesa_CompileShaderARB(GLhandleARB shaderObj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000249{
Brian Paule71e4c92006-11-02 16:09:10 +0000250 GET_CURRENT_CONTEXT(ctx);
251 GET_SHADER(sha, shaderObj, "glCompileShaderARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000252
Brian Paule71e4c92006-11-02 16:09:10 +0000253 if (sha != NULL) {
254 (**sha).Compile(sha);
255 RELEASE_SHADER(sha);
256 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000257}
258
259GLhandleARB GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000260_mesa_CreateProgramObjectARB(GLvoid)
Michal Krolc1fe4692004-10-27 17:09:10 +0000261{
Brian Paule71e4c92006-11-02 16:09:10 +0000262 return _mesa_3dlabs_create_program_object();
Michal Krolc1fe4692004-10-27 17:09:10 +0000263}
264
Michal Krol9ac96052006-02-27 14:41:41 +0000265GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000266_mesa_AttachObjectARB(GLhandleARB containerObj, GLhandleARB obj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000267{
Brian Paule71e4c92006-11-02 16:09:10 +0000268 GET_CURRENT_CONTEXT(ctx);
269 GET_CONTAINER(con, containerObj, "glAttachObjectARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000270
Brian Paule71e4c92006-11-02 16:09:10 +0000271 if (con != NULL) {
272 GET_GENERIC(att, obj, "glAttachObjectARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000273
Brian Paule71e4c92006-11-02 16:09:10 +0000274 if (att != NULL) {
275 (**con).Attach(con, att);
276 RELEASE_GENERIC(att);
277 }
278 RELEASE_CONTAINER(con);
279 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000280}
281
Michal Krol9ac96052006-02-27 14:41:41 +0000282GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000283_mesa_LinkProgramARB(GLhandleARB programObj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000284{
Brian Paule71e4c92006-11-02 16:09:10 +0000285 GET_CURRENT_CONTEXT(ctx);
286 GET_PROGRAM(pro, programObj, "glLinkProgramARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000287
Brian Paule71e4c92006-11-02 16:09:10 +0000288 if (pro != NULL) {
289 (**pro).Link(pro);
290 if (pro == ctx->ShaderObjects.CurrentProgram) {
291 if ((**pro).GetLinkStatus(pro))
292 _mesa_UseProgramObjectARB(programObj);
293 else
294 _mesa_UseProgramObjectARB(0);
295 }
296 RELEASE_PROGRAM(pro);
297 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000298}
299
Michal Krol9ac96052006-02-27 14:41:41 +0000300GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000301_mesa_UseProgramObjectARB(GLhandleARB programObj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000302{
Brian Paule71e4c92006-11-02 16:09:10 +0000303 GET_CURRENT_CONTEXT(ctx);
Michal Krola1a02e62006-05-16 09:40:30 +0000304 struct gl2_program_intf **program = NULL;
Michal Krol9ac96052006-02-27 14:41:41 +0000305
Brian Paule71e4c92006-11-02 16:09:10 +0000306 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000307
Brian Paule71e4c92006-11-02 16:09:10 +0000308 if (programObj != 0) {
309 GET_PROGRAM(pro, programObj, "glUseProgramObjectARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000310
Brian Paule71e4c92006-11-02 16:09:10 +0000311 if (pro == NULL)
312 return;
Michal Krol1d7f7192005-03-25 12:12:50 +0000313
Brian Paule71e4c92006-11-02 16:09:10 +0000314 if ((**pro).GetLinkStatus(pro) == GL_FALSE) {
315 RELEASE_PROGRAM(pro);
316 _mesa_error(ctx, GL_INVALID_OPERATION, "glUseProgramObjectARB");
317 return;
318 }
Michal Krol9ac96052006-02-27 14:41:41 +0000319
Brian Paule71e4c92006-11-02 16:09:10 +0000320 program = pro;
Brian Paul93269622006-04-14 03:43:39 +0000321
Brian Paule71e4c92006-11-02 16:09:10 +0000322 ctx->ShaderObjects._VertexShaderPresent =
323 (**pro).IsShaderPresent(pro, GL_VERTEX_SHADER_ARB);
324 ctx->ShaderObjects._FragmentShaderPresent =
325 (**pro).IsShaderPresent(pro, GL_FRAGMENT_SHADER_ARB);
326 }
327 else {
328 ctx->ShaderObjects._VertexShaderPresent = GL_FALSE;
329 ctx->ShaderObjects._FragmentShaderPresent = GL_FALSE;
330 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000331
Brian Paule71e4c92006-11-02 16:09:10 +0000332 if (ctx->ShaderObjects.CurrentProgram != NULL)
333 RELEASE_PROGRAM(ctx->ShaderObjects.CurrentProgram);
334 ctx->ShaderObjects.CurrentProgram = program;
Michal Krolc1fe4692004-10-27 17:09:10 +0000335}
336
Michal Krol9ac96052006-02-27 14:41:41 +0000337GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000338_mesa_ValidateProgramARB(GLhandleARB programObj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000339{
Brian Paule71e4c92006-11-02 16:09:10 +0000340 GET_CURRENT_CONTEXT(ctx);
341 GET_PROGRAM(pro, programObj, "glValidateProgramARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000342
Brian Paule71e4c92006-11-02 16:09:10 +0000343 if (pro != NULL) {
344 (**pro).Validate(pro);
345 RELEASE_PROGRAM(pro);
346 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000347}
348
Michal Krol9ac96052006-02-27 14:41:41 +0000349GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000350_mesa_Uniform1fARB(GLint location, GLfloat v0)
Michal Krol9ac96052006-02-27 14:41:41 +0000351{
Brian Paule71e4c92006-11-02 16:09:10 +0000352 GET_CURRENT_CONTEXT(ctx);
353 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform1fARB");
Brian Paul93269622006-04-14 03:43:39 +0000354
Brian Paule71e4c92006-11-02 16:09:10 +0000355 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol9ac96052006-02-27 14:41:41 +0000356
Brian Paule71e4c92006-11-02 16:09:10 +0000357 if (pro != NULL) {
358 if (!(**pro).WriteUniform(pro, location, 1, &v0, GL_FLOAT))
359 _mesa_error(ctx, GL_INVALID_OPERATION, "glUniform1fARB");
360 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000361}
362
Michal Krol9ac96052006-02-27 14:41:41 +0000363GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000364_mesa_Uniform2fARB(GLint location, GLfloat v0, GLfloat v1)
Michal Krol1d7f7192005-03-25 12:12:50 +0000365{
Brian Paule71e4c92006-11-02 16:09:10 +0000366 GET_CURRENT_CONTEXT(ctx);
367 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform2fARB");
Brian Paul93269622006-04-14 03:43:39 +0000368
Brian Paule71e4c92006-11-02 16:09:10 +0000369 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000370
Brian Paule71e4c92006-11-02 16:09:10 +0000371 if (pro != NULL) {
372 GLfloat v[2];
373 v[0] = v0;
374 v[1] = v1;
Michal Krol9ac96052006-02-27 14:41:41 +0000375
Brian Paule71e4c92006-11-02 16:09:10 +0000376 if (!(**pro).WriteUniform(pro, location, 1, v, GL_FLOAT_VEC2))
377 _mesa_error(ctx, GL_INVALID_OPERATION, "glUniform2fARB");
378 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000379}
380
Michal Krol9ac96052006-02-27 14:41:41 +0000381GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000382_mesa_Uniform3fARB(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
Michal Krol1d7f7192005-03-25 12:12:50 +0000383{
Brian Paule71e4c92006-11-02 16:09:10 +0000384 GET_CURRENT_CONTEXT(ctx);
385 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform3fARB");
Brian Paul93269622006-04-14 03:43:39 +0000386
Brian Paule71e4c92006-11-02 16:09:10 +0000387 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000388
Brian Paule71e4c92006-11-02 16:09:10 +0000389 if (pro != NULL) {
390 GLfloat v[3];
391 v[0] = v0;
392 v[1] = v1;
393 v[2] = v2;
Michal Krol9ac96052006-02-27 14:41:41 +0000394
Brian Paule71e4c92006-11-02 16:09:10 +0000395 if (!(**pro).WriteUniform(pro, location, 1, v, GL_FLOAT_VEC3))
396 _mesa_error(ctx, GL_INVALID_OPERATION, "glUniform3fARB");
397 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000398}
399
Michal Krol9ac96052006-02-27 14:41:41 +0000400GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000401_mesa_Uniform4fARB(GLint location, GLfloat v0, GLfloat v1, GLfloat v2,
402 GLfloat v3)
Michal Krol1d7f7192005-03-25 12:12:50 +0000403{
Brian Paule71e4c92006-11-02 16:09:10 +0000404 GET_CURRENT_CONTEXT(ctx);
405 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform4fARB");
Brian Paul93269622006-04-14 03:43:39 +0000406
Brian Paule71e4c92006-11-02 16:09:10 +0000407 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000408
Brian Paule71e4c92006-11-02 16:09:10 +0000409 if (pro != NULL) {
410 GLfloat v[4];
411 v[0] = v0;
412 v[1] = v1;
413 v[2] = v2;
414 v[3] = v3;
Michal Krol9ac96052006-02-27 14:41:41 +0000415
Brian Paule71e4c92006-11-02 16:09:10 +0000416 if (!(**pro).WriteUniform(pro, location, 1, v, GL_FLOAT_VEC4))
417 _mesa_error(ctx, GL_INVALID_OPERATION, "glUniform4fARB");
418 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000419}
420
Michal Krol9ac96052006-02-27 14:41:41 +0000421GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000422_mesa_Uniform1iARB(GLint location, GLint v0)
Michal Krol1d7f7192005-03-25 12:12:50 +0000423{
Brian Paule71e4c92006-11-02 16:09:10 +0000424 GET_CURRENT_CONTEXT(ctx);
425 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform1iARB");
Brian Paul93269622006-04-14 03:43:39 +0000426
Brian Paule71e4c92006-11-02 16:09:10 +0000427 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000428
Brian Paule71e4c92006-11-02 16:09:10 +0000429 if (pro != NULL) {
430 if (!(**pro).WriteUniform(pro, location, 1, &v0, GL_INT))
431 _mesa_error(ctx, GL_INVALID_OPERATION, "glUniform1iARB");
432 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000433}
434
Michal Krol9ac96052006-02-27 14:41:41 +0000435GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000436_mesa_Uniform2iARB(GLint location, GLint v0, GLint v1)
Michal Krol1d7f7192005-03-25 12:12:50 +0000437{
Brian Paule71e4c92006-11-02 16:09:10 +0000438 GET_CURRENT_CONTEXT(ctx);
439 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform2iARB");
Brian Paul93269622006-04-14 03:43:39 +0000440
Brian Paule71e4c92006-11-02 16:09:10 +0000441 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000442
Brian Paule71e4c92006-11-02 16:09:10 +0000443 if (pro != NULL) {
444 GLint v[2];
445 v[0] = v0;
446 v[1] = v1;
Michal Krol9ac96052006-02-27 14:41:41 +0000447
Brian Paule71e4c92006-11-02 16:09:10 +0000448 if (!(**pro).WriteUniform(pro, location, 1, v, GL_INT_VEC2))
449 _mesa_error(ctx, GL_INVALID_OPERATION, "glUniform2iARB");
450 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000451}
452
Michal Krol9ac96052006-02-27 14:41:41 +0000453GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000454_mesa_Uniform3iARB(GLint location, GLint v0, GLint v1, GLint v2)
Michal Krol1d7f7192005-03-25 12:12:50 +0000455{
Brian Paule71e4c92006-11-02 16:09:10 +0000456 GET_CURRENT_CONTEXT(ctx);
457 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform3iARB");
Brian Paul93269622006-04-14 03:43:39 +0000458
Brian Paule71e4c92006-11-02 16:09:10 +0000459 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000460
Brian Paule71e4c92006-11-02 16:09:10 +0000461 if (pro != NULL) {
462 GLint v[3];
463 v[0] = v0;
464 v[1] = v1;
465 v[2] = v2;
Michal Krol9ac96052006-02-27 14:41:41 +0000466
Brian Paule71e4c92006-11-02 16:09:10 +0000467 if (!(**pro).WriteUniform(pro, location, 1, v, GL_INT_VEC3))
468 _mesa_error(ctx, GL_INVALID_OPERATION, "glUniform3iARB");
469 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000470}
471
Michal Krol9ac96052006-02-27 14:41:41 +0000472GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000473_mesa_Uniform4iARB(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
Michal Krol1d7f7192005-03-25 12:12:50 +0000474{
Brian Paule71e4c92006-11-02 16:09:10 +0000475 GET_CURRENT_CONTEXT(ctx);
476 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform4iARB");
Brian Paul93269622006-04-14 03:43:39 +0000477
Brian Paule71e4c92006-11-02 16:09:10 +0000478 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000479
Brian Paule71e4c92006-11-02 16:09:10 +0000480 if (pro != NULL) {
481 GLint v[4];
482 v[0] = v0;
483 v[1] = v1;
484 v[2] = v2;
485 v[3] = v3;
Michal Krol9ac96052006-02-27 14:41:41 +0000486
Brian Paule71e4c92006-11-02 16:09:10 +0000487 if (!(**pro).WriteUniform(pro, location, 1, v, GL_INT_VEC4))
488 _mesa_error(ctx, GL_INVALID_OPERATION, "glUniform4iARB");
489 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000490}
491
Michal Krol9ac96052006-02-27 14:41:41 +0000492GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000493_mesa_Uniform1fvARB(GLint location, GLsizei count, const GLfloat * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000494{
Brian Paule71e4c92006-11-02 16:09:10 +0000495 GET_CURRENT_CONTEXT(ctx);
496 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform1fvARB");
Brian Paul93269622006-04-14 03:43:39 +0000497
Brian Paule71e4c92006-11-02 16:09:10 +0000498 if (value == NULL) {
499 _mesa_error(ctx, GL_INVALID_VALUE, "glUniform1fvARB");
500 return;
501 }
Michal Krold55de652006-04-18 10:30:29 +0000502
Brian Paule71e4c92006-11-02 16:09:10 +0000503 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000504
Brian Paule71e4c92006-11-02 16:09:10 +0000505 if (pro != NULL) {
506 if (!(**pro).WriteUniform(pro, location, count, value, GL_FLOAT))
507 _mesa_error(ctx, GL_INVALID_OPERATION, "glUniform1fvARB");
508 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000509}
510
Michal Krol9ac96052006-02-27 14:41:41 +0000511GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000512_mesa_Uniform2fvARB(GLint location, GLsizei count, const GLfloat * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000513{
Brian Paule71e4c92006-11-02 16:09:10 +0000514 GET_CURRENT_CONTEXT(ctx);
515 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform2fvARB");
Brian Paul93269622006-04-14 03:43:39 +0000516
Brian Paule71e4c92006-11-02 16:09:10 +0000517 if (value == NULL) {
518 _mesa_error(ctx, GL_INVALID_VALUE, "glUniform2fvARB");
519 return;
520 }
Michal Krold55de652006-04-18 10:30:29 +0000521
Brian Paule71e4c92006-11-02 16:09:10 +0000522 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000523
Brian Paule71e4c92006-11-02 16:09:10 +0000524 if (pro != NULL) {
525 if (!(**pro).WriteUniform(pro, location, count, value, GL_FLOAT_VEC2))
526 _mesa_error(ctx, GL_INVALID_OPERATION, "glUniform2fvARB");
527 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000528}
529
Michal Krol9ac96052006-02-27 14:41:41 +0000530GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000531_mesa_Uniform3fvARB(GLint location, GLsizei count, const GLfloat * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000532{
Brian Paule71e4c92006-11-02 16:09:10 +0000533 GET_CURRENT_CONTEXT(ctx);
534 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform3fvARB");
Brian Paul93269622006-04-14 03:43:39 +0000535
Brian Paule71e4c92006-11-02 16:09:10 +0000536 if (value == NULL) {
537 _mesa_error(ctx, GL_INVALID_VALUE, "glUniform3fvARB");
538 return;
539 }
Michal Krold55de652006-04-18 10:30:29 +0000540
Brian Paule71e4c92006-11-02 16:09:10 +0000541 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000542
Brian Paule71e4c92006-11-02 16:09:10 +0000543 if (pro != NULL) {
544 if (!(**pro).WriteUniform(pro, location, count, value, GL_FLOAT_VEC3))
545 _mesa_error(ctx, GL_INVALID_OPERATION, "glUniform3fvARB");
546 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000547}
548
Michal Krol9ac96052006-02-27 14:41:41 +0000549GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000550_mesa_Uniform4fvARB(GLint location, GLsizei count, const GLfloat * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000551{
Brian Paule71e4c92006-11-02 16:09:10 +0000552 GET_CURRENT_CONTEXT(ctx);
553 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform4fvARB");
Brian Paul93269622006-04-14 03:43:39 +0000554
Brian Paule71e4c92006-11-02 16:09:10 +0000555 if (value == NULL) {
556 _mesa_error(ctx, GL_INVALID_VALUE, "glUniform4fvARB");
557 return;
558 }
Michal Krold55de652006-04-18 10:30:29 +0000559
Brian Paule71e4c92006-11-02 16:09:10 +0000560 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000561
Brian Paule71e4c92006-11-02 16:09:10 +0000562 if (pro != NULL) {
563 if (!(**pro).WriteUniform(pro, location, count, value, GL_FLOAT_VEC4))
564 _mesa_error(ctx, GL_INVALID_OPERATION, "glUniform4fvARB");
565 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000566}
567
Michal Krol9ac96052006-02-27 14:41:41 +0000568GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000569_mesa_Uniform1ivARB(GLint location, GLsizei count, const GLint * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000570{
Brian Paule71e4c92006-11-02 16:09:10 +0000571 GET_CURRENT_CONTEXT(ctx);
572 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform1ivARB");
Brian Paul93269622006-04-14 03:43:39 +0000573
Brian Paule71e4c92006-11-02 16:09:10 +0000574 if (value == NULL) {
575 _mesa_error(ctx, GL_INVALID_VALUE, "glUniform1ivARB");
576 return;
577 }
Michal Krold55de652006-04-18 10:30:29 +0000578
Brian Paule71e4c92006-11-02 16:09:10 +0000579 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000580
Brian Paule71e4c92006-11-02 16:09:10 +0000581 if (pro != NULL) {
582 if (!(**pro).WriteUniform(pro, location, count, value, GL_INT))
583 _mesa_error(ctx, GL_INVALID_OPERATION, "glUniform1ivARB");
584 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000585}
586
Michal Krol9ac96052006-02-27 14:41:41 +0000587GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000588_mesa_Uniform2ivARB(GLint location, GLsizei count, const GLint * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000589{
Brian Paule71e4c92006-11-02 16:09:10 +0000590 GET_CURRENT_CONTEXT(ctx);
591 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform2ivARB");
Brian Paul93269622006-04-14 03:43:39 +0000592
Brian Paule71e4c92006-11-02 16:09:10 +0000593 if (value == NULL) {
594 _mesa_error(ctx, GL_INVALID_VALUE, "glUniform2ivARB");
595 return;
596 }
Michal Krold55de652006-04-18 10:30:29 +0000597
Brian Paule71e4c92006-11-02 16:09:10 +0000598 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000599
Brian Paule71e4c92006-11-02 16:09:10 +0000600 if (pro != NULL) {
601 if (!(**pro).WriteUniform(pro, location, count, value, GL_INT_VEC2))
602 _mesa_error(ctx, GL_INVALID_OPERATION, "glUniform2ivARB");
603 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000604}
605
Michal Krol9ac96052006-02-27 14:41:41 +0000606GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000607_mesa_Uniform3ivARB(GLint location, GLsizei count, const GLint * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000608{
Brian Paule71e4c92006-11-02 16:09:10 +0000609 GET_CURRENT_CONTEXT(ctx);
610 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform3ivARB");
Brian Paul93269622006-04-14 03:43:39 +0000611
Brian Paule71e4c92006-11-02 16:09:10 +0000612 if (value == NULL) {
613 _mesa_error(ctx, GL_INVALID_VALUE, "glUniform3ivARB");
614 return;
615 }
Michal Krold55de652006-04-18 10:30:29 +0000616
Brian Paule71e4c92006-11-02 16:09:10 +0000617 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000618
Brian Paule71e4c92006-11-02 16:09:10 +0000619 if (pro != NULL) {
620 if (!(**pro).WriteUniform(pro, location, count, value, GL_INT_VEC3))
621 _mesa_error(ctx, GL_INVALID_OPERATION, "glUniform3ivARB");
622 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000623}
624
Michal Krol9ac96052006-02-27 14:41:41 +0000625GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000626_mesa_Uniform4ivARB(GLint location, GLsizei count, const GLint * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000627{
Brian Paule71e4c92006-11-02 16:09:10 +0000628 GET_CURRENT_CONTEXT(ctx);
629 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform4ivARB");
Brian Paul93269622006-04-14 03:43:39 +0000630
Brian Paule71e4c92006-11-02 16:09:10 +0000631 if (value == NULL) {
632 _mesa_error(ctx, GL_INVALID_VALUE, "glUniform4ivARB");
633 return;
634 }
Michal Krold55de652006-04-18 10:30:29 +0000635
Brian Paule71e4c92006-11-02 16:09:10 +0000636 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000637
Brian Paule71e4c92006-11-02 16:09:10 +0000638 if (pro != NULL) {
639 if (!(**pro).WriteUniform(pro, location, count, value, GL_INT_VEC4))
640 _mesa_error(ctx, GL_INVALID_OPERATION, "glUniform4ivARB");
641 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000642}
643
Michal Krol9ac96052006-02-27 14:41:41 +0000644GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000645_mesa_UniformMatrix2fvARB(GLint location, GLsizei count, GLboolean transpose,
646 const GLfloat * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000647{
Brian Paule71e4c92006-11-02 16:09:10 +0000648 GET_CURRENT_CONTEXT(ctx);
649 GET_CURRENT_LINKED_PROGRAM(pro, "glUniformMatrix2fvARB");
Brian Paul93269622006-04-14 03:43:39 +0000650
Brian Paule71e4c92006-11-02 16:09:10 +0000651 if (value == NULL) {
652 _mesa_error(ctx, GL_INVALID_VALUE, "glUniformMatrix2fvARB");
653 return;
654 }
Michal Krold55de652006-04-18 10:30:29 +0000655
Brian Paule71e4c92006-11-02 16:09:10 +0000656 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000657
Brian Paule71e4c92006-11-02 16:09:10 +0000658 if (pro != NULL) {
659 if (transpose) {
660 GLfloat *trans, *pt;
661 const GLfloat *pv;
Michal Krol9ac96052006-02-27 14:41:41 +0000662
Brian Paule71e4c92006-11-02 16:09:10 +0000663 trans = (GLfloat *) _mesa_malloc(count * 4 * sizeof(GLfloat));
664 if (trans == NULL) {
665 _mesa_error(ctx, GL_OUT_OF_MEMORY, "glUniformMatrix2fvARB");
666 return;
667 }
668 for (pt = trans, pv = value; pt != trans + count * 4;
669 pt += 4, pv += 4) {
670 pt[0] = pv[0];
671 pt[1] = pv[2];
672 pt[2] = pv[1];
673 pt[3] = pv[3];
674 }
675 if (!(**pro).
676 WriteUniform(pro, location, count, trans, GL_FLOAT_MAT2))
677 _mesa_error(ctx, GL_INVALID_OPERATION, "glUniformMatrix2fvARB");
678 _mesa_free(trans);
679 }
680 else {
681 if (!(**pro).
682 WriteUniform(pro, location, count, value, GL_FLOAT_MAT2))
683 _mesa_error(ctx, GL_INVALID_OPERATION, "glUniformMatrix2fvARB");
684 }
685 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000686}
687
Michal Krol9ac96052006-02-27 14:41:41 +0000688GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000689_mesa_UniformMatrix3fvARB(GLint location, GLsizei count, GLboolean transpose,
690 const GLfloat * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000691{
Brian Paule71e4c92006-11-02 16:09:10 +0000692 GET_CURRENT_CONTEXT(ctx);
693 GET_CURRENT_LINKED_PROGRAM(pro, "glUniformMatrix3fvARB");
Brian Paul93269622006-04-14 03:43:39 +0000694
Brian Paule71e4c92006-11-02 16:09:10 +0000695 if (value == NULL) {
696 _mesa_error(ctx, GL_INVALID_VALUE, "glUniformMatrix3fvARB");
697 return;
698 }
Michal Krold55de652006-04-18 10:30:29 +0000699
Brian Paule71e4c92006-11-02 16:09:10 +0000700 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000701
Brian Paule71e4c92006-11-02 16:09:10 +0000702 if (pro != NULL) {
703 if (transpose) {
704 GLfloat *trans, *pt;
705 const GLfloat *pv;
Michal Krol9ac96052006-02-27 14:41:41 +0000706
Brian Paule71e4c92006-11-02 16:09:10 +0000707 trans = (GLfloat *) _mesa_malloc(count * 9 * sizeof(GLfloat));
708 if (trans == NULL) {
709 _mesa_error(ctx, GL_OUT_OF_MEMORY, "glUniformMatrix3fvARB");
710 return;
711 }
712 for (pt = trans, pv = value; pt != trans + count * 9;
713 pt += 9, pv += 9) {
714 pt[0] = pv[0];
715 pt[1] = pv[3];
716 pt[2] = pv[6];
717 pt[3] = pv[1];
718 pt[4] = pv[4];
719 pt[5] = pv[7];
720 pt[6] = pv[2];
721 pt[7] = pv[5];
722 pt[8] = pv[8];
723 }
724 if (!(**pro).
725 WriteUniform(pro, location, count, trans, GL_FLOAT_MAT3))
726 _mesa_error(ctx, GL_INVALID_OPERATION, "glUniformMatrix3fvARB");
727 _mesa_free(trans);
728 }
729 else {
730 if (!(**pro).
731 WriteUniform(pro, location, count, value, GL_FLOAT_MAT3))
732 _mesa_error(ctx, GL_INVALID_OPERATION, "glUniformMatrix3fvARB");
733 }
734 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000735}
736
Michal Krol9ac96052006-02-27 14:41:41 +0000737GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000738_mesa_UniformMatrix4fvARB(GLint location, GLsizei count, GLboolean transpose,
739 const GLfloat * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000740{
Brian Paule71e4c92006-11-02 16:09:10 +0000741 GET_CURRENT_CONTEXT(ctx);
742 GET_CURRENT_LINKED_PROGRAM(pro, "glUniformMatrix4fvARB");
Brian Paul93269622006-04-14 03:43:39 +0000743
Brian Paule71e4c92006-11-02 16:09:10 +0000744 if (value == NULL) {
745 _mesa_error(ctx, GL_INVALID_VALUE, "glUniformMatrix4fvARB");
746 return;
747 }
Michal Krold55de652006-04-18 10:30:29 +0000748
Brian Paule71e4c92006-11-02 16:09:10 +0000749 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000750
Brian Paule71e4c92006-11-02 16:09:10 +0000751 if (pro != NULL) {
752 if (transpose) {
753 GLfloat *trans, *pt;
754 const GLfloat *pv;
Michal Krol9ac96052006-02-27 14:41:41 +0000755
Brian Paule71e4c92006-11-02 16:09:10 +0000756 trans = (GLfloat *) _mesa_malloc(count * 16 * sizeof(GLfloat));
757 if (trans == NULL) {
758 _mesa_error(ctx, GL_OUT_OF_MEMORY, "glUniformMatrix4fvARB");
759 return;
760 }
761 for (pt = trans, pv = value; pt != trans + count * 16;
762 pt += 16, pv += 16) {
763 _math_transposef(pt, pv);
764 }
765 if (!(**pro).
766 WriteUniform(pro, location, count, trans, GL_FLOAT_MAT4))
767 _mesa_error(ctx, GL_INVALID_OPERATION, "glUniformMatrix4fvARB");
768 _mesa_free(trans);
769 }
770 else {
771 if (!(**pro).
772 WriteUniform(pro, location, count, value, GL_FLOAT_MAT4))
773 _mesa_error(ctx, GL_INVALID_OPERATION, "glUniformMatrix4fvARB");
774 }
775 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000776}
777
778static GLboolean
Brian Paule71e4c92006-11-02 16:09:10 +0000779_mesa_get_object_parameter(GLhandleARB obj, GLenum pname, GLvoid * params,
780 GLboolean * integral, GLint * size)
Michal Krol1d7f7192005-03-25 12:12:50 +0000781{
Brian Paule71e4c92006-11-02 16:09:10 +0000782 GET_CURRENT_CONTEXT(ctx);
783 GLint *ipar = (GLint *) params;
Michal Krol1d7f7192005-03-25 12:12:50 +0000784
Brian Paule71e4c92006-11-02 16:09:10 +0000785 /* set default values */
786 *integral = GL_TRUE; /* indicates param type, TRUE: GLint, FALSE: GLfloat */
787 *size = 1; /* param array size */
Michal Krol1d7f7192005-03-25 12:12:50 +0000788
Brian Paule71e4c92006-11-02 16:09:10 +0000789 switch (pname) {
790 case GL_OBJECT_TYPE_ARB:
791 case GL_OBJECT_DELETE_STATUS_ARB:
792 case GL_OBJECT_INFO_LOG_LENGTH_ARB:
793 {
794 GET_GENERIC(gen, obj, "glGetObjectParameterivARB");
Michal Krol9ac96052006-02-27 14:41:41 +0000795
Brian Paule71e4c92006-11-02 16:09:10 +0000796 if (gen == NULL)
797 return GL_FALSE;
Michal Krol9ac96052006-02-27 14:41:41 +0000798
Brian Paule71e4c92006-11-02 16:09:10 +0000799 switch (pname) {
800 case GL_OBJECT_TYPE_ARB:
801 *ipar = (**gen).GetType(gen);
802 break;
803 case GL_OBJECT_DELETE_STATUS_ARB:
804 *ipar = (**gen).GetDeleteStatus(gen);
805 break;
Michal Krola1a02e62006-05-16 09:40:30 +0000806 case GL_OBJECT_INFO_LOG_LENGTH_ARB:
Brian Paule71e4c92006-11-02 16:09:10 +0000807 *ipar = (**gen).GetInfoLogLength(gen);
Michal Krola1a02e62006-05-16 09:40:30 +0000808 break;
Brian Paule71e4c92006-11-02 16:09:10 +0000809 }
Michal Krol9ac96052006-02-27 14:41:41 +0000810
Brian Paule71e4c92006-11-02 16:09:10 +0000811 RELEASE_GENERIC(gen);
812 }
813 break;
814 case GL_OBJECT_SUBTYPE_ARB:
815 case GL_OBJECT_COMPILE_STATUS_ARB:
816 case GL_OBJECT_SHADER_SOURCE_LENGTH_ARB:
817 {
818 GET_SHADER(sha, obj, "glGetObjectParameterivARB");
Michal Krol9ac96052006-02-27 14:41:41 +0000819
Brian Paule71e4c92006-11-02 16:09:10 +0000820 if (sha == NULL)
821 return GL_FALSE;
Michal Krol9ac96052006-02-27 14:41:41 +0000822
Brian Paule71e4c92006-11-02 16:09:10 +0000823 switch (pname) {
824 case GL_OBJECT_SUBTYPE_ARB:
825 *ipar = (**sha).GetSubType(sha);
826 break;
827 case GL_OBJECT_COMPILE_STATUS_ARB:
828 *ipar = (**sha).GetCompileStatus(sha);
829 break;
830 case GL_OBJECT_SHADER_SOURCE_LENGTH_ARB:
831 {
832 const GLcharARB *src = (**sha).GetSource(sha);
Michal Krol9ac96052006-02-27 14:41:41 +0000833
Brian Paule71e4c92006-11-02 16:09:10 +0000834 if (src == NULL)
835 *ipar = 0;
836 else
837 *ipar = _mesa_strlen(src) + 1;
838 }
839 break;
840 }
Michal Krol9ac96052006-02-27 14:41:41 +0000841
Brian Paule71e4c92006-11-02 16:09:10 +0000842 RELEASE_SHADER(sha);
843 }
844 break;
845 case GL_OBJECT_LINK_STATUS_ARB:
846 case GL_OBJECT_VALIDATE_STATUS_ARB:
847 case GL_OBJECT_ATTACHED_OBJECTS_ARB:
848 case GL_OBJECT_ACTIVE_UNIFORMS_ARB:
849 case GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB:
850 {
851 GET_PROGRAM(pro, obj, "glGetObjectParameterivARB");
Michal Krol9ac96052006-02-27 14:41:41 +0000852
Brian Paule71e4c92006-11-02 16:09:10 +0000853 if (pro == NULL)
854 return GL_FALSE;
Michal Krol9ac96052006-02-27 14:41:41 +0000855
Brian Paule71e4c92006-11-02 16:09:10 +0000856 switch (pname) {
857 case GL_OBJECT_LINK_STATUS_ARB:
858 *ipar = (**pro).GetLinkStatus(pro);
859 break;
860 case GL_OBJECT_VALIDATE_STATUS_ARB:
861 *ipar = (**pro).GetValidateStatus(pro);
862 break;
Michal Krola1a02e62006-05-16 09:40:30 +0000863 case GL_OBJECT_ATTACHED_OBJECTS_ARB:
Brian Paule71e4c92006-11-02 16:09:10 +0000864 *ipar =
865 (**pro)._container.
866 GetAttachedCount((struct gl2_container_intf **) (pro));
Michal Krola1a02e62006-05-16 09:40:30 +0000867 break;
Brian Paule71e4c92006-11-02 16:09:10 +0000868 case GL_OBJECT_ACTIVE_UNIFORMS_ARB:
869 *ipar = (**pro).GetActiveUniformCount(pro);
870 break;
871 case GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB:
872 *ipar = (**pro).GetActiveUniformMaxLength(pro);
873 break;
874 case GL_OBJECT_ACTIVE_ATTRIBUTES_ARB:
875 *ipar = (**pro).GetActiveAttribCount(pro);
876 break;
877 case GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB:
878 *ipar = (**pro).GetActiveAttribMaxLength(pro);
879 break;
880 }
Michal Krol9ac96052006-02-27 14:41:41 +0000881
Brian Paule71e4c92006-11-02 16:09:10 +0000882 RELEASE_PROGRAM(pro);
883 }
884 break;
885 default:
886 _mesa_error(ctx, GL_INVALID_ENUM, "glGetObjectParameterivARB");
887 return GL_FALSE;
888 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000889
Brian Paule71e4c92006-11-02 16:09:10 +0000890 return GL_TRUE;
Michal Krol1d7f7192005-03-25 12:12:50 +0000891}
892
Michal Krol9ac96052006-02-27 14:41:41 +0000893GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000894_mesa_GetObjectParameterfvARB(GLhandleARB obj, GLenum pname, GLfloat * params)
Michal Krol1d7f7192005-03-25 12:12:50 +0000895{
Brian Paule71e4c92006-11-02 16:09:10 +0000896 GET_CURRENT_CONTEXT(ctx);
897 GLboolean integral;
898 GLint size;
Michal Krol1d7f7192005-03-25 12:12:50 +0000899
Brian Paule71e4c92006-11-02 16:09:10 +0000900 if (params == NULL) {
901 _mesa_error(ctx, GL_INVALID_VALUE, "glGetObjectParameterfvARB");
902 return;
903 }
Michal Krold55de652006-04-18 10:30:29 +0000904
Brian Paule71e4c92006-11-02 16:09:10 +0000905 assert(sizeof(GLfloat) == sizeof(GLint));
Michal Krol1d7f7192005-03-25 12:12:50 +0000906
Brian Paule71e4c92006-11-02 16:09:10 +0000907 if (_mesa_get_object_parameter
908 (obj, pname, (GLvoid *) params, &integral, &size))
909 if (integral) {
910 GLint i;
Michal Krol9ac96052006-02-27 14:41:41 +0000911
Brian Paule71e4c92006-11-02 16:09:10 +0000912 for (i = 0; i < size; i++)
913 params[i] = (GLfloat) ((GLint *) params)[i];
914 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000915}
916
Michal Krol9ac96052006-02-27 14:41:41 +0000917GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000918_mesa_GetObjectParameterivARB(GLhandleARB obj, GLenum pname, GLint * params)
Michal Krol1d7f7192005-03-25 12:12:50 +0000919{
Brian Paule71e4c92006-11-02 16:09:10 +0000920 GET_CURRENT_CONTEXT(ctx);
921 GLboolean integral;
922 GLint size;
Michal Krol1d7f7192005-03-25 12:12:50 +0000923
Brian Paule71e4c92006-11-02 16:09:10 +0000924 if (params == NULL) {
925 _mesa_error(ctx, GL_INVALID_VALUE, "glGetObjectParameterivARB");
926 return;
927 }
Michal Krold55de652006-04-18 10:30:29 +0000928
Brian Paule71e4c92006-11-02 16:09:10 +0000929 assert(sizeof(GLfloat) == sizeof(GLint));
Michal Krol1d7f7192005-03-25 12:12:50 +0000930
Brian Paule71e4c92006-11-02 16:09:10 +0000931 if (_mesa_get_object_parameter
932 (obj, pname, (GLvoid *) params, &integral, &size))
933 if (!integral) {
934 GLint i;
Michal Krol9ac96052006-02-27 14:41:41 +0000935
Brian Paule71e4c92006-11-02 16:09:10 +0000936 for (i = 0; i < size; i++)
937 params[i] = (GLint) ((GLfloat *) params)[i];
938 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000939}
940
Brian Paul93269622006-04-14 03:43:39 +0000941
942/**
943 * Copy string from <src> to <dst>, up to maxLength characters, returning
944 * length of <dst> in <length>.
945 * \param src the strings source
946 * \param maxLength max chars to copy
947 * \param length returns numberof chars copied
948 * \param dst the string destination
949 */
Michal Krol9ac96052006-02-27 14:41:41 +0000950static GLvoid
Brian Paule71e4c92006-11-02 16:09:10 +0000951copy_string(const GLcharARB * src, GLsizei maxLength, GLsizei * length,
952 GLcharARB * dst)
Michal Krol1d7f7192005-03-25 12:12:50 +0000953{
Brian Paule71e4c92006-11-02 16:09:10 +0000954 GLsizei len;
955 for (len = 0; len < maxLength - 1 && src && src[len]; len++)
956 dst[len] = src[len];
957 if (maxLength > 0)
958 dst[len] = 0;
959 if (length)
960 *length = len;
Michal Krolc1fe4692004-10-27 17:09:10 +0000961}
962
Brian Paul93269622006-04-14 03:43:39 +0000963
Michal Krol9ac96052006-02-27 14:41:41 +0000964GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000965_mesa_GetInfoLogARB(GLhandleARB obj, GLsizei maxLength, GLsizei * length,
966 GLcharARB * infoLog)
Michal Krol1d7f7192005-03-25 12:12:50 +0000967{
Brian Paule71e4c92006-11-02 16:09:10 +0000968 GET_CURRENT_CONTEXT(ctx);
969 GET_GENERIC(gen, obj, "glGetInfoLogARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000970
Brian Paule71e4c92006-11-02 16:09:10 +0000971 if (gen == NULL)
972 return;
Michal Krold55de652006-04-18 10:30:29 +0000973
Brian Paule71e4c92006-11-02 16:09:10 +0000974 if (infoLog == NULL)
975 _mesa_error(ctx, GL_INVALID_VALUE, "glGetInfoLogARB");
Michal Krola1a02e62006-05-16 09:40:30 +0000976 else {
Brian Paule71e4c92006-11-02 16:09:10 +0000977 GLsizei actualsize = (**gen).GetInfoLogLength(gen);
Michal Krola1a02e62006-05-16 09:40:30 +0000978 if (actualsize > maxLength)
979 actualsize = maxLength;
Brian Paule71e4c92006-11-02 16:09:10 +0000980 (**gen).GetInfoLog(gen, actualsize, infoLog);
Michal Krola1a02e62006-05-16 09:40:30 +0000981 if (length != NULL)
982 *length = (actualsize > 0) ? actualsize - 1 : 0;
983 }
Brian Paule71e4c92006-11-02 16:09:10 +0000984 RELEASE_GENERIC(gen);
Michal Krol1d7f7192005-03-25 12:12:50 +0000985}
986
Michal Krol9ac96052006-02-27 14:41:41 +0000987GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000988_mesa_GetAttachedObjectsARB(GLhandleARB containerObj, GLsizei maxCount,
989 GLsizei * count, GLhandleARB * obj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000990{
Brian Paule71e4c92006-11-02 16:09:10 +0000991 GET_CURRENT_CONTEXT(ctx);
992 GET_CONTAINER(con, containerObj, "glGetAttachedObjectsARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000993
Brian Paule71e4c92006-11-02 16:09:10 +0000994 if (con == NULL)
995 return;
Michal Krold55de652006-04-18 10:30:29 +0000996
Brian Paule71e4c92006-11-02 16:09:10 +0000997 if (obj == NULL)
998 _mesa_error(ctx, GL_INVALID_VALUE, "glGetAttachedObjectsARB");
999 else {
1000 GLsizei cnt, i;
Michal Krold55de652006-04-18 10:30:29 +00001001
Brian Paule71e4c92006-11-02 16:09:10 +00001002 cnt = (**con).GetAttachedCount(con);
1003 if (cnt > maxCount)
1004 cnt = maxCount;
1005 if (count != NULL)
1006 *count = cnt;
Michal Krol9ac96052006-02-27 14:41:41 +00001007
Brian Paule71e4c92006-11-02 16:09:10 +00001008 for (i = 0; i < cnt; i++) {
1009 struct gl2_generic_intf **x = (**con).GetAttached(con, i);
1010 obj[i] = (**x).GetName(x);
1011 RELEASE_GENERIC(x);
1012 }
1013 }
1014 RELEASE_CONTAINER(con);
Michal Krol9ac96052006-02-27 14:41:41 +00001015}
Michal Krolc1fe4692004-10-27 17:09:10 +00001016
1017GLint GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +00001018_mesa_GetUniformLocationARB(GLhandleARB programObj, const GLcharARB * name)
Michal Krol1d7f7192005-03-25 12:12:50 +00001019{
Brian Paule71e4c92006-11-02 16:09:10 +00001020 GET_CURRENT_CONTEXT(ctx);
1021 GLint loc = -1;
1022 GET_LINKED_PROGRAM(pro, programObj, "glGetUniformLocationARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001023
Brian Paule71e4c92006-11-02 16:09:10 +00001024 if (pro == NULL)
1025 return -1;
Michal Krold55de652006-04-18 10:30:29 +00001026
Brian Paule71e4c92006-11-02 16:09:10 +00001027 if (name == NULL)
1028 _mesa_error(ctx, GL_INVALID_VALUE, "glGetUniformLocationARB");
1029 else {
1030 if (!IS_NAME_WITH_GL_PREFIX(name))
1031 loc = (**pro).GetUniformLocation(pro, name);
1032 }
1033 RELEASE_PROGRAM(pro);
1034 return loc;
Michal Krolc1fe4692004-10-27 17:09:10 +00001035}
1036
Michal Krol9ac96052006-02-27 14:41:41 +00001037GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +00001038_mesa_GetActiveUniformARB(GLhandleARB programObj, GLuint index,
1039 GLsizei maxLength, GLsizei * length, GLint * size,
1040 GLenum * type, GLcharARB * name)
Michal Krol1d7f7192005-03-25 12:12:50 +00001041{
Brian Paule71e4c92006-11-02 16:09:10 +00001042 GET_CURRENT_CONTEXT(ctx);
1043 GET_PROGRAM(pro, programObj, "glGetActiveUniformARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001044
Brian Paule71e4c92006-11-02 16:09:10 +00001045 if (pro == NULL)
1046 return;
Michal Krold55de652006-04-18 10:30:29 +00001047
Brian Paule71e4c92006-11-02 16:09:10 +00001048 if (size == NULL || type == NULL || name == NULL)
1049 _mesa_error(ctx, GL_INVALID_VALUE, "glGetActiveUniformARB");
1050 else {
1051 if (index < (**pro).GetActiveUniformCount(pro))
1052 (**pro).GetActiveUniform(pro, index, maxLength, length, size, type,
1053 name);
1054 else
1055 _mesa_error(ctx, GL_INVALID_VALUE, "glGetActiveUniformARB");
1056 }
1057 RELEASE_PROGRAM(pro);
Michal Krolc1fe4692004-10-27 17:09:10 +00001058}
1059
Michal Krol9ac96052006-02-27 14:41:41 +00001060GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +00001061_mesa_GetUniformfvARB(GLhandleARB programObj, GLint location,
1062 GLfloat * params)
Michal Krol1d7f7192005-03-25 12:12:50 +00001063{
Brian Paule71e4c92006-11-02 16:09:10 +00001064 GET_CURRENT_CONTEXT(ctx);
1065 GET_LINKED_PROGRAM(pro, programObj, "glGetUniformfvARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001066
Brian Paule71e4c92006-11-02 16:09:10 +00001067 if (pro != NULL) {
1068 /* TODO */
1069 RELEASE_PROGRAM(pro);
1070 }
Michal Krolc1fe4692004-10-27 17:09:10 +00001071}
1072
Michal Krol9ac96052006-02-27 14:41:41 +00001073GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +00001074_mesa_GetUniformivARB(GLhandleARB programObj, GLint location, GLint * params)
Michal Krol1d7f7192005-03-25 12:12:50 +00001075{
Brian Paule71e4c92006-11-02 16:09:10 +00001076 GET_CURRENT_CONTEXT(ctx);
1077 GET_LINKED_PROGRAM(pro, programObj, "glGetUniformivARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001078
Brian Paule71e4c92006-11-02 16:09:10 +00001079 if (pro != NULL) {
1080 /* TODO */
1081 RELEASE_PROGRAM(pro);
1082 }
Michal Krolc1fe4692004-10-27 17:09:10 +00001083}
1084
Michal Krol9ac96052006-02-27 14:41:41 +00001085GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +00001086_mesa_GetShaderSourceARB(GLhandleARB obj, GLsizei maxLength, GLsizei * length,
1087 GLcharARB * source)
Michal Krol1d7f7192005-03-25 12:12:50 +00001088{
Brian Paule71e4c92006-11-02 16:09:10 +00001089 GET_CURRENT_CONTEXT(ctx);
1090 GET_SHADER(sha, obj, "glGetShaderSourceARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001091
Brian Paule71e4c92006-11-02 16:09:10 +00001092 if (sha == NULL)
1093 return;
Michal Krold55de652006-04-18 10:30:29 +00001094
Brian Paule71e4c92006-11-02 16:09:10 +00001095 if (source == NULL)
1096 _mesa_error(ctx, GL_INVALID_VALUE, "glGetShaderSourceARB");
1097 else
1098 copy_string((**sha).GetSource(sha), maxLength, length, source);
1099 RELEASE_SHADER(sha);
Michal Krolc1fe4692004-10-27 17:09:10 +00001100}
1101
1102/* GL_ARB_vertex_shader */
1103
Michal Krol9ac96052006-02-27 14:41:41 +00001104GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +00001105_mesa_BindAttribLocationARB(GLhandleARB programObj, GLuint index,
1106 const GLcharARB * name)
Michal Krol1d7f7192005-03-25 12:12:50 +00001107{
Brian Paule71e4c92006-11-02 16:09:10 +00001108 GET_CURRENT_CONTEXT(ctx);
1109 GET_PROGRAM(pro, programObj, "glBindAttribLocationARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001110
Brian Paule71e4c92006-11-02 16:09:10 +00001111 if (pro == NULL)
1112 return;
Michal Krold55de652006-04-18 10:30:29 +00001113
Brian Paule71e4c92006-11-02 16:09:10 +00001114 if (name == NULL || index >= MAX_VERTEX_ATTRIBS)
1115 _mesa_error(ctx, GL_INVALID_VALUE, "glBindAttribLocationARB");
1116 else if (IS_NAME_WITH_GL_PREFIX(name))
1117 _mesa_error(ctx, GL_INVALID_OPERATION, "glBindAttribLocationARB");
1118 else
1119 (**pro).OverrideAttribBinding(pro, index, name);
1120 RELEASE_PROGRAM(pro);
Michal Krolc1fe4692004-10-27 17:09:10 +00001121}
1122
Michal Krol9ac96052006-02-27 14:41:41 +00001123GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +00001124_mesa_GetActiveAttribARB(GLhandleARB programObj, GLuint index,
1125 GLsizei maxLength, GLsizei * length, GLint * size,
1126 GLenum * type, GLcharARB * name)
Michal Krol1d7f7192005-03-25 12:12:50 +00001127{
Brian Paule71e4c92006-11-02 16:09:10 +00001128 GET_CURRENT_CONTEXT(ctx);
1129 GET_PROGRAM(pro, programObj, "glGetActiveAttribARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001130
Brian Paule71e4c92006-11-02 16:09:10 +00001131 if (pro == NULL)
1132 return;
Michal Krold55de652006-04-18 10:30:29 +00001133
Brian Paule71e4c92006-11-02 16:09:10 +00001134 if (name == NULL || index >= (**pro).GetActiveAttribCount(pro))
1135 _mesa_error(ctx, GL_INVALID_VALUE, "glGetActiveAttribARB");
1136 else
1137 (**pro).GetActiveAttrib(pro, index, maxLength, length, size, type,
1138 name);
1139 RELEASE_PROGRAM(pro);
Michal Krolc1fe4692004-10-27 17:09:10 +00001140}
1141
1142GLint GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +00001143_mesa_GetAttribLocationARB(GLhandleARB programObj, const GLcharARB * name)
Michal Krol1d7f7192005-03-25 12:12:50 +00001144{
Brian Paule71e4c92006-11-02 16:09:10 +00001145 GET_CURRENT_CONTEXT(ctx);
1146 GLint loc = -1;
1147 GET_LINKED_PROGRAM(pro, programObj, "glGetAttribLocationARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001148
Brian Paule71e4c92006-11-02 16:09:10 +00001149 if (pro == NULL)
1150 return -1;
Michal Krold55de652006-04-18 10:30:29 +00001151
Brian Paule71e4c92006-11-02 16:09:10 +00001152 if (name == NULL)
1153 _mesa_error(ctx, GL_INVALID_VALUE, "glGetAttribLocationARB");
1154 else if (!IS_NAME_WITH_GL_PREFIX(name))
1155 loc = (**pro).GetAttribLocation(pro, name);
1156 RELEASE_PROGRAM(pro);
1157 return loc;
Michal Krolc1fe4692004-10-27 17:09:10 +00001158}
1159
Brian Paulf961d392006-11-02 16:11:31 +00001160
1161/**
1162 ** OpenGL 2.0 functions which basically wrap the ARB_shader functions
1163 **/
1164
1165void GLAPIENTRY
1166_mesa_AttachShader(GLuint program, GLuint shader)
1167{
1168 _mesa_AttachObjectARB(program, shader);
1169}
1170
1171
1172GLuint GLAPIENTRY
1173_mesa_CreateShader(GLenum type)
1174{
1175 return (GLuint) _mesa_CreateShaderObjectARB(type);
1176}
1177
1178GLuint GLAPIENTRY
1179_mesa_CreateProgram(void)
1180{
1181 return (GLuint) _mesa_CreateProgramObjectARB();
1182}
1183
1184void GLAPIENTRY
1185_mesa_DeleteProgram(GLuint program)
1186{
1187 _mesa_DeleteObjectARB(program);
1188}
1189
1190
1191void GLAPIENTRY
1192_mesa_DeleteShader(GLuint shader)
1193{
1194 _mesa_DeleteObjectARB(shader);
1195}
1196
1197void GLAPIENTRY
1198_mesa_DetachShader(GLuint program, GLuint shader)
1199{
1200 _mesa_DetachObjectARB(program, shader);
1201}
1202
1203void GLAPIENTRY
1204_mesa_GetAttachedShaders(GLuint program, GLsizei maxCount,
1205 GLsizei *count, GLuint *obj)
1206{
1207 _mesa_GetAttachedObjectsARB(program, maxCount, count, obj);
1208}
1209
1210void GLAPIENTRY
1211_mesa_GetProgramiv(GLuint program, GLenum pname, GLint *params)
1212{
1213 /* XXX to do */
1214}
1215
1216void GLAPIENTRY
1217_mesa_GetProgramInfoLog(GLuint program, GLsizei bufSize,
1218 GLsizei *length, GLchar *infoLog)
1219{
1220 _mesa_GetInfoLogARB(program, bufSize, length, infoLog);
1221}
1222
1223void GLAPIENTRY
1224_mesa_GetShaderiv(GLuint shader, GLenum pname, GLint *params)
1225{
1226 /* XXX to do */
1227}
1228
1229void GLAPIENTRY
1230_mesa_GetShaderInfoLog(GLuint shader, GLsizei bufSize,
1231 GLsizei *length, GLchar *infoLog)
1232{
1233 _mesa_GetInfoLogARB(shader, bufSize, length, infoLog);
1234}
1235
1236GLboolean GLAPIENTRY
Brian Paul12fe1b32006-11-02 16:21:04 +00001237_mesa_IsProgram(GLuint program)
Brian Paulf961d392006-11-02 16:11:31 +00001238{
1239 GET_CURRENT_CONTEXT(ctx);
1240 GET_GENERIC(gen, program, "glIsProgram");
1241 return gen ? GL_TRUE : GL_FALSE;
1242}
1243
1244GLboolean GLAPIENTRY
1245_mesa_IsShader(GLuint shader)
1246{
1247 GET_CURRENT_CONTEXT(ctx);
1248 GET_GENERIC(gen, shader, "glIsProgram");
1249 return gen ? GL_TRUE : GL_FALSE;
1250}
1251
1252
Michal Krol365582d2006-08-01 20:07:31 +00001253#endif
1254
Michal Krol9ac96052006-02-27 14:41:41 +00001255GLvoid
Brian Paule71e4c92006-11-02 16:09:10 +00001256_mesa_init_shaderobjects(GLcontext * ctx)
Michal Krol1d7f7192005-03-25 12:12:50 +00001257{
Brian Paule71e4c92006-11-02 16:09:10 +00001258 ctx->ShaderObjects.CurrentProgram = NULL;
1259 ctx->ShaderObjects._FragmentShaderPresent = GL_FALSE;
1260 ctx->ShaderObjects._VertexShaderPresent = GL_FALSE;
Michal Krol1d7f7192005-03-25 12:12:50 +00001261
Brian Paule71e4c92006-11-02 16:09:10 +00001262 _mesa_init_shaderobjects_3dlabs(ctx);
Michal Krolc1fe4692004-10-27 17:09:10 +00001263}