blob: b9068d4a966b1969f60f72ee40b4f496a32e196b [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
Brian Paulbdb251b2006-11-03 17:29:31 +000053
54
Michal Krola1a02e62006-05-16 09:40:30 +000055static struct gl2_unknown_intf **
Brian Paule71e4c92006-11-02 16:09:10 +000056lookup_handle(GLcontext * ctx, GLhandleARB handle, enum gl2_uiid uiid,
57 const char *function)
Michal Krola1a02e62006-05-16 09:40:30 +000058{
59 struct gl2_unknown_intf **unk;
Michal Krol9ac96052006-02-27 14:41:41 +000060
Michal Krola1a02e62006-05-16 09:40:30 +000061 /*
Brian Paulbdb251b2006-11-03 17:29:31 +000062 * Note: _mesa_HashLookup() requires non-zero input values, so the
63 * passed-in handle value must be checked beforehand.
Michal Krola1a02e62006-05-16 09:40:30 +000064 */
65 if (handle == 0) {
Brian Paule71e4c92006-11-02 16:09:10 +000066 _mesa_error(ctx, GL_INVALID_VALUE, function);
Michal Krola1a02e62006-05-16 09:40:30 +000067 return NULL;
68 }
Brian Paule71e4c92006-11-02 16:09:10 +000069 _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
Brian Paulbdb251b2006-11-03 17:29:31 +000070 unk = (struct gl2_unknown_intf **)
71 (_mesa_HashLookup(ctx->Shared->GL2Objects, handle));
Brian Paule71e4c92006-11-02 16:09:10 +000072 _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
Brian Paulbdb251b2006-11-03 17:29:31 +000073
74 if (unk == NULL) {
Brian Paule71e4c92006-11-02 16:09:10 +000075 _mesa_error(ctx, GL_INVALID_VALUE, function);
Brian Paulbdb251b2006-11-03 17:29:31 +000076 }
Michal Krola1a02e62006-05-16 09:40:30 +000077 else {
Brian Paule71e4c92006-11-02 16:09:10 +000078 unk = (**unk).QueryInterface(unk, uiid);
Michal Krola1a02e62006-05-16 09:40:30 +000079 if (unk == NULL)
Brian Paule71e4c92006-11-02 16:09:10 +000080 _mesa_error(ctx, GL_INVALID_OPERATION, function);
Michal Krola1a02e62006-05-16 09:40:30 +000081 }
82 return unk;
83}
Michal Krol9ac96052006-02-27 14:41:41 +000084
85#define GET_GENERIC(x, handle, function)\
Michal Krola1a02e62006-05-16 09:40:30 +000086 struct gl2_generic_intf **x = (struct gl2_generic_intf **)\
87 lookup_handle (ctx, handle, UIID_GENERIC, function);
Michal Krol9ac96052006-02-27 14:41:41 +000088
89#define GET_CONTAINER(x, handle, function)\
Michal Krola1a02e62006-05-16 09:40:30 +000090 struct gl2_container_intf **x = (struct gl2_container_intf **)\
91 lookup_handle (ctx, handle, UIID_CONTAINER, function);
Michal Krol9ac96052006-02-27 14:41:41 +000092
93#define GET_PROGRAM(x, handle, function)\
Michal Krola1a02e62006-05-16 09:40:30 +000094 struct gl2_program_intf **x = (struct gl2_program_intf **)\
95 lookup_handle (ctx, handle, UIID_PROGRAM, function);
Michal Krol9ac96052006-02-27 14:41:41 +000096
97#define GET_SHADER(x, handle, function)\
Michal Krola1a02e62006-05-16 09:40:30 +000098 struct gl2_shader_intf **x = (struct gl2_shader_intf **)\
99 lookup_handle (ctx, handle, UIID_SHADER, function);
Michal Krol9ac96052006-02-27 14:41:41 +0000100
101#define GET_LINKED_PROGRAM(x, handle, function)\
Michal Krola1a02e62006-05-16 09:40:30 +0000102 GET_PROGRAM(x, handle, function);\
103 if (x != NULL && (**x).GetLinkStatus (x) == GL_FALSE) {\
104 RELEASE_PROGRAM(x);\
105 x = NULL;\
106 _mesa_error (ctx, GL_INVALID_OPERATION, function);\
107 }
Michal Krol9ac96052006-02-27 14:41:41 +0000108
109#define GET_CURRENT_LINKED_PROGRAM(x, function)\
Michal Krola1a02e62006-05-16 09:40:30 +0000110 struct gl2_program_intf **x = NULL;\
111 if (ctx->ShaderObjects.CurrentProgram == NULL)\
112 _mesa_error (ctx, GL_INVALID_OPERATION, function);\
113 else {\
114 x = ctx->ShaderObjects.CurrentProgram;\
115 if (x != NULL && (**x).GetLinkStatus (x) == GL_FALSE) {\
116 x = NULL;\
117 _mesa_error (ctx, GL_INVALID_OPERATION, function);\
118 }\
119 }
Michal Krol9ac96052006-02-27 14:41:41 +0000120
Michal Krold55de652006-04-18 10:30:29 +0000121#define IS_NAME_WITH_GL_PREFIX(x) ((x)[0] == 'g' && (x)[1] == 'l' && (x)[2] == '_')
122
Michal Krol9ac96052006-02-27 14:41:41 +0000123
124GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000125_mesa_DeleteObjectARB(GLhandleARB obj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000126{
Brian Paule71e4c92006-11-02 16:09:10 +0000127 if (obj != 0) {
Michal Krola1a02e62006-05-16 09:40:30 +0000128 GET_CURRENT_CONTEXT(ctx);
129 GET_GENERIC(gen, obj, "glDeleteObjectARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000130
Brian Paule71e4c92006-11-02 16:09:10 +0000131 if (gen != NULL) {
132 (**gen).Delete(gen);
Michal Krola1a02e62006-05-16 09:40:30 +0000133 RELEASE_GENERIC(gen);
134 }
135 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000136}
137
138GLhandleARB GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000139_mesa_GetHandleARB(GLenum pname)
Michal Krol1d7f7192005-03-25 12:12:50 +0000140{
Brian Paule71e4c92006-11-02 16:09:10 +0000141 GET_CURRENT_CONTEXT(ctx);
Michal Krol1d7f7192005-03-25 12:12:50 +0000142
Brian Paule71e4c92006-11-02 16:09:10 +0000143 switch (pname) {
Michal Krola1a02e62006-05-16 09:40:30 +0000144 case GL_PROGRAM_OBJECT_ARB:
145 {
146 struct gl2_program_intf **pro = ctx->ShaderObjects.CurrentProgram;
Michal Krol9ac96052006-02-27 14:41:41 +0000147
Michal Krola1a02e62006-05-16 09:40:30 +0000148 if (pro != NULL)
Brian Paule71e4c92006-11-02 16:09:10 +0000149 return (**pro)._container._generic.
150 GetName((struct gl2_generic_intf **) (pro));
Michal Krola1a02e62006-05-16 09:40:30 +0000151 }
152 break;
Brian Paule71e4c92006-11-02 16:09:10 +0000153 default:
154 _mesa_error(ctx, GL_INVALID_ENUM, "glGetHandleARB");
155 }
Michal Krol6324f732005-01-13 14:12:50 +0000156
Brian Paule71e4c92006-11-02 16:09:10 +0000157 return 0;
Michal Krolc1fe4692004-10-27 17:09:10 +0000158}
159
Michal Krol9ac96052006-02-27 14:41:41 +0000160GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000161_mesa_DetachObjectARB(GLhandleARB containerObj, GLhandleARB attachedObj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000162{
Brian Paule71e4c92006-11-02 16:09:10 +0000163 GET_CURRENT_CONTEXT(ctx);
164 GET_CONTAINER(con, containerObj, "glDetachObjectARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000165
Brian Paule71e4c92006-11-02 16:09:10 +0000166 if (con != NULL) {
167 GET_GENERIC(att, attachedObj, "glDetachObjectARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000168
Brian Paule71e4c92006-11-02 16:09:10 +0000169 if (att != NULL) {
170 (**con).Detach(con, att);
171 RELEASE_GENERIC(att);
172 }
173 RELEASE_CONTAINER(con);
174 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000175}
176
177GLhandleARB GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000178_mesa_CreateShaderObjectARB(GLenum shaderType)
Michal Krol1d7f7192005-03-25 12:12:50 +0000179{
Brian Paule71e4c92006-11-02 16:09:10 +0000180 return _mesa_3dlabs_create_shader_object(shaderType);
Michal Krolc1fe4692004-10-27 17:09:10 +0000181}
182
Michal Krol9ac96052006-02-27 14:41:41 +0000183GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000184_mesa_ShaderSourceARB(GLhandleARB shaderObj, GLsizei count,
185 const GLcharARB ** string, const GLint * length)
Michal Krol1d7f7192005-03-25 12:12:50 +0000186{
Brian Paule71e4c92006-11-02 16:09:10 +0000187 GET_CURRENT_CONTEXT(ctx);
188 GLint *offsets;
189 GLsizei i;
190 GLcharARB *source;
191 GET_SHADER(sha, shaderObj, "glShaderSourceARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000192
Brian Paule71e4c92006-11-02 16:09:10 +0000193 if (sha == NULL)
194 return;
Brian Paul93269622006-04-14 03:43:39 +0000195
Brian Paule71e4c92006-11-02 16:09:10 +0000196 if (string == NULL) {
197 RELEASE_SHADER(sha);
198 _mesa_error(ctx, GL_INVALID_VALUE, "glShaderSourceARB");
199 return;
200 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000201
Brian Paule71e4c92006-11-02 16:09:10 +0000202 /*
203 * This array holds offsets of where the appropriate string ends, thus the last
204 * element will be set to the total length of the source code.
205 */
206 offsets = (GLint *) _mesa_malloc(count * sizeof(GLint));
207 if (offsets == NULL) {
208 RELEASE_SHADER(sha);
209 _mesa_error(ctx, GL_OUT_OF_MEMORY, "glShaderSourceARB");
210 return;
211 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000212
Brian Paule71e4c92006-11-02 16:09:10 +0000213 for (i = 0; i < count; i++) {
214 if (string[i] == NULL) {
215 _mesa_free((GLvoid *) offsets);
216 RELEASE_SHADER(sha);
217 _mesa_error(ctx, GL_INVALID_VALUE, "glShaderSourceARB");
218 return;
219 }
220 if (length == NULL || length[i] < 0)
221 offsets[i] = _mesa_strlen(string[i]);
222 else
223 offsets[i] = length[i];
224 /* accumulate string lengths */
225 if (i > 0)
226 offsets[i] += offsets[i - 1];
227 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000228
Brian Paule71e4c92006-11-02 16:09:10 +0000229 source =
230 (GLcharARB *) _mesa_malloc((offsets[count - 1] + 1) *
231 sizeof(GLcharARB));
232 if (source == NULL) {
233 _mesa_free((GLvoid *) offsets);
234 RELEASE_SHADER(sha);
235 _mesa_error(ctx, GL_OUT_OF_MEMORY, "glShaderSourceARB");
236 return;
237 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000238
Brian Paule71e4c92006-11-02 16:09:10 +0000239 for (i = 0; i < count; i++) {
240 GLint start = (i > 0) ? offsets[i - 1] : 0;
241 _mesa_memcpy(source + start, string[i],
242 (offsets[i] - start) * sizeof(GLcharARB));
243 }
244 source[offsets[count - 1]] = '\0';
Michal Krol1d7f7192005-03-25 12:12:50 +0000245
Brian Paule71e4c92006-11-02 16:09:10 +0000246 (**sha).SetSource(sha, source, offsets, count);
247 RELEASE_SHADER(sha);
Michal Krolc1fe4692004-10-27 17:09:10 +0000248}
249
Brian Paule71e4c92006-11-02 16:09:10 +0000250GLvoid GLAPIENTRY
251_mesa_CompileShaderARB(GLhandleARB shaderObj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000252{
Brian Paule71e4c92006-11-02 16:09:10 +0000253 GET_CURRENT_CONTEXT(ctx);
254 GET_SHADER(sha, shaderObj, "glCompileShaderARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000255
Brian Paule71e4c92006-11-02 16:09:10 +0000256 if (sha != NULL) {
257 (**sha).Compile(sha);
258 RELEASE_SHADER(sha);
259 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000260}
261
262GLhandleARB GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000263_mesa_CreateProgramObjectARB(GLvoid)
Michal Krolc1fe4692004-10-27 17:09:10 +0000264{
Brian Paule71e4c92006-11-02 16:09:10 +0000265 return _mesa_3dlabs_create_program_object();
Michal Krolc1fe4692004-10-27 17:09:10 +0000266}
267
Michal Krol9ac96052006-02-27 14:41:41 +0000268GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000269_mesa_AttachObjectARB(GLhandleARB containerObj, GLhandleARB obj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000270{
Brian Paule71e4c92006-11-02 16:09:10 +0000271 GET_CURRENT_CONTEXT(ctx);
272 GET_CONTAINER(con, containerObj, "glAttachObjectARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000273
Brian Paule71e4c92006-11-02 16:09:10 +0000274 if (con != NULL) {
275 GET_GENERIC(att, obj, "glAttachObjectARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000276
Brian Paule71e4c92006-11-02 16:09:10 +0000277 if (att != NULL) {
278 (**con).Attach(con, att);
279 RELEASE_GENERIC(att);
280 }
281 RELEASE_CONTAINER(con);
282 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000283}
284
Michal Krol9ac96052006-02-27 14:41:41 +0000285GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000286_mesa_LinkProgramARB(GLhandleARB programObj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000287{
Brian Paule71e4c92006-11-02 16:09:10 +0000288 GET_CURRENT_CONTEXT(ctx);
289 GET_PROGRAM(pro, programObj, "glLinkProgramARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000290
Brian Paule71e4c92006-11-02 16:09:10 +0000291 if (pro != NULL) {
292 (**pro).Link(pro);
293 if (pro == ctx->ShaderObjects.CurrentProgram) {
294 if ((**pro).GetLinkStatus(pro))
295 _mesa_UseProgramObjectARB(programObj);
296 else
297 _mesa_UseProgramObjectARB(0);
298 }
299 RELEASE_PROGRAM(pro);
300 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000301}
302
Michal Krol9ac96052006-02-27 14:41:41 +0000303GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000304_mesa_UseProgramObjectARB(GLhandleARB programObj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000305{
Brian Paule71e4c92006-11-02 16:09:10 +0000306 GET_CURRENT_CONTEXT(ctx);
Michal Krola1a02e62006-05-16 09:40:30 +0000307 struct gl2_program_intf **program = NULL;
Michal Krol9ac96052006-02-27 14:41:41 +0000308
Brian Paule71e4c92006-11-02 16:09:10 +0000309 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000310
Brian Paule71e4c92006-11-02 16:09:10 +0000311 if (programObj != 0) {
312 GET_PROGRAM(pro, programObj, "glUseProgramObjectARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000313
Brian Paule71e4c92006-11-02 16:09:10 +0000314 if (pro == NULL)
315 return;
Michal Krol1d7f7192005-03-25 12:12:50 +0000316
Brian Paule71e4c92006-11-02 16:09:10 +0000317 if ((**pro).GetLinkStatus(pro) == GL_FALSE) {
318 RELEASE_PROGRAM(pro);
319 _mesa_error(ctx, GL_INVALID_OPERATION, "glUseProgramObjectARB");
320 return;
321 }
Michal Krol9ac96052006-02-27 14:41:41 +0000322
Brian Paule71e4c92006-11-02 16:09:10 +0000323 program = pro;
Brian Paul93269622006-04-14 03:43:39 +0000324
Brian Paule71e4c92006-11-02 16:09:10 +0000325 ctx->ShaderObjects._VertexShaderPresent =
326 (**pro).IsShaderPresent(pro, GL_VERTEX_SHADER_ARB);
327 ctx->ShaderObjects._FragmentShaderPresent =
328 (**pro).IsShaderPresent(pro, GL_FRAGMENT_SHADER_ARB);
329 }
330 else {
331 ctx->ShaderObjects._VertexShaderPresent = GL_FALSE;
332 ctx->ShaderObjects._FragmentShaderPresent = GL_FALSE;
333 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000334
Brian Paule71e4c92006-11-02 16:09:10 +0000335 if (ctx->ShaderObjects.CurrentProgram != NULL)
336 RELEASE_PROGRAM(ctx->ShaderObjects.CurrentProgram);
337 ctx->ShaderObjects.CurrentProgram = program;
Michal Krolc1fe4692004-10-27 17:09:10 +0000338}
339
Michal Krol9ac96052006-02-27 14:41:41 +0000340GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000341_mesa_ValidateProgramARB(GLhandleARB programObj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000342{
Brian Paule71e4c92006-11-02 16:09:10 +0000343 GET_CURRENT_CONTEXT(ctx);
344 GET_PROGRAM(pro, programObj, "glValidateProgramARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000345
Brian Paule71e4c92006-11-02 16:09:10 +0000346 if (pro != NULL) {
347 (**pro).Validate(pro);
348 RELEASE_PROGRAM(pro);
349 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000350}
351
Michal Krol9ac96052006-02-27 14:41:41 +0000352GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000353_mesa_Uniform1fARB(GLint location, GLfloat v0)
Michal Krol9ac96052006-02-27 14:41:41 +0000354{
Brian Paule71e4c92006-11-02 16:09:10 +0000355 GET_CURRENT_CONTEXT(ctx);
356 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform1fARB");
Brian Paul93269622006-04-14 03:43:39 +0000357
Brian Paule71e4c92006-11-02 16:09:10 +0000358 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol9ac96052006-02-27 14:41:41 +0000359
Brian Paule71e4c92006-11-02 16:09:10 +0000360 if (pro != NULL) {
361 if (!(**pro).WriteUniform(pro, location, 1, &v0, GL_FLOAT))
362 _mesa_error(ctx, GL_INVALID_OPERATION, "glUniform1fARB");
363 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000364}
365
Michal Krol9ac96052006-02-27 14:41:41 +0000366GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000367_mesa_Uniform2fARB(GLint location, GLfloat v0, GLfloat v1)
Michal Krol1d7f7192005-03-25 12:12:50 +0000368{
Brian Paule71e4c92006-11-02 16:09:10 +0000369 GET_CURRENT_CONTEXT(ctx);
370 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform2fARB");
Brian Paul93269622006-04-14 03:43:39 +0000371
Brian Paule71e4c92006-11-02 16:09:10 +0000372 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000373
Brian Paule71e4c92006-11-02 16:09:10 +0000374 if (pro != NULL) {
375 GLfloat v[2];
376 v[0] = v0;
377 v[1] = v1;
Michal Krol9ac96052006-02-27 14:41:41 +0000378
Brian Paule71e4c92006-11-02 16:09:10 +0000379 if (!(**pro).WriteUniform(pro, location, 1, v, GL_FLOAT_VEC2))
380 _mesa_error(ctx, GL_INVALID_OPERATION, "glUniform2fARB");
381 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000382}
383
Michal Krol9ac96052006-02-27 14:41:41 +0000384GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000385_mesa_Uniform3fARB(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
Michal Krol1d7f7192005-03-25 12:12:50 +0000386{
Brian Paule71e4c92006-11-02 16:09:10 +0000387 GET_CURRENT_CONTEXT(ctx);
388 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform3fARB");
Brian Paul93269622006-04-14 03:43:39 +0000389
Brian Paule71e4c92006-11-02 16:09:10 +0000390 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000391
Brian Paule71e4c92006-11-02 16:09:10 +0000392 if (pro != NULL) {
393 GLfloat v[3];
394 v[0] = v0;
395 v[1] = v1;
396 v[2] = v2;
Michal Krol9ac96052006-02-27 14:41:41 +0000397
Brian Paule71e4c92006-11-02 16:09:10 +0000398 if (!(**pro).WriteUniform(pro, location, 1, v, GL_FLOAT_VEC3))
399 _mesa_error(ctx, GL_INVALID_OPERATION, "glUniform3fARB");
400 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000401}
402
Michal Krol9ac96052006-02-27 14:41:41 +0000403GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000404_mesa_Uniform4fARB(GLint location, GLfloat v0, GLfloat v1, GLfloat v2,
405 GLfloat v3)
Michal Krol1d7f7192005-03-25 12:12:50 +0000406{
Brian Paule71e4c92006-11-02 16:09:10 +0000407 GET_CURRENT_CONTEXT(ctx);
408 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform4fARB");
Brian Paul93269622006-04-14 03:43:39 +0000409
Brian Paule71e4c92006-11-02 16:09:10 +0000410 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000411
Brian Paule71e4c92006-11-02 16:09:10 +0000412 if (pro != NULL) {
413 GLfloat v[4];
414 v[0] = v0;
415 v[1] = v1;
416 v[2] = v2;
417 v[3] = v3;
Michal Krol9ac96052006-02-27 14:41:41 +0000418
Brian Paule71e4c92006-11-02 16:09:10 +0000419 if (!(**pro).WriteUniform(pro, location, 1, v, GL_FLOAT_VEC4))
420 _mesa_error(ctx, GL_INVALID_OPERATION, "glUniform4fARB");
421 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000422}
423
Michal Krol9ac96052006-02-27 14:41:41 +0000424GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000425_mesa_Uniform1iARB(GLint location, GLint v0)
Michal Krol1d7f7192005-03-25 12:12:50 +0000426{
Brian Paule71e4c92006-11-02 16:09:10 +0000427 GET_CURRENT_CONTEXT(ctx);
428 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform1iARB");
Brian Paul93269622006-04-14 03:43:39 +0000429
Brian Paule71e4c92006-11-02 16:09:10 +0000430 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000431
Brian Paule71e4c92006-11-02 16:09:10 +0000432 if (pro != NULL) {
433 if (!(**pro).WriteUniform(pro, location, 1, &v0, GL_INT))
434 _mesa_error(ctx, GL_INVALID_OPERATION, "glUniform1iARB");
435 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000436}
437
Michal Krol9ac96052006-02-27 14:41:41 +0000438GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000439_mesa_Uniform2iARB(GLint location, GLint v0, GLint v1)
Michal Krol1d7f7192005-03-25 12:12:50 +0000440{
Brian Paule71e4c92006-11-02 16:09:10 +0000441 GET_CURRENT_CONTEXT(ctx);
442 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform2iARB");
Brian Paul93269622006-04-14 03:43:39 +0000443
Brian Paule71e4c92006-11-02 16:09:10 +0000444 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000445
Brian Paule71e4c92006-11-02 16:09:10 +0000446 if (pro != NULL) {
447 GLint v[2];
448 v[0] = v0;
449 v[1] = v1;
Michal Krol9ac96052006-02-27 14:41:41 +0000450
Brian Paule71e4c92006-11-02 16:09:10 +0000451 if (!(**pro).WriteUniform(pro, location, 1, v, GL_INT_VEC2))
452 _mesa_error(ctx, GL_INVALID_OPERATION, "glUniform2iARB");
453 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000454}
455
Michal Krol9ac96052006-02-27 14:41:41 +0000456GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000457_mesa_Uniform3iARB(GLint location, GLint v0, GLint v1, GLint v2)
Michal Krol1d7f7192005-03-25 12:12:50 +0000458{
Brian Paule71e4c92006-11-02 16:09:10 +0000459 GET_CURRENT_CONTEXT(ctx);
460 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform3iARB");
Brian Paul93269622006-04-14 03:43:39 +0000461
Brian Paule71e4c92006-11-02 16:09:10 +0000462 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000463
Brian Paule71e4c92006-11-02 16:09:10 +0000464 if (pro != NULL) {
465 GLint v[3];
466 v[0] = v0;
467 v[1] = v1;
468 v[2] = v2;
Michal Krol9ac96052006-02-27 14:41:41 +0000469
Brian Paule71e4c92006-11-02 16:09:10 +0000470 if (!(**pro).WriteUniform(pro, location, 1, v, GL_INT_VEC3))
471 _mesa_error(ctx, GL_INVALID_OPERATION, "glUniform3iARB");
472 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000473}
474
Michal Krol9ac96052006-02-27 14:41:41 +0000475GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000476_mesa_Uniform4iARB(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
Michal Krol1d7f7192005-03-25 12:12:50 +0000477{
Brian Paule71e4c92006-11-02 16:09:10 +0000478 GET_CURRENT_CONTEXT(ctx);
479 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform4iARB");
Brian Paul93269622006-04-14 03:43:39 +0000480
Brian Paule71e4c92006-11-02 16:09:10 +0000481 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000482
Brian Paule71e4c92006-11-02 16:09:10 +0000483 if (pro != NULL) {
484 GLint v[4];
485 v[0] = v0;
486 v[1] = v1;
487 v[2] = v2;
488 v[3] = v3;
Michal Krol9ac96052006-02-27 14:41:41 +0000489
Brian Paule71e4c92006-11-02 16:09:10 +0000490 if (!(**pro).WriteUniform(pro, location, 1, v, GL_INT_VEC4))
491 _mesa_error(ctx, GL_INVALID_OPERATION, "glUniform4iARB");
492 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000493}
494
Michal Krol9ac96052006-02-27 14:41:41 +0000495GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000496_mesa_Uniform1fvARB(GLint location, GLsizei count, const GLfloat * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000497{
Brian Paule71e4c92006-11-02 16:09:10 +0000498 GET_CURRENT_CONTEXT(ctx);
499 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform1fvARB");
Brian Paul93269622006-04-14 03:43:39 +0000500
Brian Paule71e4c92006-11-02 16:09:10 +0000501 if (value == NULL) {
502 _mesa_error(ctx, GL_INVALID_VALUE, "glUniform1fvARB");
503 return;
504 }
Michal Krold55de652006-04-18 10:30:29 +0000505
Brian Paule71e4c92006-11-02 16:09:10 +0000506 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000507
Brian Paule71e4c92006-11-02 16:09:10 +0000508 if (pro != NULL) {
509 if (!(**pro).WriteUniform(pro, location, count, value, GL_FLOAT))
510 _mesa_error(ctx, GL_INVALID_OPERATION, "glUniform1fvARB");
511 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000512}
513
Michal Krol9ac96052006-02-27 14:41:41 +0000514GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000515_mesa_Uniform2fvARB(GLint location, GLsizei count, const GLfloat * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000516{
Brian Paule71e4c92006-11-02 16:09:10 +0000517 GET_CURRENT_CONTEXT(ctx);
518 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform2fvARB");
Brian Paul93269622006-04-14 03:43:39 +0000519
Brian Paule71e4c92006-11-02 16:09:10 +0000520 if (value == NULL) {
521 _mesa_error(ctx, GL_INVALID_VALUE, "glUniform2fvARB");
522 return;
523 }
Michal Krold55de652006-04-18 10:30:29 +0000524
Brian Paule71e4c92006-11-02 16:09:10 +0000525 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000526
Brian Paule71e4c92006-11-02 16:09:10 +0000527 if (pro != NULL) {
528 if (!(**pro).WriteUniform(pro, location, count, value, GL_FLOAT_VEC2))
529 _mesa_error(ctx, GL_INVALID_OPERATION, "glUniform2fvARB");
530 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000531}
532
Michal Krol9ac96052006-02-27 14:41:41 +0000533GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000534_mesa_Uniform3fvARB(GLint location, GLsizei count, const GLfloat * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000535{
Brian Paule71e4c92006-11-02 16:09:10 +0000536 GET_CURRENT_CONTEXT(ctx);
537 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform3fvARB");
Brian Paul93269622006-04-14 03:43:39 +0000538
Brian Paule71e4c92006-11-02 16:09:10 +0000539 if (value == NULL) {
540 _mesa_error(ctx, GL_INVALID_VALUE, "glUniform3fvARB");
541 return;
542 }
Michal Krold55de652006-04-18 10:30:29 +0000543
Brian Paule71e4c92006-11-02 16:09:10 +0000544 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000545
Brian Paule71e4c92006-11-02 16:09:10 +0000546 if (pro != NULL) {
547 if (!(**pro).WriteUniform(pro, location, count, value, GL_FLOAT_VEC3))
548 _mesa_error(ctx, GL_INVALID_OPERATION, "glUniform3fvARB");
549 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000550}
551
Michal Krol9ac96052006-02-27 14:41:41 +0000552GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000553_mesa_Uniform4fvARB(GLint location, GLsizei count, const GLfloat * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000554{
Brian Paule71e4c92006-11-02 16:09:10 +0000555 GET_CURRENT_CONTEXT(ctx);
556 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform4fvARB");
Brian Paul93269622006-04-14 03:43:39 +0000557
Brian Paule71e4c92006-11-02 16:09:10 +0000558 if (value == NULL) {
559 _mesa_error(ctx, GL_INVALID_VALUE, "glUniform4fvARB");
560 return;
561 }
Michal Krold55de652006-04-18 10:30:29 +0000562
Brian Paule71e4c92006-11-02 16:09:10 +0000563 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000564
Brian Paule71e4c92006-11-02 16:09:10 +0000565 if (pro != NULL) {
566 if (!(**pro).WriteUniform(pro, location, count, value, GL_FLOAT_VEC4))
567 _mesa_error(ctx, GL_INVALID_OPERATION, "glUniform4fvARB");
568 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000569}
570
Michal Krol9ac96052006-02-27 14:41:41 +0000571GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000572_mesa_Uniform1ivARB(GLint location, GLsizei count, const GLint * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000573{
Brian Paule71e4c92006-11-02 16:09:10 +0000574 GET_CURRENT_CONTEXT(ctx);
575 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform1ivARB");
Brian Paul93269622006-04-14 03:43:39 +0000576
Brian Paule71e4c92006-11-02 16:09:10 +0000577 if (value == NULL) {
578 _mesa_error(ctx, GL_INVALID_VALUE, "glUniform1ivARB");
579 return;
580 }
Michal Krold55de652006-04-18 10:30:29 +0000581
Brian Paule71e4c92006-11-02 16:09:10 +0000582 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000583
Brian Paule71e4c92006-11-02 16:09:10 +0000584 if (pro != NULL) {
585 if (!(**pro).WriteUniform(pro, location, count, value, GL_INT))
586 _mesa_error(ctx, GL_INVALID_OPERATION, "glUniform1ivARB");
587 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000588}
589
Michal Krol9ac96052006-02-27 14:41:41 +0000590GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000591_mesa_Uniform2ivARB(GLint location, GLsizei count, const GLint * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000592{
Brian Paule71e4c92006-11-02 16:09:10 +0000593 GET_CURRENT_CONTEXT(ctx);
594 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform2ivARB");
Brian Paul93269622006-04-14 03:43:39 +0000595
Brian Paule71e4c92006-11-02 16:09:10 +0000596 if (value == NULL) {
597 _mesa_error(ctx, GL_INVALID_VALUE, "glUniform2ivARB");
598 return;
599 }
Michal Krold55de652006-04-18 10:30:29 +0000600
Brian Paule71e4c92006-11-02 16:09:10 +0000601 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000602
Brian Paule71e4c92006-11-02 16:09:10 +0000603 if (pro != NULL) {
604 if (!(**pro).WriteUniform(pro, location, count, value, GL_INT_VEC2))
605 _mesa_error(ctx, GL_INVALID_OPERATION, "glUniform2ivARB");
606 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000607}
608
Michal Krol9ac96052006-02-27 14:41:41 +0000609GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000610_mesa_Uniform3ivARB(GLint location, GLsizei count, const GLint * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000611{
Brian Paule71e4c92006-11-02 16:09:10 +0000612 GET_CURRENT_CONTEXT(ctx);
613 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform3ivARB");
Brian Paul93269622006-04-14 03:43:39 +0000614
Brian Paule71e4c92006-11-02 16:09:10 +0000615 if (value == NULL) {
616 _mesa_error(ctx, GL_INVALID_VALUE, "glUniform3ivARB");
617 return;
618 }
Michal Krold55de652006-04-18 10:30:29 +0000619
Brian Paule71e4c92006-11-02 16:09:10 +0000620 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000621
Brian Paule71e4c92006-11-02 16:09:10 +0000622 if (pro != NULL) {
623 if (!(**pro).WriteUniform(pro, location, count, value, GL_INT_VEC3))
624 _mesa_error(ctx, GL_INVALID_OPERATION, "glUniform3ivARB");
625 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000626}
627
Michal Krol9ac96052006-02-27 14:41:41 +0000628GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000629_mesa_Uniform4ivARB(GLint location, GLsizei count, const GLint * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000630{
Brian Paule71e4c92006-11-02 16:09:10 +0000631 GET_CURRENT_CONTEXT(ctx);
632 GET_CURRENT_LINKED_PROGRAM(pro, "glUniform4ivARB");
Brian Paul93269622006-04-14 03:43:39 +0000633
Brian Paule71e4c92006-11-02 16:09:10 +0000634 if (value == NULL) {
635 _mesa_error(ctx, GL_INVALID_VALUE, "glUniform4ivARB");
636 return;
637 }
Michal Krold55de652006-04-18 10:30:29 +0000638
Brian Paule71e4c92006-11-02 16:09:10 +0000639 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000640
Brian Paule71e4c92006-11-02 16:09:10 +0000641 if (pro != NULL) {
642 if (!(**pro).WriteUniform(pro, location, count, value, GL_INT_VEC4))
643 _mesa_error(ctx, GL_INVALID_OPERATION, "glUniform4ivARB");
644 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000645}
646
Brian Paul93269622006-04-14 03:43:39 +0000647
Brian Paulbdb251b2006-11-03 17:29:31 +0000648/**
649 * Helper function used by UniformMatrix**vARB() functions below.
650 */
651static void
652uniform_matrix(GLint cols, GLint rows, const char *caller,
653 GLenum matrixType,
654 GLint location, GLsizei count, GLboolean transpose,
655 const GLfloat *values)
656{
657 const GLint matElements = rows * cols;
658 GET_CURRENT_CONTEXT(ctx);
659 GET_CURRENT_LINKED_PROGRAM(pro, caller);
660
661 if (values == NULL) {
662 _mesa_error(ctx, GL_INVALID_VALUE, caller);
Brian Paule71e4c92006-11-02 16:09:10 +0000663 return;
664 }
Michal Krold55de652006-04-18 10:30:29 +0000665
Brian Paule71e4c92006-11-02 16:09:10 +0000666 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000667
Brian Paulbdb251b2006-11-03 17:29:31 +0000668 if (!pro)
669 return; /* no error? */
Michal Krol9ac96052006-02-27 14:41:41 +0000670
Brian Paulbdb251b2006-11-03 17:29:31 +0000671 if (transpose) {
672 GLfloat *trans, *pt;
673 const GLfloat *pv;
674 GLint i, j, k;
675
676 trans = (GLfloat *) _mesa_malloc(count * matElements * sizeof(GLfloat));
677 if (!trans) {
678 _mesa_error(ctx, GL_OUT_OF_MEMORY, caller);
679 return;
Brian Paule71e4c92006-11-02 16:09:10 +0000680 }
Brian Paulbdb251b2006-11-03 17:29:31 +0000681
682 pt = trans;
683 pv = values;
684 for (i = 0; i < count; i++) {
685 /* transpose from pv matrix into pt matrix */
686 for (j = 0; j < cols; j++) {
687 for (k = 0; k < rows; k++) {
688 /* XXX verify this */
689 pt[j * rows + k] = pv[k * cols + j];
690 }
691 }
692 pt += matElements;
693 pv += matElements;
Brian Paule71e4c92006-11-02 16:09:10 +0000694 }
Brian Paulbdb251b2006-11-03 17:29:31 +0000695
696 if (!(**pro).WriteUniform(pro, location, count, trans, matrixType))
697 _mesa_error(ctx, GL_INVALID_OPERATION, caller);
698 _mesa_free(trans);
Brian Paule71e4c92006-11-02 16:09:10 +0000699 }
Brian Paulbdb251b2006-11-03 17:29:31 +0000700 else {
701 if (!(**pro).WriteUniform(pro, location, count, values, matrixType))
702 _mesa_error(ctx, GL_INVALID_OPERATION, caller);
703 }
704}
705
706
707GLvoid GLAPIENTRY
708_mesa_UniformMatrix2fvARB(GLint location, GLsizei count, GLboolean transpose,
709 const GLfloat * value)
710{
711 uniform_matrix(2, 2, "glUniformMatrix2fvARB", GL_FLOAT_MAT2,
712 location, count, transpose, value);
Michal Krolc1fe4692004-10-27 17:09:10 +0000713}
714
Michal Krol9ac96052006-02-27 14:41:41 +0000715GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000716_mesa_UniformMatrix3fvARB(GLint location, GLsizei count, GLboolean transpose,
717 const GLfloat * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000718{
Brian Paulbdb251b2006-11-03 17:29:31 +0000719 uniform_matrix(3, 3, "glUniformMatrix3fvARB", GL_FLOAT_MAT3,
720 location, count, transpose, value);
Michal Krolc1fe4692004-10-27 17:09:10 +0000721}
722
Michal Krol9ac96052006-02-27 14:41:41 +0000723GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000724_mesa_UniformMatrix4fvARB(GLint location, GLsizei count, GLboolean transpose,
725 const GLfloat * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000726{
Brian Paulbdb251b2006-11-03 17:29:31 +0000727 uniform_matrix(4, 4, "glUniformMatrix4fvARB", GL_FLOAT_MAT4,
728 location, count, transpose, value);
Michal Krol1d7f7192005-03-25 12:12:50 +0000729}
730
731static GLboolean
Brian Paule71e4c92006-11-02 16:09:10 +0000732_mesa_get_object_parameter(GLhandleARB obj, GLenum pname, GLvoid * params,
733 GLboolean * integral, GLint * size)
Michal Krol1d7f7192005-03-25 12:12:50 +0000734{
Brian Paule71e4c92006-11-02 16:09:10 +0000735 GET_CURRENT_CONTEXT(ctx);
736 GLint *ipar = (GLint *) params;
Michal Krol1d7f7192005-03-25 12:12:50 +0000737
Brian Paule71e4c92006-11-02 16:09:10 +0000738 /* set default values */
Brian Paulbdb251b2006-11-03 17:29:31 +0000739 *integral = GL_TRUE; /* indicates param type, TRUE: GLint, FALSE: GLfloat */
740 *size = 1; /* param array size */
Michal Krol1d7f7192005-03-25 12:12:50 +0000741
Brian Paule71e4c92006-11-02 16:09:10 +0000742 switch (pname) {
743 case GL_OBJECT_TYPE_ARB:
744 case GL_OBJECT_DELETE_STATUS_ARB:
745 case GL_OBJECT_INFO_LOG_LENGTH_ARB:
746 {
747 GET_GENERIC(gen, obj, "glGetObjectParameterivARB");
Michal Krol9ac96052006-02-27 14:41:41 +0000748
Brian Paule71e4c92006-11-02 16:09:10 +0000749 if (gen == NULL)
750 return GL_FALSE;
Michal Krol9ac96052006-02-27 14:41:41 +0000751
Brian Paule71e4c92006-11-02 16:09:10 +0000752 switch (pname) {
753 case GL_OBJECT_TYPE_ARB:
754 *ipar = (**gen).GetType(gen);
755 break;
756 case GL_OBJECT_DELETE_STATUS_ARB:
757 *ipar = (**gen).GetDeleteStatus(gen);
758 break;
Michal Krola1a02e62006-05-16 09:40:30 +0000759 case GL_OBJECT_INFO_LOG_LENGTH_ARB:
Brian Paule71e4c92006-11-02 16:09:10 +0000760 *ipar = (**gen).GetInfoLogLength(gen);
Michal Krola1a02e62006-05-16 09:40:30 +0000761 break;
Brian Paule71e4c92006-11-02 16:09:10 +0000762 }
Michal Krol9ac96052006-02-27 14:41:41 +0000763
Brian Paule71e4c92006-11-02 16:09:10 +0000764 RELEASE_GENERIC(gen);
765 }
766 break;
767 case GL_OBJECT_SUBTYPE_ARB:
768 case GL_OBJECT_COMPILE_STATUS_ARB:
769 case GL_OBJECT_SHADER_SOURCE_LENGTH_ARB:
770 {
771 GET_SHADER(sha, obj, "glGetObjectParameterivARB");
Michal Krol9ac96052006-02-27 14:41:41 +0000772
Brian Paule71e4c92006-11-02 16:09:10 +0000773 if (sha == NULL)
774 return GL_FALSE;
Michal Krol9ac96052006-02-27 14:41:41 +0000775
Brian Paule71e4c92006-11-02 16:09:10 +0000776 switch (pname) {
777 case GL_OBJECT_SUBTYPE_ARB:
778 *ipar = (**sha).GetSubType(sha);
779 break;
780 case GL_OBJECT_COMPILE_STATUS_ARB:
781 *ipar = (**sha).GetCompileStatus(sha);
782 break;
783 case GL_OBJECT_SHADER_SOURCE_LENGTH_ARB:
784 {
785 const GLcharARB *src = (**sha).GetSource(sha);
Brian Paule71e4c92006-11-02 16:09:10 +0000786 if (src == NULL)
787 *ipar = 0;
788 else
789 *ipar = _mesa_strlen(src) + 1;
790 }
791 break;
792 }
Michal Krol9ac96052006-02-27 14:41:41 +0000793
Brian Paule71e4c92006-11-02 16:09:10 +0000794 RELEASE_SHADER(sha);
795 }
796 break;
797 case GL_OBJECT_LINK_STATUS_ARB:
798 case GL_OBJECT_VALIDATE_STATUS_ARB:
799 case GL_OBJECT_ATTACHED_OBJECTS_ARB:
800 case GL_OBJECT_ACTIVE_UNIFORMS_ARB:
801 case GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB:
802 {
803 GET_PROGRAM(pro, obj, "glGetObjectParameterivARB");
Michal Krol9ac96052006-02-27 14:41:41 +0000804
Brian Paule71e4c92006-11-02 16:09:10 +0000805 if (pro == NULL)
806 return GL_FALSE;
Michal Krol9ac96052006-02-27 14:41:41 +0000807
Brian Paule71e4c92006-11-02 16:09:10 +0000808 switch (pname) {
809 case GL_OBJECT_LINK_STATUS_ARB:
810 *ipar = (**pro).GetLinkStatus(pro);
811 break;
812 case GL_OBJECT_VALIDATE_STATUS_ARB:
813 *ipar = (**pro).GetValidateStatus(pro);
814 break;
Michal Krola1a02e62006-05-16 09:40:30 +0000815 case GL_OBJECT_ATTACHED_OBJECTS_ARB:
Brian Paule71e4c92006-11-02 16:09:10 +0000816 *ipar =
817 (**pro)._container.
818 GetAttachedCount((struct gl2_container_intf **) (pro));
Michal Krola1a02e62006-05-16 09:40:30 +0000819 break;
Brian Paule71e4c92006-11-02 16:09:10 +0000820 case GL_OBJECT_ACTIVE_UNIFORMS_ARB:
821 *ipar = (**pro).GetActiveUniformCount(pro);
822 break;
823 case GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB:
824 *ipar = (**pro).GetActiveUniformMaxLength(pro);
825 break;
826 case GL_OBJECT_ACTIVE_ATTRIBUTES_ARB:
827 *ipar = (**pro).GetActiveAttribCount(pro);
828 break;
829 case GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB:
830 *ipar = (**pro).GetActiveAttribMaxLength(pro);
831 break;
832 }
Michal Krol9ac96052006-02-27 14:41:41 +0000833
Brian Paule71e4c92006-11-02 16:09:10 +0000834 RELEASE_PROGRAM(pro);
835 }
836 break;
837 default:
838 _mesa_error(ctx, GL_INVALID_ENUM, "glGetObjectParameterivARB");
839 return GL_FALSE;
840 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000841
Brian Paule71e4c92006-11-02 16:09:10 +0000842 return GL_TRUE;
Michal Krol1d7f7192005-03-25 12:12:50 +0000843}
844
Michal Krol9ac96052006-02-27 14:41:41 +0000845GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000846_mesa_GetObjectParameterfvARB(GLhandleARB obj, GLenum pname, GLfloat * params)
Michal Krol1d7f7192005-03-25 12:12:50 +0000847{
Brian Paule71e4c92006-11-02 16:09:10 +0000848 GET_CURRENT_CONTEXT(ctx);
849 GLboolean integral;
850 GLint size;
Michal Krol1d7f7192005-03-25 12:12:50 +0000851
Brian Paule71e4c92006-11-02 16:09:10 +0000852 if (params == NULL) {
853 _mesa_error(ctx, GL_INVALID_VALUE, "glGetObjectParameterfvARB");
854 return;
855 }
Michal Krold55de652006-04-18 10:30:29 +0000856
Brian Paule71e4c92006-11-02 16:09:10 +0000857 assert(sizeof(GLfloat) == sizeof(GLint));
Michal Krol1d7f7192005-03-25 12:12:50 +0000858
Brian Paulbdb251b2006-11-03 17:29:31 +0000859 if (_mesa_get_object_parameter(obj, pname, (GLvoid *) params,
860 &integral, &size)) {
Brian Paule71e4c92006-11-02 16:09:10 +0000861 if (integral) {
862 GLint i;
Brian Paule71e4c92006-11-02 16:09:10 +0000863 for (i = 0; i < size; i++)
864 params[i] = (GLfloat) ((GLint *) params)[i];
865 }
Brian Paulbdb251b2006-11-03 17:29:31 +0000866 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000867}
868
Michal Krol9ac96052006-02-27 14:41:41 +0000869GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000870_mesa_GetObjectParameterivARB(GLhandleARB obj, GLenum pname, GLint * params)
Michal Krol1d7f7192005-03-25 12:12:50 +0000871{
Brian Paule71e4c92006-11-02 16:09:10 +0000872 GET_CURRENT_CONTEXT(ctx);
873 GLboolean integral;
874 GLint size;
Michal Krol1d7f7192005-03-25 12:12:50 +0000875
Brian Paule71e4c92006-11-02 16:09:10 +0000876 if (params == NULL) {
877 _mesa_error(ctx, GL_INVALID_VALUE, "glGetObjectParameterivARB");
878 return;
879 }
Michal Krold55de652006-04-18 10:30:29 +0000880
Brian Paule71e4c92006-11-02 16:09:10 +0000881 assert(sizeof(GLfloat) == sizeof(GLint));
Michal Krol1d7f7192005-03-25 12:12:50 +0000882
Brian Paulbdb251b2006-11-03 17:29:31 +0000883 if (_mesa_get_object_parameter(obj, pname, (GLvoid *) params,
884 &integral, &size)) {
Brian Paule71e4c92006-11-02 16:09:10 +0000885 if (!integral) {
886 GLint i;
Brian Paule71e4c92006-11-02 16:09:10 +0000887 for (i = 0; i < size; i++)
888 params[i] = (GLint) ((GLfloat *) params)[i];
889 }
Brian Paulbdb251b2006-11-03 17:29:31 +0000890 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000891}
892
Brian Paul93269622006-04-14 03:43:39 +0000893
894/**
895 * Copy string from <src> to <dst>, up to maxLength characters, returning
896 * length of <dst> in <length>.
897 * \param src the strings source
898 * \param maxLength max chars to copy
899 * \param length returns numberof chars copied
900 * \param dst the string destination
901 */
Michal Krol9ac96052006-02-27 14:41:41 +0000902static GLvoid
Brian Paule71e4c92006-11-02 16:09:10 +0000903copy_string(const GLcharARB * src, GLsizei maxLength, GLsizei * length,
904 GLcharARB * dst)
Michal Krol1d7f7192005-03-25 12:12:50 +0000905{
Brian Paule71e4c92006-11-02 16:09:10 +0000906 GLsizei len;
907 for (len = 0; len < maxLength - 1 && src && src[len]; len++)
908 dst[len] = src[len];
909 if (maxLength > 0)
910 dst[len] = 0;
911 if (length)
912 *length = len;
Michal Krolc1fe4692004-10-27 17:09:10 +0000913}
914
Brian Paul93269622006-04-14 03:43:39 +0000915
Michal Krol9ac96052006-02-27 14:41:41 +0000916GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000917_mesa_GetInfoLogARB(GLhandleARB obj, GLsizei maxLength, GLsizei * length,
918 GLcharARB * infoLog)
Michal Krol1d7f7192005-03-25 12:12:50 +0000919{
Brian Paule71e4c92006-11-02 16:09:10 +0000920 GET_CURRENT_CONTEXT(ctx);
921 GET_GENERIC(gen, obj, "glGetInfoLogARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000922
Brian Paule71e4c92006-11-02 16:09:10 +0000923 if (gen == NULL)
924 return;
Michal Krold55de652006-04-18 10:30:29 +0000925
Brian Paule71e4c92006-11-02 16:09:10 +0000926 if (infoLog == NULL)
927 _mesa_error(ctx, GL_INVALID_VALUE, "glGetInfoLogARB");
Michal Krola1a02e62006-05-16 09:40:30 +0000928 else {
Brian Paule71e4c92006-11-02 16:09:10 +0000929 GLsizei actualsize = (**gen).GetInfoLogLength(gen);
Michal Krola1a02e62006-05-16 09:40:30 +0000930 if (actualsize > maxLength)
931 actualsize = maxLength;
Brian Paule71e4c92006-11-02 16:09:10 +0000932 (**gen).GetInfoLog(gen, actualsize, infoLog);
Michal Krola1a02e62006-05-16 09:40:30 +0000933 if (length != NULL)
934 *length = (actualsize > 0) ? actualsize - 1 : 0;
935 }
Brian Paule71e4c92006-11-02 16:09:10 +0000936 RELEASE_GENERIC(gen);
Michal Krol1d7f7192005-03-25 12:12:50 +0000937}
938
Michal Krol9ac96052006-02-27 14:41:41 +0000939GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000940_mesa_GetAttachedObjectsARB(GLhandleARB containerObj, GLsizei maxCount,
941 GLsizei * count, GLhandleARB * obj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000942{
Brian Paule71e4c92006-11-02 16:09:10 +0000943 GET_CURRENT_CONTEXT(ctx);
944 GET_CONTAINER(con, containerObj, "glGetAttachedObjectsARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000945
Brian Paule71e4c92006-11-02 16:09:10 +0000946 if (con == NULL)
947 return;
Michal Krold55de652006-04-18 10:30:29 +0000948
Brian Paule71e4c92006-11-02 16:09:10 +0000949 if (obj == NULL)
950 _mesa_error(ctx, GL_INVALID_VALUE, "glGetAttachedObjectsARB");
951 else {
952 GLsizei cnt, i;
Michal Krold55de652006-04-18 10:30:29 +0000953
Brian Paule71e4c92006-11-02 16:09:10 +0000954 cnt = (**con).GetAttachedCount(con);
955 if (cnt > maxCount)
956 cnt = maxCount;
957 if (count != NULL)
958 *count = cnt;
Michal Krol9ac96052006-02-27 14:41:41 +0000959
Brian Paule71e4c92006-11-02 16:09:10 +0000960 for (i = 0; i < cnt; i++) {
961 struct gl2_generic_intf **x = (**con).GetAttached(con, i);
962 obj[i] = (**x).GetName(x);
963 RELEASE_GENERIC(x);
964 }
965 }
966 RELEASE_CONTAINER(con);
Michal Krol9ac96052006-02-27 14:41:41 +0000967}
Michal Krolc1fe4692004-10-27 17:09:10 +0000968
969GLint GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000970_mesa_GetUniformLocationARB(GLhandleARB programObj, const GLcharARB * name)
Michal Krol1d7f7192005-03-25 12:12:50 +0000971{
Brian Paule71e4c92006-11-02 16:09:10 +0000972 GET_CURRENT_CONTEXT(ctx);
973 GLint loc = -1;
974 GET_LINKED_PROGRAM(pro, programObj, "glGetUniformLocationARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000975
Brian Paule71e4c92006-11-02 16:09:10 +0000976 if (pro == NULL)
977 return -1;
Michal Krold55de652006-04-18 10:30:29 +0000978
Brian Paule71e4c92006-11-02 16:09:10 +0000979 if (name == NULL)
980 _mesa_error(ctx, GL_INVALID_VALUE, "glGetUniformLocationARB");
981 else {
982 if (!IS_NAME_WITH_GL_PREFIX(name))
983 loc = (**pro).GetUniformLocation(pro, name);
984 }
985 RELEASE_PROGRAM(pro);
986 return loc;
Michal Krolc1fe4692004-10-27 17:09:10 +0000987}
988
Michal Krol9ac96052006-02-27 14:41:41 +0000989GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000990_mesa_GetActiveUniformARB(GLhandleARB programObj, GLuint index,
991 GLsizei maxLength, GLsizei * length, GLint * size,
992 GLenum * type, GLcharARB * name)
Michal Krol1d7f7192005-03-25 12:12:50 +0000993{
Brian Paule71e4c92006-11-02 16:09:10 +0000994 GET_CURRENT_CONTEXT(ctx);
995 GET_PROGRAM(pro, programObj, "glGetActiveUniformARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000996
Brian Paule71e4c92006-11-02 16:09:10 +0000997 if (pro == NULL)
998 return;
Michal Krold55de652006-04-18 10:30:29 +0000999
Brian Paule71e4c92006-11-02 16:09:10 +00001000 if (size == NULL || type == NULL || name == NULL)
1001 _mesa_error(ctx, GL_INVALID_VALUE, "glGetActiveUniformARB");
1002 else {
1003 if (index < (**pro).GetActiveUniformCount(pro))
1004 (**pro).GetActiveUniform(pro, index, maxLength, length, size, type,
1005 name);
1006 else
1007 _mesa_error(ctx, GL_INVALID_VALUE, "glGetActiveUniformARB");
1008 }
1009 RELEASE_PROGRAM(pro);
Michal Krolc1fe4692004-10-27 17:09:10 +00001010}
1011
Michal Krol9ac96052006-02-27 14:41:41 +00001012GLvoid GLAPIENTRY
Brian Paulbdb251b2006-11-03 17:29:31 +00001013_mesa_GetUniformfvARB(GLhandleARB programObj, GLint location, GLfloat * params)
Michal Krol1d7f7192005-03-25 12:12:50 +00001014{
Brian Paule71e4c92006-11-02 16:09:10 +00001015 GET_CURRENT_CONTEXT(ctx);
1016 GET_LINKED_PROGRAM(pro, programObj, "glGetUniformfvARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001017
Brian Paulbdb251b2006-11-03 17:29:31 +00001018 /* XXX error-check location here */
1019
Brian Paule71e4c92006-11-02 16:09:10 +00001020 if (pro != NULL) {
Brian Paulbdb251b2006-11-03 17:29:31 +00001021 if (!(**pro).ReadUniform(pro, location, 1, params))
1022 _mesa_error(ctx, GL_INVALID_OPERATION, "glGetUniformfvARB");
Brian Paule71e4c92006-11-02 16:09:10 +00001023 RELEASE_PROGRAM(pro);
1024 }
Michal Krolc1fe4692004-10-27 17:09:10 +00001025}
1026
Michal Krol9ac96052006-02-27 14:41:41 +00001027GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +00001028_mesa_GetUniformivARB(GLhandleARB programObj, GLint location, GLint * params)
Michal Krol1d7f7192005-03-25 12:12:50 +00001029{
Brian Paule71e4c92006-11-02 16:09:10 +00001030 GET_CURRENT_CONTEXT(ctx);
1031 GET_LINKED_PROGRAM(pro, programObj, "glGetUniformivARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001032
Brian Paule71e4c92006-11-02 16:09:10 +00001033 if (pro != NULL) {
1034 /* TODO */
1035 RELEASE_PROGRAM(pro);
1036 }
Michal Krolc1fe4692004-10-27 17:09:10 +00001037}
1038
Michal Krol9ac96052006-02-27 14:41:41 +00001039GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +00001040_mesa_GetShaderSourceARB(GLhandleARB obj, GLsizei maxLength, GLsizei * length,
1041 GLcharARB * source)
Michal Krol1d7f7192005-03-25 12:12:50 +00001042{
Brian Paule71e4c92006-11-02 16:09:10 +00001043 GET_CURRENT_CONTEXT(ctx);
1044 GET_SHADER(sha, obj, "glGetShaderSourceARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001045
Brian Paule71e4c92006-11-02 16:09:10 +00001046 if (sha == NULL)
1047 return;
Michal Krold55de652006-04-18 10:30:29 +00001048
Brian Paule71e4c92006-11-02 16:09:10 +00001049 if (source == NULL)
1050 _mesa_error(ctx, GL_INVALID_VALUE, "glGetShaderSourceARB");
1051 else
1052 copy_string((**sha).GetSource(sha), maxLength, length, source);
1053 RELEASE_SHADER(sha);
Michal Krolc1fe4692004-10-27 17:09:10 +00001054}
1055
1056/* GL_ARB_vertex_shader */
1057
Michal Krol9ac96052006-02-27 14:41:41 +00001058GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +00001059_mesa_BindAttribLocationARB(GLhandleARB programObj, GLuint index,
1060 const GLcharARB * name)
Michal Krol1d7f7192005-03-25 12:12:50 +00001061{
Brian Paule71e4c92006-11-02 16:09:10 +00001062 GET_CURRENT_CONTEXT(ctx);
1063 GET_PROGRAM(pro, programObj, "glBindAttribLocationARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001064
Brian Paule71e4c92006-11-02 16:09:10 +00001065 if (pro == NULL)
1066 return;
Michal Krold55de652006-04-18 10:30:29 +00001067
Brian Paule71e4c92006-11-02 16:09:10 +00001068 if (name == NULL || index >= MAX_VERTEX_ATTRIBS)
1069 _mesa_error(ctx, GL_INVALID_VALUE, "glBindAttribLocationARB");
1070 else if (IS_NAME_WITH_GL_PREFIX(name))
1071 _mesa_error(ctx, GL_INVALID_OPERATION, "glBindAttribLocationARB");
1072 else
1073 (**pro).OverrideAttribBinding(pro, index, name);
1074 RELEASE_PROGRAM(pro);
Michal Krolc1fe4692004-10-27 17:09:10 +00001075}
1076
Michal Krol9ac96052006-02-27 14:41:41 +00001077GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +00001078_mesa_GetActiveAttribARB(GLhandleARB programObj, GLuint index,
1079 GLsizei maxLength, GLsizei * length, GLint * size,
1080 GLenum * type, GLcharARB * name)
Michal Krol1d7f7192005-03-25 12:12:50 +00001081{
Brian Paule71e4c92006-11-02 16:09:10 +00001082 GET_CURRENT_CONTEXT(ctx);
1083 GET_PROGRAM(pro, programObj, "glGetActiveAttribARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001084
Brian Paule71e4c92006-11-02 16:09:10 +00001085 if (pro == NULL)
1086 return;
Michal Krold55de652006-04-18 10:30:29 +00001087
Brian Paule71e4c92006-11-02 16:09:10 +00001088 if (name == NULL || index >= (**pro).GetActiveAttribCount(pro))
1089 _mesa_error(ctx, GL_INVALID_VALUE, "glGetActiveAttribARB");
1090 else
1091 (**pro).GetActiveAttrib(pro, index, maxLength, length, size, type,
1092 name);
1093 RELEASE_PROGRAM(pro);
Michal Krolc1fe4692004-10-27 17:09:10 +00001094}
1095
1096GLint GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +00001097_mesa_GetAttribLocationARB(GLhandleARB programObj, const GLcharARB * name)
Michal Krol1d7f7192005-03-25 12:12:50 +00001098{
Brian Paule71e4c92006-11-02 16:09:10 +00001099 GET_CURRENT_CONTEXT(ctx);
1100 GLint loc = -1;
1101 GET_LINKED_PROGRAM(pro, programObj, "glGetAttribLocationARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001102
Brian Paule71e4c92006-11-02 16:09:10 +00001103 if (pro == NULL)
1104 return -1;
Michal Krold55de652006-04-18 10:30:29 +00001105
Brian Paule71e4c92006-11-02 16:09:10 +00001106 if (name == NULL)
1107 _mesa_error(ctx, GL_INVALID_VALUE, "glGetAttribLocationARB");
1108 else if (!IS_NAME_WITH_GL_PREFIX(name))
1109 loc = (**pro).GetAttribLocation(pro, name);
1110 RELEASE_PROGRAM(pro);
1111 return loc;
Michal Krolc1fe4692004-10-27 17:09:10 +00001112}
1113
Brian Paulf961d392006-11-02 16:11:31 +00001114
1115/**
1116 ** OpenGL 2.0 functions which basically wrap the ARB_shader functions
1117 **/
1118
1119void GLAPIENTRY
1120_mesa_AttachShader(GLuint program, GLuint shader)
1121{
1122 _mesa_AttachObjectARB(program, shader);
1123}
1124
1125
1126GLuint GLAPIENTRY
1127_mesa_CreateShader(GLenum type)
1128{
1129 return (GLuint) _mesa_CreateShaderObjectARB(type);
1130}
1131
1132GLuint GLAPIENTRY
1133_mesa_CreateProgram(void)
1134{
1135 return (GLuint) _mesa_CreateProgramObjectARB();
1136}
1137
1138void GLAPIENTRY
1139_mesa_DeleteProgram(GLuint program)
1140{
1141 _mesa_DeleteObjectARB(program);
1142}
1143
1144
1145void GLAPIENTRY
1146_mesa_DeleteShader(GLuint shader)
1147{
1148 _mesa_DeleteObjectARB(shader);
1149}
1150
1151void GLAPIENTRY
1152_mesa_DetachShader(GLuint program, GLuint shader)
1153{
1154 _mesa_DetachObjectARB(program, shader);
1155}
1156
1157void GLAPIENTRY
1158_mesa_GetAttachedShaders(GLuint program, GLsizei maxCount,
1159 GLsizei *count, GLuint *obj)
1160{
1161 _mesa_GetAttachedObjectsARB(program, maxCount, count, obj);
1162}
1163
1164void GLAPIENTRY
1165_mesa_GetProgramiv(GLuint program, GLenum pname, GLint *params)
1166{
1167 /* XXX to do */
1168}
1169
1170void GLAPIENTRY
1171_mesa_GetProgramInfoLog(GLuint program, GLsizei bufSize,
1172 GLsizei *length, GLchar *infoLog)
1173{
1174 _mesa_GetInfoLogARB(program, bufSize, length, infoLog);
1175}
1176
1177void GLAPIENTRY
1178_mesa_GetShaderiv(GLuint shader, GLenum pname, GLint *params)
1179{
1180 /* XXX to do */
1181}
1182
1183void GLAPIENTRY
1184_mesa_GetShaderInfoLog(GLuint shader, GLsizei bufSize,
1185 GLsizei *length, GLchar *infoLog)
1186{
1187 _mesa_GetInfoLogARB(shader, bufSize, length, infoLog);
1188}
1189
1190GLboolean GLAPIENTRY
Brian Paul12fe1b32006-11-02 16:21:04 +00001191_mesa_IsProgram(GLuint program)
Brian Paulf961d392006-11-02 16:11:31 +00001192{
1193 GET_CURRENT_CONTEXT(ctx);
1194 GET_GENERIC(gen, program, "glIsProgram");
1195 return gen ? GL_TRUE : GL_FALSE;
1196}
1197
1198GLboolean GLAPIENTRY
1199_mesa_IsShader(GLuint shader)
1200{
1201 GET_CURRENT_CONTEXT(ctx);
1202 GET_GENERIC(gen, shader, "glIsProgram");
1203 return gen ? GL_TRUE : GL_FALSE;
1204}
1205
1206
Brian Paulbdb251b2006-11-03 17:29:31 +00001207/**
1208 ** 2.1 functions
1209 **/
1210
1211void GLAPIENTRY
1212_mesa_UniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose,
1213 const GLfloat *value)
1214{
1215 uniform_matrix(2, 3, "glUniformMatrix2x3fv", GL_FLOAT_MAT2x3,
1216 location, count, transpose, value);
1217}
1218
1219void GLAPIENTRY
1220_mesa_UniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose,
1221 const GLfloat *value)
1222{
1223 uniform_matrix(3, 2, "glUniformMatrix3x2fv", GL_FLOAT_MAT3x2,
1224 location, count, transpose, value);
1225}
1226
1227void GLAPIENTRY
1228_mesa_UniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose,
1229 const GLfloat *value)
1230{
1231 uniform_matrix(2, 4, "glUniformMatrix2x4fv", GL_FLOAT_MAT2x4,
1232 location, count, transpose, value);
1233}
1234
1235void GLAPIENTRY
1236_mesa_UniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose,
1237 const GLfloat *value)
1238{
1239 uniform_matrix(4, 2, "glUniformMatrix4x2fv", GL_FLOAT_MAT4x2,
1240 location, count, transpose, value);
1241}
1242
1243void GLAPIENTRY
1244_mesa_UniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose,
1245 const GLfloat *value)
1246{
1247 uniform_matrix(3, 4, "glUniformMatrix3x4fv", GL_FLOAT_MAT3x4,
1248 location, count, transpose, value);
1249}
1250
1251void GLAPIENTRY
1252_mesa_UniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose,
1253 const GLfloat *value)
1254{
1255 uniform_matrix(4, 3, "glUniformMatrix4x3fv", GL_FLOAT_MAT4x3,
1256 location, count, transpose, value);
1257}
1258
1259
1260
1261
1262
Michal Krol365582d2006-08-01 20:07:31 +00001263#endif
1264
Michal Krol9ac96052006-02-27 14:41:41 +00001265GLvoid
Brian Paule71e4c92006-11-02 16:09:10 +00001266_mesa_init_shaderobjects(GLcontext * ctx)
Michal Krol1d7f7192005-03-25 12:12:50 +00001267{
Brian Paule71e4c92006-11-02 16:09:10 +00001268 ctx->ShaderObjects.CurrentProgram = NULL;
1269 ctx->ShaderObjects._FragmentShaderPresent = GL_FALSE;
1270 ctx->ShaderObjects._VertexShaderPresent = GL_FALSE;
Michal Krol1d7f7192005-03-25 12:12:50 +00001271
Brian Paule71e4c92006-11-02 16:09:10 +00001272 _mesa_init_shaderobjects_3dlabs(ctx);
Michal Krolc1fe4692004-10-27 17:09:10 +00001273}