blob: 9c4d8ab5289c90549699e7c86690276e79ad5b6f [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
Brian Paul2659ee92006-11-03 21:30:16 +0000352
353/**
354 * Helper function for all the _mesa_Uniform*() functions below.
355 */
356static INLINE void
357uniform(GLint location, GLsizei count, const GLvoid *values, GLenum type,
358 const char *caller)
Michal Krol9ac96052006-02-27 14:41:41 +0000359{
Brian Paule71e4c92006-11-02 16:09:10 +0000360 GET_CURRENT_CONTEXT(ctx);
Brian Paul2659ee92006-11-03 21:30:16 +0000361 GET_CURRENT_LINKED_PROGRAM(pro, caller);
Brian Paul93269622006-04-14 03:43:39 +0000362
Brian Paule71e4c92006-11-02 16:09:10 +0000363 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol9ac96052006-02-27 14:41:41 +0000364
Brian Paul2659ee92006-11-03 21:30:16 +0000365 if (!pro)
366 return;
367
368 if (!(**pro).WriteUniform(pro, location, count, values, type))
369 _mesa_error(ctx, GL_INVALID_OPERATION, caller);
370}
371
372
373GLvoid GLAPIENTRY
374_mesa_Uniform1fARB(GLint location, GLfloat v0)
375{
376 uniform(location, 1, &v0, GL_FLOAT, "glUniform1fARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000377}
378
Michal Krol9ac96052006-02-27 14:41:41 +0000379GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000380_mesa_Uniform2fARB(GLint location, GLfloat v0, GLfloat v1)
Michal Krol1d7f7192005-03-25 12:12:50 +0000381{
Brian Paul2659ee92006-11-03 21:30:16 +0000382 GLfloat v[2];
383 v[0] = v0;
384 v[1] = v1;
385 uniform(location, 1, v, GL_FLOAT_VEC2, "glUniform2fARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000386}
387
Michal Krol9ac96052006-02-27 14:41:41 +0000388GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000389_mesa_Uniform3fARB(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
Michal Krol1d7f7192005-03-25 12:12:50 +0000390{
Brian Paul2659ee92006-11-03 21:30:16 +0000391 GLfloat v[3];
392 v[0] = v0;
393 v[1] = v1;
394 v[2] = v2;
395 uniform(location, 1, v, GL_FLOAT_VEC3, "glUniform3fARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000396}
397
Michal Krol9ac96052006-02-27 14:41:41 +0000398GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000399_mesa_Uniform4fARB(GLint location, GLfloat v0, GLfloat v1, GLfloat v2,
400 GLfloat v3)
Michal Krol1d7f7192005-03-25 12:12:50 +0000401{
Brian Paul2659ee92006-11-03 21:30:16 +0000402 GLfloat v[4];
403 v[0] = v0;
404 v[1] = v1;
405 v[2] = v2;
406 v[3] = v3;
407 uniform(location, 1, v, GL_FLOAT_VEC4, "glUniform4fARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000408}
409
Michal Krol9ac96052006-02-27 14:41:41 +0000410GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000411_mesa_Uniform1iARB(GLint location, GLint v0)
Michal Krol1d7f7192005-03-25 12:12:50 +0000412{
Brian Paul2659ee92006-11-03 21:30:16 +0000413 uniform(location, 1, &v0, GL_INT, "glUniform1iARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000414}
415
Michal Krol9ac96052006-02-27 14:41:41 +0000416GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000417_mesa_Uniform2iARB(GLint location, GLint v0, GLint v1)
Michal Krol1d7f7192005-03-25 12:12:50 +0000418{
Brian Paul2659ee92006-11-03 21:30:16 +0000419 GLint v[2];
420 v[0] = v0;
421 v[1] = v1;
422 uniform(location, 1, v, GL_INT_VEC2, "glUniform2iARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000423}
424
Michal Krol9ac96052006-02-27 14:41:41 +0000425GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000426_mesa_Uniform3iARB(GLint location, GLint v0, GLint v1, GLint v2)
Michal Krol1d7f7192005-03-25 12:12:50 +0000427{
Brian Paul2659ee92006-11-03 21:30:16 +0000428 GLint v[3];
429 v[0] = v0;
430 v[1] = v1;
431 v[2] = v2;
432 uniform(location, 1, v, GL_INT_VEC3, "glUniform3iARB");
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_Uniform4iARB(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
Michal Krol1d7f7192005-03-25 12:12:50 +0000437{
Brian Paul2659ee92006-11-03 21:30:16 +0000438 GLint v[4];
439 v[0] = v0;
440 v[1] = v1;
441 v[2] = v2;
442 v[3] = v3;
443 uniform(location, 1, v, GL_INT_VEC4, "glUniform4iARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000444}
445
Michal Krol9ac96052006-02-27 14:41:41 +0000446GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000447_mesa_Uniform1fvARB(GLint location, GLsizei count, const GLfloat * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000448{
Brian Paul2659ee92006-11-03 21:30:16 +0000449 uniform(location, count, value, GL_FLOAT, "glUniform1fvARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000450}
451
Michal Krol9ac96052006-02-27 14:41:41 +0000452GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000453_mesa_Uniform2fvARB(GLint location, GLsizei count, const GLfloat * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000454{
Brian Paul2659ee92006-11-03 21:30:16 +0000455 uniform(location, count, value, GL_FLOAT_VEC2, "glUniform2fvARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000456}
457
Michal Krol9ac96052006-02-27 14:41:41 +0000458GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000459_mesa_Uniform3fvARB(GLint location, GLsizei count, const GLfloat * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000460{
Brian Paul2659ee92006-11-03 21:30:16 +0000461 uniform(location, count, value, GL_FLOAT_VEC3, "glUniform3fvARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000462}
463
Michal Krol9ac96052006-02-27 14:41:41 +0000464GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000465_mesa_Uniform4fvARB(GLint location, GLsizei count, const GLfloat * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000466{
Brian Paul2659ee92006-11-03 21:30:16 +0000467 uniform(location, count, value, GL_FLOAT_VEC4, "glUniform4fvARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000468}
469
Michal Krol9ac96052006-02-27 14:41:41 +0000470GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000471_mesa_Uniform1ivARB(GLint location, GLsizei count, const GLint * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000472{
Brian Paul2659ee92006-11-03 21:30:16 +0000473 uniform(location, count, value, GL_INT, "glUniform1ivARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000474}
475
Michal Krol9ac96052006-02-27 14:41:41 +0000476GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000477_mesa_Uniform2ivARB(GLint location, GLsizei count, const GLint * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000478{
Brian Paul2659ee92006-11-03 21:30:16 +0000479 uniform(location, count, value, GL_INT_VEC2, "glUniform2ivARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000480}
481
Michal Krol9ac96052006-02-27 14:41:41 +0000482GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000483_mesa_Uniform3ivARB(GLint location, GLsizei count, const GLint * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000484{
Brian Paul2659ee92006-11-03 21:30:16 +0000485 uniform(location, count, value, GL_INT_VEC3, "glUniform3ivARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000486}
487
Michal Krol9ac96052006-02-27 14:41:41 +0000488GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000489_mesa_Uniform4ivARB(GLint location, GLsizei count, const GLint * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000490{
Brian Paul2659ee92006-11-03 21:30:16 +0000491 uniform(location, count, value, GL_INT_VEC4, "glUniform4ivARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000492}
493
Brian Paul93269622006-04-14 03:43:39 +0000494
Brian Paulbdb251b2006-11-03 17:29:31 +0000495/**
496 * Helper function used by UniformMatrix**vARB() functions below.
497 */
498static void
499uniform_matrix(GLint cols, GLint rows, const char *caller,
500 GLenum matrixType,
501 GLint location, GLsizei count, GLboolean transpose,
502 const GLfloat *values)
503{
504 const GLint matElements = rows * cols;
505 GET_CURRENT_CONTEXT(ctx);
506 GET_CURRENT_LINKED_PROGRAM(pro, caller);
507
508 if (values == NULL) {
509 _mesa_error(ctx, GL_INVALID_VALUE, caller);
Brian Paule71e4c92006-11-02 16:09:10 +0000510 return;
511 }
Michal Krold55de652006-04-18 10:30:29 +0000512
Brian Paule71e4c92006-11-02 16:09:10 +0000513 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000514
Brian Paulbdb251b2006-11-03 17:29:31 +0000515 if (!pro)
516 return; /* no error? */
Michal Krol9ac96052006-02-27 14:41:41 +0000517
Brian Paulbdb251b2006-11-03 17:29:31 +0000518 if (transpose) {
519 GLfloat *trans, *pt;
520 const GLfloat *pv;
521 GLint i, j, k;
522
523 trans = (GLfloat *) _mesa_malloc(count * matElements * sizeof(GLfloat));
524 if (!trans) {
525 _mesa_error(ctx, GL_OUT_OF_MEMORY, caller);
526 return;
Brian Paule71e4c92006-11-02 16:09:10 +0000527 }
Brian Paulbdb251b2006-11-03 17:29:31 +0000528
529 pt = trans;
530 pv = values;
531 for (i = 0; i < count; i++) {
532 /* transpose from pv matrix into pt matrix */
533 for (j = 0; j < cols; j++) {
534 for (k = 0; k < rows; k++) {
535 /* XXX verify this */
536 pt[j * rows + k] = pv[k * cols + j];
537 }
538 }
539 pt += matElements;
540 pv += matElements;
Brian Paule71e4c92006-11-02 16:09:10 +0000541 }
Brian Paulbdb251b2006-11-03 17:29:31 +0000542
543 if (!(**pro).WriteUniform(pro, location, count, trans, matrixType))
544 _mesa_error(ctx, GL_INVALID_OPERATION, caller);
545 _mesa_free(trans);
Brian Paule71e4c92006-11-02 16:09:10 +0000546 }
Brian Paulbdb251b2006-11-03 17:29:31 +0000547 else {
548 if (!(**pro).WriteUniform(pro, location, count, values, matrixType))
549 _mesa_error(ctx, GL_INVALID_OPERATION, caller);
550 }
551}
552
553
554GLvoid GLAPIENTRY
555_mesa_UniformMatrix2fvARB(GLint location, GLsizei count, GLboolean transpose,
556 const GLfloat * value)
557{
558 uniform_matrix(2, 2, "glUniformMatrix2fvARB", GL_FLOAT_MAT2,
559 location, count, transpose, value);
Michal Krolc1fe4692004-10-27 17:09:10 +0000560}
561
Michal Krol9ac96052006-02-27 14:41:41 +0000562GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000563_mesa_UniformMatrix3fvARB(GLint location, GLsizei count, GLboolean transpose,
564 const GLfloat * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000565{
Brian Paulbdb251b2006-11-03 17:29:31 +0000566 uniform_matrix(3, 3, "glUniformMatrix3fvARB", GL_FLOAT_MAT3,
567 location, count, transpose, value);
Michal Krolc1fe4692004-10-27 17:09:10 +0000568}
569
Michal Krol9ac96052006-02-27 14:41:41 +0000570GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000571_mesa_UniformMatrix4fvARB(GLint location, GLsizei count, GLboolean transpose,
572 const GLfloat * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000573{
Brian Paulbdb251b2006-11-03 17:29:31 +0000574 uniform_matrix(4, 4, "glUniformMatrix4fvARB", GL_FLOAT_MAT4,
575 location, count, transpose, value);
Michal Krol1d7f7192005-03-25 12:12:50 +0000576}
577
578static GLboolean
Brian Paule71e4c92006-11-02 16:09:10 +0000579_mesa_get_object_parameter(GLhandleARB obj, GLenum pname, GLvoid * params,
580 GLboolean * integral, GLint * size)
Michal Krol1d7f7192005-03-25 12:12:50 +0000581{
Brian Paule71e4c92006-11-02 16:09:10 +0000582 GET_CURRENT_CONTEXT(ctx);
583 GLint *ipar = (GLint *) params;
Michal Krol1d7f7192005-03-25 12:12:50 +0000584
Brian Paule71e4c92006-11-02 16:09:10 +0000585 /* set default values */
Brian Paulbdb251b2006-11-03 17:29:31 +0000586 *integral = GL_TRUE; /* indicates param type, TRUE: GLint, FALSE: GLfloat */
587 *size = 1; /* param array size */
Michal Krol1d7f7192005-03-25 12:12:50 +0000588
Brian Paule71e4c92006-11-02 16:09:10 +0000589 switch (pname) {
590 case GL_OBJECT_TYPE_ARB:
591 case GL_OBJECT_DELETE_STATUS_ARB:
592 case GL_OBJECT_INFO_LOG_LENGTH_ARB:
593 {
594 GET_GENERIC(gen, obj, "glGetObjectParameterivARB");
Michal Krol9ac96052006-02-27 14:41:41 +0000595
Brian Paule71e4c92006-11-02 16:09:10 +0000596 if (gen == NULL)
597 return GL_FALSE;
Michal Krol9ac96052006-02-27 14:41:41 +0000598
Brian Paule71e4c92006-11-02 16:09:10 +0000599 switch (pname) {
600 case GL_OBJECT_TYPE_ARB:
601 *ipar = (**gen).GetType(gen);
602 break;
603 case GL_OBJECT_DELETE_STATUS_ARB:
604 *ipar = (**gen).GetDeleteStatus(gen);
605 break;
Michal Krola1a02e62006-05-16 09:40:30 +0000606 case GL_OBJECT_INFO_LOG_LENGTH_ARB:
Brian Paule71e4c92006-11-02 16:09:10 +0000607 *ipar = (**gen).GetInfoLogLength(gen);
Michal Krola1a02e62006-05-16 09:40:30 +0000608 break;
Brian Paule71e4c92006-11-02 16:09:10 +0000609 }
Michal Krol9ac96052006-02-27 14:41:41 +0000610
Brian Paule71e4c92006-11-02 16:09:10 +0000611 RELEASE_GENERIC(gen);
612 }
613 break;
614 case GL_OBJECT_SUBTYPE_ARB:
615 case GL_OBJECT_COMPILE_STATUS_ARB:
616 case GL_OBJECT_SHADER_SOURCE_LENGTH_ARB:
617 {
618 GET_SHADER(sha, obj, "glGetObjectParameterivARB");
Michal Krol9ac96052006-02-27 14:41:41 +0000619
Brian Paule71e4c92006-11-02 16:09:10 +0000620 if (sha == NULL)
621 return GL_FALSE;
Michal Krol9ac96052006-02-27 14:41:41 +0000622
Brian Paule71e4c92006-11-02 16:09:10 +0000623 switch (pname) {
624 case GL_OBJECT_SUBTYPE_ARB:
625 *ipar = (**sha).GetSubType(sha);
626 break;
627 case GL_OBJECT_COMPILE_STATUS_ARB:
628 *ipar = (**sha).GetCompileStatus(sha);
629 break;
630 case GL_OBJECT_SHADER_SOURCE_LENGTH_ARB:
631 {
632 const GLcharARB *src = (**sha).GetSource(sha);
Brian Paule71e4c92006-11-02 16:09:10 +0000633 if (src == NULL)
634 *ipar = 0;
635 else
636 *ipar = _mesa_strlen(src) + 1;
637 }
638 break;
639 }
Michal Krol9ac96052006-02-27 14:41:41 +0000640
Brian Paule71e4c92006-11-02 16:09:10 +0000641 RELEASE_SHADER(sha);
642 }
643 break;
644 case GL_OBJECT_LINK_STATUS_ARB:
645 case GL_OBJECT_VALIDATE_STATUS_ARB:
646 case GL_OBJECT_ATTACHED_OBJECTS_ARB:
647 case GL_OBJECT_ACTIVE_UNIFORMS_ARB:
648 case GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB:
649 {
650 GET_PROGRAM(pro, obj, "glGetObjectParameterivARB");
Michal Krol9ac96052006-02-27 14:41:41 +0000651
Brian Paule71e4c92006-11-02 16:09:10 +0000652 if (pro == NULL)
653 return GL_FALSE;
Michal Krol9ac96052006-02-27 14:41:41 +0000654
Brian Paule71e4c92006-11-02 16:09:10 +0000655 switch (pname) {
656 case GL_OBJECT_LINK_STATUS_ARB:
657 *ipar = (**pro).GetLinkStatus(pro);
658 break;
659 case GL_OBJECT_VALIDATE_STATUS_ARB:
660 *ipar = (**pro).GetValidateStatus(pro);
661 break;
Michal Krola1a02e62006-05-16 09:40:30 +0000662 case GL_OBJECT_ATTACHED_OBJECTS_ARB:
Brian Paule71e4c92006-11-02 16:09:10 +0000663 *ipar =
664 (**pro)._container.
665 GetAttachedCount((struct gl2_container_intf **) (pro));
Michal Krola1a02e62006-05-16 09:40:30 +0000666 break;
Brian Paule71e4c92006-11-02 16:09:10 +0000667 case GL_OBJECT_ACTIVE_UNIFORMS_ARB:
668 *ipar = (**pro).GetActiveUniformCount(pro);
669 break;
670 case GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB:
671 *ipar = (**pro).GetActiveUniformMaxLength(pro);
672 break;
673 case GL_OBJECT_ACTIVE_ATTRIBUTES_ARB:
674 *ipar = (**pro).GetActiveAttribCount(pro);
675 break;
676 case GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB:
677 *ipar = (**pro).GetActiveAttribMaxLength(pro);
678 break;
679 }
Michal Krol9ac96052006-02-27 14:41:41 +0000680
Brian Paule71e4c92006-11-02 16:09:10 +0000681 RELEASE_PROGRAM(pro);
682 }
683 break;
684 default:
685 _mesa_error(ctx, GL_INVALID_ENUM, "glGetObjectParameterivARB");
686 return GL_FALSE;
687 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000688
Brian Paule71e4c92006-11-02 16:09:10 +0000689 return GL_TRUE;
Michal Krol1d7f7192005-03-25 12:12:50 +0000690}
691
Michal Krol9ac96052006-02-27 14:41:41 +0000692GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000693_mesa_GetObjectParameterfvARB(GLhandleARB obj, GLenum pname, GLfloat * params)
Michal Krol1d7f7192005-03-25 12:12:50 +0000694{
Brian Paule71e4c92006-11-02 16:09:10 +0000695 GET_CURRENT_CONTEXT(ctx);
696 GLboolean integral;
697 GLint size;
Michal Krol1d7f7192005-03-25 12:12:50 +0000698
Brian Paule71e4c92006-11-02 16:09:10 +0000699 if (params == NULL) {
700 _mesa_error(ctx, GL_INVALID_VALUE, "glGetObjectParameterfvARB");
701 return;
702 }
Michal Krold55de652006-04-18 10:30:29 +0000703
Brian Paule71e4c92006-11-02 16:09:10 +0000704 assert(sizeof(GLfloat) == sizeof(GLint));
Michal Krol1d7f7192005-03-25 12:12:50 +0000705
Brian Paulbdb251b2006-11-03 17:29:31 +0000706 if (_mesa_get_object_parameter(obj, pname, (GLvoid *) params,
707 &integral, &size)) {
Brian Paule71e4c92006-11-02 16:09:10 +0000708 if (integral) {
709 GLint i;
Brian Paule71e4c92006-11-02 16:09:10 +0000710 for (i = 0; i < size; i++)
711 params[i] = (GLfloat) ((GLint *) params)[i];
712 }
Brian Paulbdb251b2006-11-03 17:29:31 +0000713 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000714}
715
Michal Krol9ac96052006-02-27 14:41:41 +0000716GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000717_mesa_GetObjectParameterivARB(GLhandleARB obj, GLenum pname, GLint * params)
Michal Krol1d7f7192005-03-25 12:12:50 +0000718{
Brian Paule71e4c92006-11-02 16:09:10 +0000719 GET_CURRENT_CONTEXT(ctx);
720 GLboolean integral;
721 GLint size;
Michal Krol1d7f7192005-03-25 12:12:50 +0000722
Brian Paule71e4c92006-11-02 16:09:10 +0000723 if (params == NULL) {
724 _mesa_error(ctx, GL_INVALID_VALUE, "glGetObjectParameterivARB");
725 return;
726 }
Michal Krold55de652006-04-18 10:30:29 +0000727
Brian Paule71e4c92006-11-02 16:09:10 +0000728 assert(sizeof(GLfloat) == sizeof(GLint));
Michal Krol1d7f7192005-03-25 12:12:50 +0000729
Brian Paulbdb251b2006-11-03 17:29:31 +0000730 if (_mesa_get_object_parameter(obj, pname, (GLvoid *) params,
731 &integral, &size)) {
Brian Paule71e4c92006-11-02 16:09:10 +0000732 if (!integral) {
733 GLint i;
Brian Paule71e4c92006-11-02 16:09:10 +0000734 for (i = 0; i < size; i++)
735 params[i] = (GLint) ((GLfloat *) params)[i];
736 }
Brian Paulbdb251b2006-11-03 17:29:31 +0000737 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000738}
739
Brian Paul93269622006-04-14 03:43:39 +0000740
741/**
742 * Copy string from <src> to <dst>, up to maxLength characters, returning
743 * length of <dst> in <length>.
744 * \param src the strings source
745 * \param maxLength max chars to copy
746 * \param length returns numberof chars copied
747 * \param dst the string destination
748 */
Michal Krol9ac96052006-02-27 14:41:41 +0000749static GLvoid
Brian Paule71e4c92006-11-02 16:09:10 +0000750copy_string(const GLcharARB * src, GLsizei maxLength, GLsizei * length,
751 GLcharARB * dst)
Michal Krol1d7f7192005-03-25 12:12:50 +0000752{
Brian Paule71e4c92006-11-02 16:09:10 +0000753 GLsizei len;
754 for (len = 0; len < maxLength - 1 && src && src[len]; len++)
755 dst[len] = src[len];
756 if (maxLength > 0)
757 dst[len] = 0;
758 if (length)
759 *length = len;
Michal Krolc1fe4692004-10-27 17:09:10 +0000760}
761
Brian Paul93269622006-04-14 03:43:39 +0000762
Michal Krol9ac96052006-02-27 14:41:41 +0000763GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000764_mesa_GetInfoLogARB(GLhandleARB obj, GLsizei maxLength, GLsizei * length,
765 GLcharARB * infoLog)
Michal Krol1d7f7192005-03-25 12:12:50 +0000766{
Brian Paule71e4c92006-11-02 16:09:10 +0000767 GET_CURRENT_CONTEXT(ctx);
768 GET_GENERIC(gen, obj, "glGetInfoLogARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000769
Brian Paule71e4c92006-11-02 16:09:10 +0000770 if (gen == NULL)
771 return;
Michal Krold55de652006-04-18 10:30:29 +0000772
Brian Paule71e4c92006-11-02 16:09:10 +0000773 if (infoLog == NULL)
774 _mesa_error(ctx, GL_INVALID_VALUE, "glGetInfoLogARB");
Michal Krola1a02e62006-05-16 09:40:30 +0000775 else {
Brian Paule71e4c92006-11-02 16:09:10 +0000776 GLsizei actualsize = (**gen).GetInfoLogLength(gen);
Michal Krola1a02e62006-05-16 09:40:30 +0000777 if (actualsize > maxLength)
778 actualsize = maxLength;
Brian Paule71e4c92006-11-02 16:09:10 +0000779 (**gen).GetInfoLog(gen, actualsize, infoLog);
Michal Krola1a02e62006-05-16 09:40:30 +0000780 if (length != NULL)
781 *length = (actualsize > 0) ? actualsize - 1 : 0;
782 }
Brian Paule71e4c92006-11-02 16:09:10 +0000783 RELEASE_GENERIC(gen);
Michal Krol1d7f7192005-03-25 12:12:50 +0000784}
785
Michal Krol9ac96052006-02-27 14:41:41 +0000786GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000787_mesa_GetAttachedObjectsARB(GLhandleARB containerObj, GLsizei maxCount,
788 GLsizei * count, GLhandleARB * obj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000789{
Brian Paule71e4c92006-11-02 16:09:10 +0000790 GET_CURRENT_CONTEXT(ctx);
791 GET_CONTAINER(con, containerObj, "glGetAttachedObjectsARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000792
Brian Paule71e4c92006-11-02 16:09:10 +0000793 if (con == NULL)
794 return;
Michal Krold55de652006-04-18 10:30:29 +0000795
Brian Paule71e4c92006-11-02 16:09:10 +0000796 if (obj == NULL)
797 _mesa_error(ctx, GL_INVALID_VALUE, "glGetAttachedObjectsARB");
798 else {
799 GLsizei cnt, i;
Michal Krold55de652006-04-18 10:30:29 +0000800
Brian Paule71e4c92006-11-02 16:09:10 +0000801 cnt = (**con).GetAttachedCount(con);
802 if (cnt > maxCount)
803 cnt = maxCount;
804 if (count != NULL)
805 *count = cnt;
Michal Krol9ac96052006-02-27 14:41:41 +0000806
Brian Paule71e4c92006-11-02 16:09:10 +0000807 for (i = 0; i < cnt; i++) {
808 struct gl2_generic_intf **x = (**con).GetAttached(con, i);
809 obj[i] = (**x).GetName(x);
810 RELEASE_GENERIC(x);
811 }
812 }
813 RELEASE_CONTAINER(con);
Michal Krol9ac96052006-02-27 14:41:41 +0000814}
Michal Krolc1fe4692004-10-27 17:09:10 +0000815
816GLint GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000817_mesa_GetUniformLocationARB(GLhandleARB programObj, const GLcharARB * name)
Michal Krol1d7f7192005-03-25 12:12:50 +0000818{
Brian Paule71e4c92006-11-02 16:09:10 +0000819 GET_CURRENT_CONTEXT(ctx);
820 GLint loc = -1;
821 GET_LINKED_PROGRAM(pro, programObj, "glGetUniformLocationARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000822
Brian Paule71e4c92006-11-02 16:09:10 +0000823 if (pro == NULL)
824 return -1;
Michal Krold55de652006-04-18 10:30:29 +0000825
Brian Paule71e4c92006-11-02 16:09:10 +0000826 if (name == NULL)
827 _mesa_error(ctx, GL_INVALID_VALUE, "glGetUniformLocationARB");
828 else {
829 if (!IS_NAME_WITH_GL_PREFIX(name))
830 loc = (**pro).GetUniformLocation(pro, name);
831 }
832 RELEASE_PROGRAM(pro);
833 return loc;
Michal Krolc1fe4692004-10-27 17:09:10 +0000834}
835
Michal Krol9ac96052006-02-27 14:41:41 +0000836GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000837_mesa_GetActiveUniformARB(GLhandleARB programObj, GLuint index,
838 GLsizei maxLength, GLsizei * length, GLint * size,
839 GLenum * type, GLcharARB * name)
Michal Krol1d7f7192005-03-25 12:12:50 +0000840{
Brian Paule71e4c92006-11-02 16:09:10 +0000841 GET_CURRENT_CONTEXT(ctx);
842 GET_PROGRAM(pro, programObj, "glGetActiveUniformARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000843
Brian Paule71e4c92006-11-02 16:09:10 +0000844 if (pro == NULL)
845 return;
Michal Krold55de652006-04-18 10:30:29 +0000846
Brian Paule71e4c92006-11-02 16:09:10 +0000847 if (size == NULL || type == NULL || name == NULL)
848 _mesa_error(ctx, GL_INVALID_VALUE, "glGetActiveUniformARB");
849 else {
850 if (index < (**pro).GetActiveUniformCount(pro))
851 (**pro).GetActiveUniform(pro, index, maxLength, length, size, type,
852 name);
853 else
854 _mesa_error(ctx, GL_INVALID_VALUE, "glGetActiveUniformARB");
855 }
856 RELEASE_PROGRAM(pro);
Michal Krolc1fe4692004-10-27 17:09:10 +0000857}
858
Michal Krol9ac96052006-02-27 14:41:41 +0000859GLvoid GLAPIENTRY
Brian Paulbdb251b2006-11-03 17:29:31 +0000860_mesa_GetUniformfvARB(GLhandleARB programObj, GLint location, GLfloat * params)
Michal Krol1d7f7192005-03-25 12:12:50 +0000861{
Brian Paule71e4c92006-11-02 16:09:10 +0000862 GET_CURRENT_CONTEXT(ctx);
863 GET_LINKED_PROGRAM(pro, programObj, "glGetUniformfvARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000864
Brian Paule71e4c92006-11-02 16:09:10 +0000865 if (pro != NULL) {
Brian Paul2659ee92006-11-03 21:30:16 +0000866 if (!(**pro).ReadUniform(pro, location, 1, params, GL_FLOAT))
Brian Paulbdb251b2006-11-03 17:29:31 +0000867 _mesa_error(ctx, GL_INVALID_OPERATION, "glGetUniformfvARB");
Brian Paule71e4c92006-11-02 16:09:10 +0000868 RELEASE_PROGRAM(pro);
869 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000870}
871
Michal Krol9ac96052006-02-27 14:41:41 +0000872GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000873_mesa_GetUniformivARB(GLhandleARB programObj, GLint location, GLint * params)
Michal Krol1d7f7192005-03-25 12:12:50 +0000874{
Brian Paule71e4c92006-11-02 16:09:10 +0000875 GET_CURRENT_CONTEXT(ctx);
876 GET_LINKED_PROGRAM(pro, programObj, "glGetUniformivARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000877
Brian Paule71e4c92006-11-02 16:09:10 +0000878 if (pro != NULL) {
Brian Paul2659ee92006-11-03 21:30:16 +0000879 if (!(**pro).ReadUniform(pro, location, 1, params, GL_INT))
880 _mesa_error(ctx, GL_INVALID_OPERATION, "glGetUniformivARB");
Brian Paule71e4c92006-11-02 16:09:10 +0000881 RELEASE_PROGRAM(pro);
882 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000883}
884
Michal Krol9ac96052006-02-27 14:41:41 +0000885GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000886_mesa_GetShaderSourceARB(GLhandleARB obj, GLsizei maxLength, GLsizei * length,
887 GLcharARB * source)
Michal Krol1d7f7192005-03-25 12:12:50 +0000888{
Brian Paule71e4c92006-11-02 16:09:10 +0000889 GET_CURRENT_CONTEXT(ctx);
890 GET_SHADER(sha, obj, "glGetShaderSourceARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000891
Brian Paule71e4c92006-11-02 16:09:10 +0000892 if (sha == NULL)
893 return;
Michal Krold55de652006-04-18 10:30:29 +0000894
Brian Paule71e4c92006-11-02 16:09:10 +0000895 if (source == NULL)
896 _mesa_error(ctx, GL_INVALID_VALUE, "glGetShaderSourceARB");
897 else
898 copy_string((**sha).GetSource(sha), maxLength, length, source);
899 RELEASE_SHADER(sha);
Michal Krolc1fe4692004-10-27 17:09:10 +0000900}
901
902/* GL_ARB_vertex_shader */
903
Michal Krol9ac96052006-02-27 14:41:41 +0000904GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000905_mesa_BindAttribLocationARB(GLhandleARB programObj, GLuint index,
906 const GLcharARB * name)
Michal Krol1d7f7192005-03-25 12:12:50 +0000907{
Brian Paule71e4c92006-11-02 16:09:10 +0000908 GET_CURRENT_CONTEXT(ctx);
909 GET_PROGRAM(pro, programObj, "glBindAttribLocationARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000910
Brian Paule71e4c92006-11-02 16:09:10 +0000911 if (pro == NULL)
912 return;
Michal Krold55de652006-04-18 10:30:29 +0000913
Brian Paule71e4c92006-11-02 16:09:10 +0000914 if (name == NULL || index >= MAX_VERTEX_ATTRIBS)
915 _mesa_error(ctx, GL_INVALID_VALUE, "glBindAttribLocationARB");
916 else if (IS_NAME_WITH_GL_PREFIX(name))
917 _mesa_error(ctx, GL_INVALID_OPERATION, "glBindAttribLocationARB");
918 else
919 (**pro).OverrideAttribBinding(pro, index, name);
920 RELEASE_PROGRAM(pro);
Michal Krolc1fe4692004-10-27 17:09:10 +0000921}
922
Michal Krol9ac96052006-02-27 14:41:41 +0000923GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000924_mesa_GetActiveAttribARB(GLhandleARB programObj, GLuint index,
925 GLsizei maxLength, GLsizei * length, GLint * size,
926 GLenum * type, GLcharARB * name)
Michal Krol1d7f7192005-03-25 12:12:50 +0000927{
Brian Paule71e4c92006-11-02 16:09:10 +0000928 GET_CURRENT_CONTEXT(ctx);
929 GET_PROGRAM(pro, programObj, "glGetActiveAttribARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000930
Brian Paule71e4c92006-11-02 16:09:10 +0000931 if (pro == NULL)
932 return;
Michal Krold55de652006-04-18 10:30:29 +0000933
Brian Paule71e4c92006-11-02 16:09:10 +0000934 if (name == NULL || index >= (**pro).GetActiveAttribCount(pro))
935 _mesa_error(ctx, GL_INVALID_VALUE, "glGetActiveAttribARB");
936 else
937 (**pro).GetActiveAttrib(pro, index, maxLength, length, size, type,
938 name);
939 RELEASE_PROGRAM(pro);
Michal Krolc1fe4692004-10-27 17:09:10 +0000940}
941
942GLint GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000943_mesa_GetAttribLocationARB(GLhandleARB programObj, const GLcharARB * name)
Michal Krol1d7f7192005-03-25 12:12:50 +0000944{
Brian Paule71e4c92006-11-02 16:09:10 +0000945 GET_CURRENT_CONTEXT(ctx);
946 GLint loc = -1;
947 GET_LINKED_PROGRAM(pro, programObj, "glGetAttribLocationARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000948
Brian Paule71e4c92006-11-02 16:09:10 +0000949 if (pro == NULL)
950 return -1;
Michal Krold55de652006-04-18 10:30:29 +0000951
Brian Paule71e4c92006-11-02 16:09:10 +0000952 if (name == NULL)
953 _mesa_error(ctx, GL_INVALID_VALUE, "glGetAttribLocationARB");
954 else if (!IS_NAME_WITH_GL_PREFIX(name))
955 loc = (**pro).GetAttribLocation(pro, name);
956 RELEASE_PROGRAM(pro);
957 return loc;
Michal Krolc1fe4692004-10-27 17:09:10 +0000958}
959
Brian Paulf961d392006-11-02 16:11:31 +0000960
961/**
962 ** OpenGL 2.0 functions which basically wrap the ARB_shader functions
963 **/
964
965void GLAPIENTRY
966_mesa_AttachShader(GLuint program, GLuint shader)
967{
968 _mesa_AttachObjectARB(program, shader);
969}
970
971
972GLuint GLAPIENTRY
973_mesa_CreateShader(GLenum type)
974{
975 return (GLuint) _mesa_CreateShaderObjectARB(type);
976}
977
978GLuint GLAPIENTRY
979_mesa_CreateProgram(void)
980{
981 return (GLuint) _mesa_CreateProgramObjectARB();
982}
983
984void GLAPIENTRY
985_mesa_DeleteProgram(GLuint program)
986{
987 _mesa_DeleteObjectARB(program);
988}
989
990
991void GLAPIENTRY
992_mesa_DeleteShader(GLuint shader)
993{
994 _mesa_DeleteObjectARB(shader);
995}
996
997void GLAPIENTRY
998_mesa_DetachShader(GLuint program, GLuint shader)
999{
1000 _mesa_DetachObjectARB(program, shader);
1001}
1002
1003void GLAPIENTRY
1004_mesa_GetAttachedShaders(GLuint program, GLsizei maxCount,
1005 GLsizei *count, GLuint *obj)
1006{
1007 _mesa_GetAttachedObjectsARB(program, maxCount, count, obj);
1008}
1009
1010void GLAPIENTRY
1011_mesa_GetProgramiv(GLuint program, GLenum pname, GLint *params)
1012{
1013 /* XXX to do */
1014}
1015
1016void GLAPIENTRY
1017_mesa_GetProgramInfoLog(GLuint program, GLsizei bufSize,
1018 GLsizei *length, GLchar *infoLog)
1019{
1020 _mesa_GetInfoLogARB(program, bufSize, length, infoLog);
1021}
1022
1023void GLAPIENTRY
1024_mesa_GetShaderiv(GLuint shader, GLenum pname, GLint *params)
1025{
1026 /* XXX to do */
1027}
1028
1029void GLAPIENTRY
1030_mesa_GetShaderInfoLog(GLuint shader, GLsizei bufSize,
1031 GLsizei *length, GLchar *infoLog)
1032{
1033 _mesa_GetInfoLogARB(shader, bufSize, length, infoLog);
1034}
1035
1036GLboolean GLAPIENTRY
Brian Paul12fe1b32006-11-02 16:21:04 +00001037_mesa_IsProgram(GLuint program)
Brian Paulf961d392006-11-02 16:11:31 +00001038{
1039 GET_CURRENT_CONTEXT(ctx);
1040 GET_GENERIC(gen, program, "glIsProgram");
1041 return gen ? GL_TRUE : GL_FALSE;
1042}
1043
1044GLboolean GLAPIENTRY
1045_mesa_IsShader(GLuint shader)
1046{
1047 GET_CURRENT_CONTEXT(ctx);
1048 GET_GENERIC(gen, shader, "glIsProgram");
1049 return gen ? GL_TRUE : GL_FALSE;
1050}
1051
1052
Brian Paulbdb251b2006-11-03 17:29:31 +00001053/**
1054 ** 2.1 functions
1055 **/
1056
1057void GLAPIENTRY
1058_mesa_UniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose,
1059 const GLfloat *value)
1060{
1061 uniform_matrix(2, 3, "glUniformMatrix2x3fv", GL_FLOAT_MAT2x3,
1062 location, count, transpose, value);
1063}
1064
1065void GLAPIENTRY
1066_mesa_UniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose,
1067 const GLfloat *value)
1068{
1069 uniform_matrix(3, 2, "glUniformMatrix3x2fv", GL_FLOAT_MAT3x2,
1070 location, count, transpose, value);
1071}
1072
1073void GLAPIENTRY
1074_mesa_UniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose,
1075 const GLfloat *value)
1076{
1077 uniform_matrix(2, 4, "glUniformMatrix2x4fv", GL_FLOAT_MAT2x4,
1078 location, count, transpose, value);
1079}
1080
1081void GLAPIENTRY
1082_mesa_UniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose,
1083 const GLfloat *value)
1084{
1085 uniform_matrix(4, 2, "glUniformMatrix4x2fv", GL_FLOAT_MAT4x2,
1086 location, count, transpose, value);
1087}
1088
1089void GLAPIENTRY
1090_mesa_UniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose,
1091 const GLfloat *value)
1092{
1093 uniform_matrix(3, 4, "glUniformMatrix3x4fv", GL_FLOAT_MAT3x4,
1094 location, count, transpose, value);
1095}
1096
1097void GLAPIENTRY
1098_mesa_UniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose,
1099 const GLfloat *value)
1100{
1101 uniform_matrix(4, 3, "glUniformMatrix4x3fv", GL_FLOAT_MAT4x3,
1102 location, count, transpose, value);
1103}
1104
1105
1106
1107
1108
Michal Krol365582d2006-08-01 20:07:31 +00001109#endif
1110
Michal Krol9ac96052006-02-27 14:41:41 +00001111GLvoid
Brian Paule71e4c92006-11-02 16:09:10 +00001112_mesa_init_shaderobjects(GLcontext * ctx)
Michal Krol1d7f7192005-03-25 12:12:50 +00001113{
Brian Paule71e4c92006-11-02 16:09:10 +00001114 ctx->ShaderObjects.CurrentProgram = NULL;
1115 ctx->ShaderObjects._FragmentShaderPresent = GL_FALSE;
1116 ctx->ShaderObjects._VertexShaderPresent = GL_FALSE;
Michal Krol1d7f7192005-03-25 12:12:50 +00001117
Brian Paule71e4c92006-11-02 16:09:10 +00001118 _mesa_init_shaderobjects_3dlabs(ctx);
Michal Krolc1fe4692004-10-27 17:09:10 +00001119}