blob: f805e2cebd37760b188a53701d167e0c8cce6a89 [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"
Brianfe1d01c2006-12-13 14:54:47 -070035#include "macros.h"
Michal Krol1d7f7192005-03-25 12:12:50 +000036#include "shaderobjects.h"
Michal Krol6324f732005-01-13 14:12:50 +000037#include "shaderobjects_3dlabs.h"
Brianfe1d01c2006-12-13 14:54:47 -070038#include "slang_link.h"
Michal Krol1d7f7192005-03-25 12:12:50 +000039
40
Michal Krol365582d2006-08-01 20:07:31 +000041#if FEATURE_ARB_shader_objects
42
Michal Krol9ac96052006-02-27 14:41:41 +000043#define RELEASE_GENERIC(x)\
Michal Krola1a02e62006-05-16 09:40:30 +000044 (**x)._unknown.Release ((struct gl2_unknown_intf **) (x))
Michal Krol9ac96052006-02-27 14:41:41 +000045
46#define RELEASE_CONTAINER(x)\
Michal Krola1a02e62006-05-16 09:40:30 +000047 (**x)._generic._unknown.Release ((struct gl2_unknown_intf **) (x))
Michal Krol9ac96052006-02-27 14:41:41 +000048
49#define RELEASE_PROGRAM(x)\
Michal Krola1a02e62006-05-16 09:40:30 +000050 (**x)._container._generic._unknown.Release ((struct gl2_unknown_intf **) (x))
Michal Krol9ac96052006-02-27 14:41:41 +000051
52#define RELEASE_SHADER(x)\
Michal Krola1a02e62006-05-16 09:40:30 +000053 (**x)._generic._unknown.Release ((struct gl2_unknown_intf **) (x))
Michal Krol9ac96052006-02-27 14:41:41 +000054
Brian Paulbdb251b2006-11-03 17:29:31 +000055
56
Michal Krola1a02e62006-05-16 09:40:30 +000057static struct gl2_unknown_intf **
Brian Paule71e4c92006-11-02 16:09:10 +000058lookup_handle(GLcontext * ctx, GLhandleARB handle, enum gl2_uiid uiid,
59 const char *function)
Michal Krola1a02e62006-05-16 09:40:30 +000060{
61 struct gl2_unknown_intf **unk;
Michal Krol9ac96052006-02-27 14:41:41 +000062
Michal Krola1a02e62006-05-16 09:40:30 +000063 /*
Brian Paulbdb251b2006-11-03 17:29:31 +000064 * Note: _mesa_HashLookup() requires non-zero input values, so the
65 * passed-in handle value must be checked beforehand.
Michal Krola1a02e62006-05-16 09:40:30 +000066 */
67 if (handle == 0) {
Brian Paule71e4c92006-11-02 16:09:10 +000068 _mesa_error(ctx, GL_INVALID_VALUE, function);
Michal Krola1a02e62006-05-16 09:40:30 +000069 return NULL;
70 }
Brian Paule71e4c92006-11-02 16:09:10 +000071 _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
Brian Paul3bef6002006-11-03 22:15:43 +000072 unk = (struct gl2_unknown_intf **) _mesa_HashLookup(ctx->Shared->GL2Objects,
73 handle);
Brian Paule71e4c92006-11-02 16:09:10 +000074 _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
Brian Paulbdb251b2006-11-03 17:29:31 +000075
76 if (unk == NULL) {
Brian Paule71e4c92006-11-02 16:09:10 +000077 _mesa_error(ctx, GL_INVALID_VALUE, function);
Brian Paulbdb251b2006-11-03 17:29:31 +000078 }
Michal Krola1a02e62006-05-16 09:40:30 +000079 else {
Brian Paule71e4c92006-11-02 16:09:10 +000080 unk = (**unk).QueryInterface(unk, uiid);
Michal Krola1a02e62006-05-16 09:40:30 +000081 if (unk == NULL)
Brian Paule71e4c92006-11-02 16:09:10 +000082 _mesa_error(ctx, GL_INVALID_OPERATION, function);
Michal Krola1a02e62006-05-16 09:40:30 +000083 }
84 return unk;
85}
Michal Krol9ac96052006-02-27 14:41:41 +000086
87#define GET_GENERIC(x, handle, function)\
Michal Krola1a02e62006-05-16 09:40:30 +000088 struct gl2_generic_intf **x = (struct gl2_generic_intf **)\
89 lookup_handle (ctx, handle, UIID_GENERIC, function);
Michal Krol9ac96052006-02-27 14:41:41 +000090
91#define GET_CONTAINER(x, handle, function)\
Michal Krola1a02e62006-05-16 09:40:30 +000092 struct gl2_container_intf **x = (struct gl2_container_intf **)\
93 lookup_handle (ctx, handle, UIID_CONTAINER, function);
Michal Krol9ac96052006-02-27 14:41:41 +000094
95#define GET_PROGRAM(x, handle, function)\
Michal Krola1a02e62006-05-16 09:40:30 +000096 struct gl2_program_intf **x = (struct gl2_program_intf **)\
97 lookup_handle (ctx, handle, UIID_PROGRAM, function);
Michal Krol9ac96052006-02-27 14:41:41 +000098
99#define GET_SHADER(x, handle, function)\
Michal Krola1a02e62006-05-16 09:40:30 +0000100 struct gl2_shader_intf **x = (struct gl2_shader_intf **)\
101 lookup_handle (ctx, handle, UIID_SHADER, function);
Michal Krol9ac96052006-02-27 14:41:41 +0000102
Brian Paul7e6701c2006-11-03 21:51:58 +0000103
104#define GET_LINKED_PROGRAM(x, handle, function) \
105 GET_PROGRAM(x, handle, function); \
106 if (x && (**x).GetLinkStatus(x) == GL_FALSE) { \
107 RELEASE_PROGRAM(x); \
108 _mesa_error(ctx, GL_INVALID_OPERATION, function); \
109 x = NULL; \
Michal Krola1a02e62006-05-16 09:40:30 +0000110 }
Michal Krol9ac96052006-02-27 14:41:41 +0000111
Brian Paul7e6701c2006-11-03 21:51:58 +0000112#define GET_CURRENT_LINKED_PROGRAM(x, function) \
113 struct gl2_program_intf **x = ctx->ShaderObjects.CurrentProgram; \
114 if (!x || (**x).GetLinkStatus(x) == GL_FALSE) { \
115 _mesa_error(ctx, GL_INVALID_OPERATION, function); \
116 return; \
Michal Krola1a02e62006-05-16 09:40:30 +0000117 }
Michal Krol9ac96052006-02-27 14:41:41 +0000118
Brian Paul7e6701c2006-11-03 21:51:58 +0000119
120
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 /*
Brianfe1d01c2006-12-13 14:54:47 -0700203 * This array holds offsets of where the appropriate string ends, thus the
204 * last element will be set to the total length of the source code.
Brian Paule71e4c92006-11-02 16:09:10 +0000205 */
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
Brianfe1d01c2006-12-13 14:54:47 -0700229 source = (GLcharARB *) _mesa_malloc((offsets[count - 1] + 1) *
230 sizeof(GLcharARB));
Brian Paule71e4c92006-11-02 16:09:10 +0000231 if (source == NULL) {
232 _mesa_free((GLvoid *) offsets);
233 RELEASE_SHADER(sha);
234 _mesa_error(ctx, GL_OUT_OF_MEMORY, "glShaderSourceARB");
235 return;
236 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000237
Brian Paule71e4c92006-11-02 16:09:10 +0000238 for (i = 0; i < count; i++) {
239 GLint start = (i > 0) ? offsets[i - 1] : 0;
240 _mesa_memcpy(source + start, string[i],
241 (offsets[i] - start) * sizeof(GLcharARB));
242 }
243 source[offsets[count - 1]] = '\0';
Michal Krol1d7f7192005-03-25 12:12:50 +0000244
Brian Paule71e4c92006-11-02 16:09:10 +0000245 (**sha).SetSource(sha, source, offsets, count);
246 RELEASE_SHADER(sha);
Michal Krolc1fe4692004-10-27 17:09:10 +0000247}
248
Brian Paule71e4c92006-11-02 16:09:10 +0000249GLvoid GLAPIENTRY
250_mesa_CompileShaderARB(GLhandleARB shaderObj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000251{
Brian Paule71e4c92006-11-02 16:09:10 +0000252 GET_CURRENT_CONTEXT(ctx);
253 GET_SHADER(sha, shaderObj, "glCompileShaderARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000254
Brian Paule71e4c92006-11-02 16:09:10 +0000255 if (sha != NULL) {
256 (**sha).Compile(sha);
257 RELEASE_SHADER(sha);
258 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000259}
260
261GLhandleARB GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000262_mesa_CreateProgramObjectARB(GLvoid)
Michal Krolc1fe4692004-10-27 17:09:10 +0000263{
Brian Paule71e4c92006-11-02 16:09:10 +0000264 return _mesa_3dlabs_create_program_object();
Michal Krolc1fe4692004-10-27 17:09:10 +0000265}
266
Michal Krol9ac96052006-02-27 14:41:41 +0000267GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000268_mesa_AttachObjectARB(GLhandleARB containerObj, GLhandleARB obj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000269{
Brian Paule71e4c92006-11-02 16:09:10 +0000270 GET_CURRENT_CONTEXT(ctx);
271 GET_CONTAINER(con, containerObj, "glAttachObjectARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000272
Brian Paule71e4c92006-11-02 16:09:10 +0000273 if (con != NULL) {
274 GET_GENERIC(att, obj, "glAttachObjectARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000275
Brian Paule71e4c92006-11-02 16:09:10 +0000276 if (att != NULL) {
277 (**con).Attach(con, att);
278 RELEASE_GENERIC(att);
279 }
280 RELEASE_CONTAINER(con);
281 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000282}
283
Michal Krol9ac96052006-02-27 14:41:41 +0000284GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000285_mesa_LinkProgramARB(GLhandleARB programObj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000286{
Brian Paule71e4c92006-11-02 16:09:10 +0000287 GET_CURRENT_CONTEXT(ctx);
288 GET_PROGRAM(pro, programObj, "glLinkProgramARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000289
Brian Paule71e4c92006-11-02 16:09:10 +0000290 if (pro != NULL) {
291 (**pro).Link(pro);
292 if (pro == ctx->ShaderObjects.CurrentProgram) {
293 if ((**pro).GetLinkStatus(pro))
294 _mesa_UseProgramObjectARB(programObj);
295 else
296 _mesa_UseProgramObjectARB(0);
297 }
298 RELEASE_PROGRAM(pro);
299 }
Brianfe1d01c2006-12-13 14:54:47 -0700300#if NEW_SLANG
301 {
302 struct gl_linked_program *linked
303 = _mesa_lookup_linked_program(ctx, programObj);
304 _slang_link2(ctx, programObj, linked);
305 }
306#endif
Michal Krolc1fe4692004-10-27 17:09:10 +0000307}
308
Michal Krol9ac96052006-02-27 14:41:41 +0000309GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000310_mesa_UseProgramObjectARB(GLhandleARB programObj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000311{
Brian Paule71e4c92006-11-02 16:09:10 +0000312 GET_CURRENT_CONTEXT(ctx);
Michal Krola1a02e62006-05-16 09:40:30 +0000313 struct gl2_program_intf **program = NULL;
Michal Krol9ac96052006-02-27 14:41:41 +0000314
Brian Paule71e4c92006-11-02 16:09:10 +0000315 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000316
Brian Paule71e4c92006-11-02 16:09:10 +0000317 if (programObj != 0) {
Brian Paul82a9ba92006-11-15 21:38:26 +0000318 GET_PROGRAM(pro, programObj, "glUseProgramObjectARB(program)");
Michal Krol1d7f7192005-03-25 12:12:50 +0000319
Brian Paule71e4c92006-11-02 16:09:10 +0000320 if (pro == NULL)
321 return;
Michal Krol1d7f7192005-03-25 12:12:50 +0000322
Brian Paule71e4c92006-11-02 16:09:10 +0000323 if ((**pro).GetLinkStatus(pro) == GL_FALSE) {
324 RELEASE_PROGRAM(pro);
Brian Paul82a9ba92006-11-15 21:38:26 +0000325 _mesa_error(ctx, GL_INVALID_OPERATION, "glUseProgramObjectARB(not linked)");
Brian Paule71e4c92006-11-02 16:09:10 +0000326 return;
327 }
Michal Krol9ac96052006-02-27 14:41:41 +0000328
Brian Paule71e4c92006-11-02 16:09:10 +0000329 program = pro;
Brian Paul93269622006-04-14 03:43:39 +0000330
Brian Paule71e4c92006-11-02 16:09:10 +0000331 ctx->ShaderObjects._VertexShaderPresent =
332 (**pro).IsShaderPresent(pro, GL_VERTEX_SHADER_ARB);
333 ctx->ShaderObjects._FragmentShaderPresent =
334 (**pro).IsShaderPresent(pro, GL_FRAGMENT_SHADER_ARB);
335 }
336 else {
337 ctx->ShaderObjects._VertexShaderPresent = GL_FALSE;
338 ctx->ShaderObjects._FragmentShaderPresent = GL_FALSE;
339 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000340
Brian Paule71e4c92006-11-02 16:09:10 +0000341 if (ctx->ShaderObjects.CurrentProgram != NULL)
342 RELEASE_PROGRAM(ctx->ShaderObjects.CurrentProgram);
343 ctx->ShaderObjects.CurrentProgram = program;
Brianfe1d01c2006-12-13 14:54:47 -0700344
345#if NEW_SLANG
346 if (programObj) {
347 ctx->ShaderObjects.Linked = _mesa_lookup_linked_program(ctx, programObj);
348 }
349 else {
350 ctx->ShaderObjects.Linked = NULL;
351 }
352#endif
Michal Krolc1fe4692004-10-27 17:09:10 +0000353}
354
Michal Krol9ac96052006-02-27 14:41:41 +0000355GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000356_mesa_ValidateProgramARB(GLhandleARB programObj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000357{
Brian Paule71e4c92006-11-02 16:09:10 +0000358 GET_CURRENT_CONTEXT(ctx);
359 GET_PROGRAM(pro, programObj, "glValidateProgramARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000360
Brian Paule71e4c92006-11-02 16:09:10 +0000361 if (pro != NULL) {
362 (**pro).Validate(pro);
363 RELEASE_PROGRAM(pro);
364 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000365}
366
Brian Paul2659ee92006-11-03 21:30:16 +0000367
368/**
369 * Helper function for all the _mesa_Uniform*() functions below.
370 */
371static INLINE void
372uniform(GLint location, GLsizei count, const GLvoid *values, GLenum type,
373 const char *caller)
Michal Krol9ac96052006-02-27 14:41:41 +0000374{
Brian Paule71e4c92006-11-02 16:09:10 +0000375 GET_CURRENT_CONTEXT(ctx);
Brian Paul2659ee92006-11-03 21:30:16 +0000376 GET_CURRENT_LINKED_PROGRAM(pro, caller);
Brian Paul93269622006-04-14 03:43:39 +0000377
Brian Paule71e4c92006-11-02 16:09:10 +0000378 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol9ac96052006-02-27 14:41:41 +0000379
Brianfe1d01c2006-12-13 14:54:47 -0700380#if NEW_SLANG
381 if (ctx->ShaderObjects.Linked) {
382 struct gl_linked_program *linked = ctx->ShaderObjects.Linked;
383 if (location >= 0 && location < linked->NumUniforms) {
384 GLfloat *v = linked->Uniforms[location].Value;
385 const GLfloat *fValues = (const GLfloat *) values; /* XXX */
386 GLint i;
387 if (type == GL_FLOAT_VEC4)
388 count *= 4;
389 else if (type == GL_FLOAT_VEC3)
390 count *= 3;
391 else
392 abort();
393
394 for (i = 0; i < count; i++)
395 v[i] = fValues[i];
396 return;
397 }
398 }
399#endif
400
Brian Paul2659ee92006-11-03 21:30:16 +0000401 if (!(**pro).WriteUniform(pro, location, count, values, type))
402 _mesa_error(ctx, GL_INVALID_OPERATION, caller);
403}
404
405
406GLvoid GLAPIENTRY
407_mesa_Uniform1fARB(GLint location, GLfloat v0)
408{
409 uniform(location, 1, &v0, GL_FLOAT, "glUniform1fARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000410}
411
Michal Krol9ac96052006-02-27 14:41:41 +0000412GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000413_mesa_Uniform2fARB(GLint location, GLfloat v0, GLfloat v1)
Michal Krol1d7f7192005-03-25 12:12:50 +0000414{
Brian Paul2659ee92006-11-03 21:30:16 +0000415 GLfloat v[2];
416 v[0] = v0;
417 v[1] = v1;
418 uniform(location, 1, v, GL_FLOAT_VEC2, "glUniform2fARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000419}
420
Michal Krol9ac96052006-02-27 14:41:41 +0000421GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000422_mesa_Uniform3fARB(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
Michal Krol1d7f7192005-03-25 12:12:50 +0000423{
Brian Paul2659ee92006-11-03 21:30:16 +0000424 GLfloat v[3];
425 v[0] = v0;
426 v[1] = v1;
427 v[2] = v2;
428 uniform(location, 1, v, GL_FLOAT_VEC3, "glUniform3fARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000429}
430
Michal Krol9ac96052006-02-27 14:41:41 +0000431GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000432_mesa_Uniform4fARB(GLint location, GLfloat v0, GLfloat v1, GLfloat v2,
433 GLfloat v3)
Michal Krol1d7f7192005-03-25 12:12:50 +0000434{
Brian Paul2659ee92006-11-03 21:30:16 +0000435 GLfloat v[4];
436 v[0] = v0;
437 v[1] = v1;
438 v[2] = v2;
439 v[3] = v3;
440 uniform(location, 1, v, GL_FLOAT_VEC4, "glUniform4fARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000441}
442
Michal Krol9ac96052006-02-27 14:41:41 +0000443GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000444_mesa_Uniform1iARB(GLint location, GLint v0)
Michal Krol1d7f7192005-03-25 12:12:50 +0000445{
Brian Paul2659ee92006-11-03 21:30:16 +0000446 uniform(location, 1, &v0, GL_INT, "glUniform1iARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000447}
448
Michal Krol9ac96052006-02-27 14:41:41 +0000449GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000450_mesa_Uniform2iARB(GLint location, GLint v0, GLint v1)
Michal Krol1d7f7192005-03-25 12:12:50 +0000451{
Brian Paul2659ee92006-11-03 21:30:16 +0000452 GLint v[2];
453 v[0] = v0;
454 v[1] = v1;
455 uniform(location, 1, v, GL_INT_VEC2, "glUniform2iARB");
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_Uniform3iARB(GLint location, GLint v0, GLint v1, GLint v2)
Michal Krol1d7f7192005-03-25 12:12:50 +0000460{
Brian Paul2659ee92006-11-03 21:30:16 +0000461 GLint v[3];
462 v[0] = v0;
463 v[1] = v1;
464 v[2] = v2;
465 uniform(location, 1, v, GL_INT_VEC3, "glUniform3iARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000466}
467
Michal Krol9ac96052006-02-27 14:41:41 +0000468GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000469_mesa_Uniform4iARB(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
Michal Krol1d7f7192005-03-25 12:12:50 +0000470{
Brian Paul2659ee92006-11-03 21:30:16 +0000471 GLint v[4];
472 v[0] = v0;
473 v[1] = v1;
474 v[2] = v2;
475 v[3] = v3;
476 uniform(location, 1, v, GL_INT_VEC4, "glUniform4iARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000477}
478
Michal Krol9ac96052006-02-27 14:41:41 +0000479GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000480_mesa_Uniform1fvARB(GLint location, GLsizei count, const GLfloat * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000481{
Brian Paul2659ee92006-11-03 21:30:16 +0000482 uniform(location, count, value, GL_FLOAT, "glUniform1fvARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000483}
484
Michal Krol9ac96052006-02-27 14:41:41 +0000485GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000486_mesa_Uniform2fvARB(GLint location, GLsizei count, const GLfloat * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000487{
Brian Paul2659ee92006-11-03 21:30:16 +0000488 uniform(location, count, value, GL_FLOAT_VEC2, "glUniform2fvARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000489}
490
Michal Krol9ac96052006-02-27 14:41:41 +0000491GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000492_mesa_Uniform3fvARB(GLint location, GLsizei count, const GLfloat * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000493{
Brian Paul2659ee92006-11-03 21:30:16 +0000494 uniform(location, count, value, GL_FLOAT_VEC3, "glUniform3fvARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000495}
496
Michal Krol9ac96052006-02-27 14:41:41 +0000497GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000498_mesa_Uniform4fvARB(GLint location, GLsizei count, const GLfloat * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000499{
Brian Paul2659ee92006-11-03 21:30:16 +0000500 uniform(location, count, value, GL_FLOAT_VEC4, "glUniform4fvARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000501}
502
Michal Krol9ac96052006-02-27 14:41:41 +0000503GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000504_mesa_Uniform1ivARB(GLint location, GLsizei count, const GLint * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000505{
Brian Paul2659ee92006-11-03 21:30:16 +0000506 uniform(location, count, value, GL_INT, "glUniform1ivARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000507}
508
Michal Krol9ac96052006-02-27 14:41:41 +0000509GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000510_mesa_Uniform2ivARB(GLint location, GLsizei count, const GLint * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000511{
Brian Paul2659ee92006-11-03 21:30:16 +0000512 uniform(location, count, value, GL_INT_VEC2, "glUniform2ivARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000513}
514
Michal Krol9ac96052006-02-27 14:41:41 +0000515GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000516_mesa_Uniform3ivARB(GLint location, GLsizei count, const GLint * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000517{
Brian Paul2659ee92006-11-03 21:30:16 +0000518 uniform(location, count, value, GL_INT_VEC3, "glUniform3ivARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000519}
520
Michal Krol9ac96052006-02-27 14:41:41 +0000521GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000522_mesa_Uniform4ivARB(GLint location, GLsizei count, const GLint * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000523{
Brian Paul2659ee92006-11-03 21:30:16 +0000524 uniform(location, count, value, GL_INT_VEC4, "glUniform4ivARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000525}
526
Brian Paul93269622006-04-14 03:43:39 +0000527
Brian Paulbdb251b2006-11-03 17:29:31 +0000528/**
529 * Helper function used by UniformMatrix**vARB() functions below.
530 */
531static void
532uniform_matrix(GLint cols, GLint rows, const char *caller,
533 GLenum matrixType,
534 GLint location, GLsizei count, GLboolean transpose,
535 const GLfloat *values)
536{
537 const GLint matElements = rows * cols;
538 GET_CURRENT_CONTEXT(ctx);
539 GET_CURRENT_LINKED_PROGRAM(pro, caller);
540
541 if (values == NULL) {
542 _mesa_error(ctx, GL_INVALID_VALUE, caller);
Brian Paule71e4c92006-11-02 16:09:10 +0000543 return;
544 }
Michal Krold55de652006-04-18 10:30:29 +0000545
Brian Paule71e4c92006-11-02 16:09:10 +0000546 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000547
Brian Paulbdb251b2006-11-03 17:29:31 +0000548 if (transpose) {
549 GLfloat *trans, *pt;
550 const GLfloat *pv;
551 GLint i, j, k;
552
553 trans = (GLfloat *) _mesa_malloc(count * matElements * sizeof(GLfloat));
554 if (!trans) {
555 _mesa_error(ctx, GL_OUT_OF_MEMORY, caller);
556 return;
Brian Paule71e4c92006-11-02 16:09:10 +0000557 }
Brian Paulbdb251b2006-11-03 17:29:31 +0000558
559 pt = trans;
560 pv = values;
561 for (i = 0; i < count; i++) {
562 /* transpose from pv matrix into pt matrix */
563 for (j = 0; j < cols; j++) {
564 for (k = 0; k < rows; k++) {
565 /* XXX verify this */
566 pt[j * rows + k] = pv[k * cols + j];
567 }
568 }
569 pt += matElements;
570 pv += matElements;
Brian Paule71e4c92006-11-02 16:09:10 +0000571 }
Brian Paulbdb251b2006-11-03 17:29:31 +0000572
573 if (!(**pro).WriteUniform(pro, location, count, trans, matrixType))
574 _mesa_error(ctx, GL_INVALID_OPERATION, caller);
575 _mesa_free(trans);
Brian Paule71e4c92006-11-02 16:09:10 +0000576 }
Brian Paulbdb251b2006-11-03 17:29:31 +0000577 else {
578 if (!(**pro).WriteUniform(pro, location, count, values, matrixType))
579 _mesa_error(ctx, GL_INVALID_OPERATION, caller);
580 }
581}
582
583
584GLvoid GLAPIENTRY
585_mesa_UniformMatrix2fvARB(GLint location, GLsizei count, GLboolean transpose,
586 const GLfloat * value)
587{
588 uniform_matrix(2, 2, "glUniformMatrix2fvARB", GL_FLOAT_MAT2,
589 location, count, transpose, value);
Michal Krolc1fe4692004-10-27 17:09:10 +0000590}
591
Michal Krol9ac96052006-02-27 14:41:41 +0000592GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000593_mesa_UniformMatrix3fvARB(GLint location, GLsizei count, GLboolean transpose,
594 const GLfloat * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000595{
Brian Paulbdb251b2006-11-03 17:29:31 +0000596 uniform_matrix(3, 3, "glUniformMatrix3fvARB", GL_FLOAT_MAT3,
597 location, count, transpose, value);
Michal Krolc1fe4692004-10-27 17:09:10 +0000598}
599
Michal Krol9ac96052006-02-27 14:41:41 +0000600GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000601_mesa_UniformMatrix4fvARB(GLint location, GLsizei count, GLboolean transpose,
602 const GLfloat * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000603{
Brian Paulbdb251b2006-11-03 17:29:31 +0000604 uniform_matrix(4, 4, "glUniformMatrix4fvARB", GL_FLOAT_MAT4,
605 location, count, transpose, value);
Michal Krol1d7f7192005-03-25 12:12:50 +0000606}
607
608static GLboolean
Brian Paule71e4c92006-11-02 16:09:10 +0000609_mesa_get_object_parameter(GLhandleARB obj, GLenum pname, GLvoid * params,
610 GLboolean * integral, GLint * size)
Michal Krol1d7f7192005-03-25 12:12:50 +0000611{
Brian Paule71e4c92006-11-02 16:09:10 +0000612 GET_CURRENT_CONTEXT(ctx);
613 GLint *ipar = (GLint *) params;
Michal Krol1d7f7192005-03-25 12:12:50 +0000614
Brian Paule71e4c92006-11-02 16:09:10 +0000615 /* set default values */
Brian Paulbdb251b2006-11-03 17:29:31 +0000616 *integral = GL_TRUE; /* indicates param type, TRUE: GLint, FALSE: GLfloat */
617 *size = 1; /* param array size */
Michal Krol1d7f7192005-03-25 12:12:50 +0000618
Brian Paule71e4c92006-11-02 16:09:10 +0000619 switch (pname) {
620 case GL_OBJECT_TYPE_ARB:
621 case GL_OBJECT_DELETE_STATUS_ARB:
622 case GL_OBJECT_INFO_LOG_LENGTH_ARB:
623 {
624 GET_GENERIC(gen, obj, "glGetObjectParameterivARB");
Michal Krol9ac96052006-02-27 14:41:41 +0000625
Brian Paule71e4c92006-11-02 16:09:10 +0000626 if (gen == NULL)
627 return GL_FALSE;
Michal Krol9ac96052006-02-27 14:41:41 +0000628
Brian Paule71e4c92006-11-02 16:09:10 +0000629 switch (pname) {
630 case GL_OBJECT_TYPE_ARB:
631 *ipar = (**gen).GetType(gen);
632 break;
633 case GL_OBJECT_DELETE_STATUS_ARB:
634 *ipar = (**gen).GetDeleteStatus(gen);
635 break;
Michal Krola1a02e62006-05-16 09:40:30 +0000636 case GL_OBJECT_INFO_LOG_LENGTH_ARB:
Brian Paule71e4c92006-11-02 16:09:10 +0000637 *ipar = (**gen).GetInfoLogLength(gen);
Michal Krola1a02e62006-05-16 09:40:30 +0000638 break;
Brian Paule71e4c92006-11-02 16:09:10 +0000639 }
Michal Krol9ac96052006-02-27 14:41:41 +0000640
Brian Paule71e4c92006-11-02 16:09:10 +0000641 RELEASE_GENERIC(gen);
642 }
643 break;
644 case GL_OBJECT_SUBTYPE_ARB:
645 case GL_OBJECT_COMPILE_STATUS_ARB:
646 case GL_OBJECT_SHADER_SOURCE_LENGTH_ARB:
647 {
648 GET_SHADER(sha, obj, "glGetObjectParameterivARB");
Michal Krol9ac96052006-02-27 14:41:41 +0000649
Brian Paule71e4c92006-11-02 16:09:10 +0000650 if (sha == NULL)
651 return GL_FALSE;
Michal Krol9ac96052006-02-27 14:41:41 +0000652
Brian Paule71e4c92006-11-02 16:09:10 +0000653 switch (pname) {
654 case GL_OBJECT_SUBTYPE_ARB:
655 *ipar = (**sha).GetSubType(sha);
656 break;
657 case GL_OBJECT_COMPILE_STATUS_ARB:
658 *ipar = (**sha).GetCompileStatus(sha);
659 break;
660 case GL_OBJECT_SHADER_SOURCE_LENGTH_ARB:
661 {
662 const GLcharARB *src = (**sha).GetSource(sha);
Brian Paule71e4c92006-11-02 16:09:10 +0000663 if (src == NULL)
664 *ipar = 0;
665 else
666 *ipar = _mesa_strlen(src) + 1;
667 }
668 break;
669 }
Michal Krol9ac96052006-02-27 14:41:41 +0000670
Brian Paule71e4c92006-11-02 16:09:10 +0000671 RELEASE_SHADER(sha);
672 }
673 break;
674 case GL_OBJECT_LINK_STATUS_ARB:
675 case GL_OBJECT_VALIDATE_STATUS_ARB:
676 case GL_OBJECT_ATTACHED_OBJECTS_ARB:
677 case GL_OBJECT_ACTIVE_UNIFORMS_ARB:
678 case GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB:
679 {
680 GET_PROGRAM(pro, obj, "glGetObjectParameterivARB");
Michal Krol9ac96052006-02-27 14:41:41 +0000681
Brian Paule71e4c92006-11-02 16:09:10 +0000682 if (pro == NULL)
683 return GL_FALSE;
Michal Krol9ac96052006-02-27 14:41:41 +0000684
Brian Paule71e4c92006-11-02 16:09:10 +0000685 switch (pname) {
686 case GL_OBJECT_LINK_STATUS_ARB:
687 *ipar = (**pro).GetLinkStatus(pro);
688 break;
689 case GL_OBJECT_VALIDATE_STATUS_ARB:
690 *ipar = (**pro).GetValidateStatus(pro);
691 break;
Michal Krola1a02e62006-05-16 09:40:30 +0000692 case GL_OBJECT_ATTACHED_OBJECTS_ARB:
Brian Paule71e4c92006-11-02 16:09:10 +0000693 *ipar =
694 (**pro)._container.
695 GetAttachedCount((struct gl2_container_intf **) (pro));
Michal Krola1a02e62006-05-16 09:40:30 +0000696 break;
Brian Paule71e4c92006-11-02 16:09:10 +0000697 case GL_OBJECT_ACTIVE_UNIFORMS_ARB:
698 *ipar = (**pro).GetActiveUniformCount(pro);
699 break;
700 case GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB:
701 *ipar = (**pro).GetActiveUniformMaxLength(pro);
702 break;
703 case GL_OBJECT_ACTIVE_ATTRIBUTES_ARB:
704 *ipar = (**pro).GetActiveAttribCount(pro);
705 break;
706 case GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB:
707 *ipar = (**pro).GetActiveAttribMaxLength(pro);
708 break;
709 }
Michal Krol9ac96052006-02-27 14:41:41 +0000710
Brian Paule71e4c92006-11-02 16:09:10 +0000711 RELEASE_PROGRAM(pro);
712 }
713 break;
714 default:
715 _mesa_error(ctx, GL_INVALID_ENUM, "glGetObjectParameterivARB");
716 return GL_FALSE;
717 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000718
Brian Paule71e4c92006-11-02 16:09:10 +0000719 return GL_TRUE;
Michal Krol1d7f7192005-03-25 12:12:50 +0000720}
721
Michal Krol9ac96052006-02-27 14:41:41 +0000722GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000723_mesa_GetObjectParameterfvARB(GLhandleARB obj, GLenum pname, GLfloat * params)
Michal Krol1d7f7192005-03-25 12:12:50 +0000724{
Brian Paule71e4c92006-11-02 16:09:10 +0000725 GET_CURRENT_CONTEXT(ctx);
726 GLboolean integral;
727 GLint size;
Michal Krol1d7f7192005-03-25 12:12:50 +0000728
Brian Paule71e4c92006-11-02 16:09:10 +0000729 if (params == NULL) {
730 _mesa_error(ctx, GL_INVALID_VALUE, "glGetObjectParameterfvARB");
731 return;
732 }
Michal Krold55de652006-04-18 10:30:29 +0000733
Brian Paule71e4c92006-11-02 16:09:10 +0000734 assert(sizeof(GLfloat) == sizeof(GLint));
Michal Krol1d7f7192005-03-25 12:12:50 +0000735
Brian Paulbdb251b2006-11-03 17:29:31 +0000736 if (_mesa_get_object_parameter(obj, pname, (GLvoid *) params,
737 &integral, &size)) {
Brian Paule71e4c92006-11-02 16:09:10 +0000738 if (integral) {
739 GLint i;
Brian Paule71e4c92006-11-02 16:09:10 +0000740 for (i = 0; i < size; i++)
741 params[i] = (GLfloat) ((GLint *) params)[i];
742 }
Brian Paulbdb251b2006-11-03 17:29:31 +0000743 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000744}
745
Michal Krol9ac96052006-02-27 14:41:41 +0000746GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000747_mesa_GetObjectParameterivARB(GLhandleARB obj, GLenum pname, GLint * params)
Michal Krol1d7f7192005-03-25 12:12:50 +0000748{
Brian Paule71e4c92006-11-02 16:09:10 +0000749 GET_CURRENT_CONTEXT(ctx);
750 GLboolean integral;
751 GLint size;
Michal Krol1d7f7192005-03-25 12:12:50 +0000752
Brian Paule71e4c92006-11-02 16:09:10 +0000753 if (params == NULL) {
754 _mesa_error(ctx, GL_INVALID_VALUE, "glGetObjectParameterivARB");
755 return;
756 }
Michal Krold55de652006-04-18 10:30:29 +0000757
Brian Paule71e4c92006-11-02 16:09:10 +0000758 assert(sizeof(GLfloat) == sizeof(GLint));
Michal Krol1d7f7192005-03-25 12:12:50 +0000759
Brian Paulbdb251b2006-11-03 17:29:31 +0000760 if (_mesa_get_object_parameter(obj, pname, (GLvoid *) params,
761 &integral, &size)) {
Brian Paule71e4c92006-11-02 16:09:10 +0000762 if (!integral) {
763 GLint i;
Brian Paule71e4c92006-11-02 16:09:10 +0000764 for (i = 0; i < size; i++)
765 params[i] = (GLint) ((GLfloat *) params)[i];
766 }
Brian Paulbdb251b2006-11-03 17:29:31 +0000767 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000768}
769
Brian Paul93269622006-04-14 03:43:39 +0000770
771/**
772 * Copy string from <src> to <dst>, up to maxLength characters, returning
773 * length of <dst> in <length>.
774 * \param src the strings source
775 * \param maxLength max chars to copy
776 * \param length returns numberof chars copied
777 * \param dst the string destination
778 */
Michal Krol9ac96052006-02-27 14:41:41 +0000779static GLvoid
Brian Paule71e4c92006-11-02 16:09:10 +0000780copy_string(const GLcharARB * src, GLsizei maxLength, GLsizei * length,
781 GLcharARB * dst)
Michal Krol1d7f7192005-03-25 12:12:50 +0000782{
Brian Paule71e4c92006-11-02 16:09:10 +0000783 GLsizei len;
784 for (len = 0; len < maxLength - 1 && src && src[len]; len++)
785 dst[len] = src[len];
786 if (maxLength > 0)
787 dst[len] = 0;
788 if (length)
789 *length = len;
Michal Krolc1fe4692004-10-27 17:09:10 +0000790}
791
Brian Paul93269622006-04-14 03:43:39 +0000792
Michal Krol9ac96052006-02-27 14:41:41 +0000793GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000794_mesa_GetInfoLogARB(GLhandleARB obj, GLsizei maxLength, GLsizei * length,
795 GLcharARB * infoLog)
Michal Krol1d7f7192005-03-25 12:12:50 +0000796{
Brian Paule71e4c92006-11-02 16:09:10 +0000797 GET_CURRENT_CONTEXT(ctx);
798 GET_GENERIC(gen, obj, "glGetInfoLogARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000799
Brian Paule71e4c92006-11-02 16:09:10 +0000800 if (gen == NULL)
801 return;
Michal Krold55de652006-04-18 10:30:29 +0000802
Brian Paule71e4c92006-11-02 16:09:10 +0000803 if (infoLog == NULL)
804 _mesa_error(ctx, GL_INVALID_VALUE, "glGetInfoLogARB");
Michal Krola1a02e62006-05-16 09:40:30 +0000805 else {
Brian Paule71e4c92006-11-02 16:09:10 +0000806 GLsizei actualsize = (**gen).GetInfoLogLength(gen);
Michal Krola1a02e62006-05-16 09:40:30 +0000807 if (actualsize > maxLength)
808 actualsize = maxLength;
Brian Paule71e4c92006-11-02 16:09:10 +0000809 (**gen).GetInfoLog(gen, actualsize, infoLog);
Michal Krola1a02e62006-05-16 09:40:30 +0000810 if (length != NULL)
811 *length = (actualsize > 0) ? actualsize - 1 : 0;
812 }
Brian Paule71e4c92006-11-02 16:09:10 +0000813 RELEASE_GENERIC(gen);
Michal Krol1d7f7192005-03-25 12:12:50 +0000814}
815
Michal Krol9ac96052006-02-27 14:41:41 +0000816GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000817_mesa_GetAttachedObjectsARB(GLhandleARB containerObj, GLsizei maxCount,
818 GLsizei * count, GLhandleARB * obj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000819{
Brian Paule71e4c92006-11-02 16:09:10 +0000820 GET_CURRENT_CONTEXT(ctx);
821 GET_CONTAINER(con, containerObj, "glGetAttachedObjectsARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000822
Brian Paule71e4c92006-11-02 16:09:10 +0000823 if (con == NULL)
824 return;
Michal Krold55de652006-04-18 10:30:29 +0000825
Brian Paule71e4c92006-11-02 16:09:10 +0000826 if (obj == NULL)
827 _mesa_error(ctx, GL_INVALID_VALUE, "glGetAttachedObjectsARB");
828 else {
829 GLsizei cnt, i;
Michal Krold55de652006-04-18 10:30:29 +0000830
Brian Paule71e4c92006-11-02 16:09:10 +0000831 cnt = (**con).GetAttachedCount(con);
832 if (cnt > maxCount)
833 cnt = maxCount;
834 if (count != NULL)
835 *count = cnt;
Michal Krol9ac96052006-02-27 14:41:41 +0000836
Brian Paule71e4c92006-11-02 16:09:10 +0000837 for (i = 0; i < cnt; i++) {
838 struct gl2_generic_intf **x = (**con).GetAttached(con, i);
839 obj[i] = (**x).GetName(x);
840 RELEASE_GENERIC(x);
841 }
842 }
843 RELEASE_CONTAINER(con);
Michal Krol9ac96052006-02-27 14:41:41 +0000844}
Michal Krolc1fe4692004-10-27 17:09:10 +0000845
846GLint GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000847_mesa_GetUniformLocationARB(GLhandleARB programObj, const GLcharARB * name)
Michal Krol1d7f7192005-03-25 12:12:50 +0000848{
Brianfe1d01c2006-12-13 14:54:47 -0700849#if NEW_SLANG
850 GET_CURRENT_CONTEXT(ctx);
851
852 if (ctx->ShaderObjects.Linked) {
853 struct gl_linked_program *linked = ctx->ShaderObjects.Linked;
854 GLuint loc;
855 for (loc = 0; loc < linked->NumUniforms; loc++) {
856 if (!strcmp(linked->Uniforms[loc].Name, name)) {
857 return loc;
858 }
859 }
860 }
861 return -1;
862#else
Brian Paule71e4c92006-11-02 16:09:10 +0000863 GET_CURRENT_CONTEXT(ctx);
864 GLint loc = -1;
865 GET_LINKED_PROGRAM(pro, programObj, "glGetUniformLocationARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000866
Brian Paul7e6701c2006-11-03 21:51:58 +0000867 if (!pro)
Brian Paule71e4c92006-11-02 16:09:10 +0000868 return -1;
Michal Krold55de652006-04-18 10:30:29 +0000869
Brian Paule71e4c92006-11-02 16:09:10 +0000870 if (name == NULL)
871 _mesa_error(ctx, GL_INVALID_VALUE, "glGetUniformLocationARB");
872 else {
873 if (!IS_NAME_WITH_GL_PREFIX(name))
874 loc = (**pro).GetUniformLocation(pro, name);
875 }
876 RELEASE_PROGRAM(pro);
877 return loc;
Brianfe1d01c2006-12-13 14:54:47 -0700878#endif
Michal Krolc1fe4692004-10-27 17:09:10 +0000879}
880
Michal Krol9ac96052006-02-27 14:41:41 +0000881GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000882_mesa_GetActiveUniformARB(GLhandleARB programObj, GLuint index,
883 GLsizei maxLength, GLsizei * length, GLint * size,
884 GLenum * type, GLcharARB * name)
Michal Krol1d7f7192005-03-25 12:12:50 +0000885{
Brian Paule71e4c92006-11-02 16:09:10 +0000886 GET_CURRENT_CONTEXT(ctx);
887 GET_PROGRAM(pro, programObj, "glGetActiveUniformARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000888
Brian Paule71e4c92006-11-02 16:09:10 +0000889 if (pro == NULL)
890 return;
Michal Krold55de652006-04-18 10:30:29 +0000891
Brian Paule71e4c92006-11-02 16:09:10 +0000892 if (size == NULL || type == NULL || name == NULL)
893 _mesa_error(ctx, GL_INVALID_VALUE, "glGetActiveUniformARB");
894 else {
895 if (index < (**pro).GetActiveUniformCount(pro))
896 (**pro).GetActiveUniform(pro, index, maxLength, length, size, type,
897 name);
898 else
899 _mesa_error(ctx, GL_INVALID_VALUE, "glGetActiveUniformARB");
900 }
901 RELEASE_PROGRAM(pro);
Michal Krolc1fe4692004-10-27 17:09:10 +0000902}
903
Michal Krol9ac96052006-02-27 14:41:41 +0000904GLvoid GLAPIENTRY
Brian Paulbdb251b2006-11-03 17:29:31 +0000905_mesa_GetUniformfvARB(GLhandleARB programObj, GLint location, GLfloat * params)
Michal Krol1d7f7192005-03-25 12:12:50 +0000906{
Brian Paule71e4c92006-11-02 16:09:10 +0000907 GET_CURRENT_CONTEXT(ctx);
908 GET_LINKED_PROGRAM(pro, programObj, "glGetUniformfvARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000909
Brian Paul7e6701c2006-11-03 21:51:58 +0000910 if (!pro)
911 return;
912
913 if (!(**pro).ReadUniform(pro, location, 1, params, GL_FLOAT))
914 _mesa_error(ctx, GL_INVALID_OPERATION, "glGetUniformfvARB");
915
916 RELEASE_PROGRAM(pro);
Michal Krolc1fe4692004-10-27 17:09:10 +0000917}
918
Michal Krol9ac96052006-02-27 14:41:41 +0000919GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000920_mesa_GetUniformivARB(GLhandleARB programObj, GLint location, GLint * params)
Michal Krol1d7f7192005-03-25 12:12:50 +0000921{
Brian Paule71e4c92006-11-02 16:09:10 +0000922 GET_CURRENT_CONTEXT(ctx);
923 GET_LINKED_PROGRAM(pro, programObj, "glGetUniformivARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000924
Brian Paul7e6701c2006-11-03 21:51:58 +0000925 if (!pro)
926 return;
927
928 if (!(**pro).ReadUniform(pro, location, 1, params, GL_INT))
929 _mesa_error(ctx, GL_INVALID_OPERATION, "glGetUniformivARB");
930 RELEASE_PROGRAM(pro);
Michal Krolc1fe4692004-10-27 17:09:10 +0000931}
932
Michal Krol9ac96052006-02-27 14:41:41 +0000933GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000934_mesa_GetShaderSourceARB(GLhandleARB obj, GLsizei maxLength, GLsizei * length,
935 GLcharARB * source)
Michal Krol1d7f7192005-03-25 12:12:50 +0000936{
Brian Paule71e4c92006-11-02 16:09:10 +0000937 GET_CURRENT_CONTEXT(ctx);
938 GET_SHADER(sha, obj, "glGetShaderSourceARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000939
Brian Paule71e4c92006-11-02 16:09:10 +0000940 if (sha == NULL)
941 return;
Michal Krold55de652006-04-18 10:30:29 +0000942
Brian Paule71e4c92006-11-02 16:09:10 +0000943 if (source == NULL)
944 _mesa_error(ctx, GL_INVALID_VALUE, "glGetShaderSourceARB");
945 else
946 copy_string((**sha).GetSource(sha), maxLength, length, source);
947 RELEASE_SHADER(sha);
Michal Krolc1fe4692004-10-27 17:09:10 +0000948}
949
950/* GL_ARB_vertex_shader */
951
Michal Krol9ac96052006-02-27 14:41:41 +0000952GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000953_mesa_BindAttribLocationARB(GLhandleARB programObj, GLuint index,
954 const GLcharARB * name)
Michal Krol1d7f7192005-03-25 12:12:50 +0000955{
Brian Paule71e4c92006-11-02 16:09:10 +0000956 GET_CURRENT_CONTEXT(ctx);
957 GET_PROGRAM(pro, programObj, "glBindAttribLocationARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000958
Brian Paule71e4c92006-11-02 16:09:10 +0000959 if (pro == NULL)
960 return;
Michal Krold55de652006-04-18 10:30:29 +0000961
Brian Paule71e4c92006-11-02 16:09:10 +0000962 if (name == NULL || index >= MAX_VERTEX_ATTRIBS)
963 _mesa_error(ctx, GL_INVALID_VALUE, "glBindAttribLocationARB");
964 else if (IS_NAME_WITH_GL_PREFIX(name))
965 _mesa_error(ctx, GL_INVALID_OPERATION, "glBindAttribLocationARB");
966 else
967 (**pro).OverrideAttribBinding(pro, index, name);
968 RELEASE_PROGRAM(pro);
Michal Krolc1fe4692004-10-27 17:09:10 +0000969}
970
Michal Krol9ac96052006-02-27 14:41:41 +0000971GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000972_mesa_GetActiveAttribARB(GLhandleARB programObj, GLuint index,
973 GLsizei maxLength, GLsizei * length, GLint * size,
974 GLenum * type, GLcharARB * name)
Michal Krol1d7f7192005-03-25 12:12:50 +0000975{
Brian Paule71e4c92006-11-02 16:09:10 +0000976 GET_CURRENT_CONTEXT(ctx);
977 GET_PROGRAM(pro, programObj, "glGetActiveAttribARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000978
Brian Paule71e4c92006-11-02 16:09:10 +0000979 if (pro == NULL)
980 return;
Michal Krold55de652006-04-18 10:30:29 +0000981
Brian Paule71e4c92006-11-02 16:09:10 +0000982 if (name == NULL || index >= (**pro).GetActiveAttribCount(pro))
983 _mesa_error(ctx, GL_INVALID_VALUE, "glGetActiveAttribARB");
984 else
985 (**pro).GetActiveAttrib(pro, index, maxLength, length, size, type,
986 name);
987 RELEASE_PROGRAM(pro);
Michal Krolc1fe4692004-10-27 17:09:10 +0000988}
989
990GLint GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000991_mesa_GetAttribLocationARB(GLhandleARB programObj, const GLcharARB * name)
Michal Krol1d7f7192005-03-25 12:12:50 +0000992{
Brian Paule71e4c92006-11-02 16:09:10 +0000993 GET_CURRENT_CONTEXT(ctx);
994 GLint loc = -1;
995 GET_LINKED_PROGRAM(pro, programObj, "glGetAttribLocationARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000996
Brian Paul7e6701c2006-11-03 21:51:58 +0000997 if (!pro)
Brian Paule71e4c92006-11-02 16:09:10 +0000998 return -1;
Michal Krold55de652006-04-18 10:30:29 +0000999
Brian Paule71e4c92006-11-02 16:09:10 +00001000 if (name == NULL)
1001 _mesa_error(ctx, GL_INVALID_VALUE, "glGetAttribLocationARB");
1002 else if (!IS_NAME_WITH_GL_PREFIX(name))
1003 loc = (**pro).GetAttribLocation(pro, name);
1004 RELEASE_PROGRAM(pro);
1005 return loc;
Michal Krolc1fe4692004-10-27 17:09:10 +00001006}
1007
Brian Paulf961d392006-11-02 16:11:31 +00001008
1009/**
1010 ** OpenGL 2.0 functions which basically wrap the ARB_shader functions
1011 **/
1012
1013void GLAPIENTRY
1014_mesa_AttachShader(GLuint program, GLuint shader)
1015{
1016 _mesa_AttachObjectARB(program, shader);
Brianfe1d01c2006-12-13 14:54:47 -07001017#if NEW_SLANG
1018 {
1019 GET_CURRENT_CONTEXT(ctx);
1020 struct gl_linked_program *linked
1021 = _mesa_lookup_linked_program(ctx, program);
1022 struct gl_program *prog
1023 = _mesa_lookup_shader(ctx, shader);
1024 const GLuint n = linked->NumShaders;
1025 GLuint i;
1026 if (!linked || !prog) {
1027 _mesa_error(ctx, GL_INVALID_OPERATION,
1028 "glAttachShader(bad program or shader name)");
1029 return;
1030 }
1031 for (i = 0; i < n; i++) {
1032 if (linked->Shaders[i] == prog) {
1033 /* already attached */
1034 return;
1035 }
1036 }
1037 /* append to list */
1038 linked->Shaders = _mesa_realloc(linked->Shaders,
1039 n * sizeof(struct gl_program *),
1040 (n + 1) * sizeof(struct gl_program *));
1041 linked->Shaders[n] = prog;
1042 prog->RefCount++;
1043 linked->NumShaders++;
1044 }
1045#endif
Brian Paulf961d392006-11-02 16:11:31 +00001046}
1047
1048
1049GLuint GLAPIENTRY
1050_mesa_CreateShader(GLenum type)
1051{
1052 return (GLuint) _mesa_CreateShaderObjectARB(type);
1053}
1054
1055GLuint GLAPIENTRY
1056_mesa_CreateProgram(void)
1057{
1058 return (GLuint) _mesa_CreateProgramObjectARB();
1059}
1060
1061void GLAPIENTRY
1062_mesa_DeleteProgram(GLuint program)
1063{
1064 _mesa_DeleteObjectARB(program);
1065}
1066
1067
1068void GLAPIENTRY
1069_mesa_DeleteShader(GLuint shader)
1070{
1071 _mesa_DeleteObjectARB(shader);
1072}
1073
1074void GLAPIENTRY
1075_mesa_DetachShader(GLuint program, GLuint shader)
1076{
1077 _mesa_DetachObjectARB(program, shader);
1078}
1079
1080void GLAPIENTRY
1081_mesa_GetAttachedShaders(GLuint program, GLsizei maxCount,
1082 GLsizei *count, GLuint *obj)
1083{
1084 _mesa_GetAttachedObjectsARB(program, maxCount, count, obj);
Brianfe1d01c2006-12-13 14:54:47 -07001085#if NEW_SLANG
1086 {
1087 GET_CURRENT_CONTEXT(ctx);
1088 struct gl_linked_program *linked
1089 = _mesa_lookup_linked_program(ctx, program);
1090 if (linked) {
1091 GLuint i;
1092 for (i = 0; i < maxCount && i < linked->NumShaders; i++) {
1093 obj[i] = linked->Shaders[i]->Id;
1094 }
1095 if (count)
1096 *count = i;
1097 }
1098 else {
1099 _mesa_error(ctx, GL_INVALID_OPERATION, "glGetAttachedShaders");
1100 }
1101 }
1102#endif
Brian Paulf961d392006-11-02 16:11:31 +00001103}
1104
1105void GLAPIENTRY
1106_mesa_GetProgramiv(GLuint program, GLenum pname, GLint *params)
1107{
Brian Paul3bef6002006-11-03 22:15:43 +00001108 GET_CURRENT_CONTEXT(ctx);
1109 GET_PROGRAM(pro, program, "glGetProgramiv");
1110
1111 if (!pro)
1112 return;
1113
1114 switch (pname) {
1115 case GL_DELETE_STATUS:
Brian Paul7c279f42006-11-15 21:35:06 +00001116 *params = (**pro)._container._generic.GetDeleteStatus((struct gl2_generic_intf **) pro);
Brian Paul3bef6002006-11-03 22:15:43 +00001117 break;
1118 case GL_LINK_STATUS:
1119 *params = (**pro).GetLinkStatus(pro);
1120 break;
1121 case GL_VALIDATE_STATUS:
1122 *params = (**pro).GetValidateStatus(pro);
1123 break;
1124 case GL_INFO_LOG_LENGTH:
Brian Paul7c279f42006-11-15 21:35:06 +00001125 *params = (**pro)._container._generic.GetInfoLogLength( (struct gl2_generic_intf **) pro );
Brian Paul3bef6002006-11-03 22:15:43 +00001126 break;
1127 case GL_ATTACHED_SHADERS:
Brian Paul7c279f42006-11-15 21:35:06 +00001128 *params = (**pro)._container.GetAttachedCount( (struct gl2_container_intf **) pro );
Brian Paul3bef6002006-11-03 22:15:43 +00001129 break;
1130 case GL_ACTIVE_ATTRIBUTES:
1131 *params = (**pro).GetActiveAttribCount(pro);
1132 break;
1133 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
1134 *params = (**pro).GetActiveAttribMaxLength(pro);
1135 break;
1136 case GL_ACTIVE_UNIFORMS:
1137 *params = (**pro).GetActiveUniformCount(pro);
1138 break;
1139 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
1140 *params = (**pro).GetActiveUniformMaxLength(pro);
1141 break;
1142 default:
1143 _mesa_error(ctx, GL_INVALID_ENUM, "glGetProgramiv(pname)");
1144 return;
1145 }
Brian Paulf961d392006-11-02 16:11:31 +00001146}
1147
1148void GLAPIENTRY
1149_mesa_GetProgramInfoLog(GLuint program, GLsizei bufSize,
1150 GLsizei *length, GLchar *infoLog)
1151{
1152 _mesa_GetInfoLogARB(program, bufSize, length, infoLog);
1153}
1154
1155void GLAPIENTRY
1156_mesa_GetShaderiv(GLuint shader, GLenum pname, GLint *params)
1157{
Brian Pauld2f80772006-11-03 22:23:47 +00001158 GET_CURRENT_CONTEXT(ctx);
1159 GET_SHADER(sh, shader, "glGetShaderiv");
1160
1161 if (!sh)
1162 return;
1163
1164 switch (pname) {
1165 case GL_SHADER_TYPE:
1166 *params = (**sh).GetSubType(sh);
1167 break;
1168 case GL_DELETE_STATUS:
Brian Paul7c279f42006-11-15 21:35:06 +00001169 *params = (**sh)._generic.GetDeleteStatus((struct gl2_generic_intf **) sh);
Brian Pauld2f80772006-11-03 22:23:47 +00001170 break;
1171 case GL_COMPILE_STATUS:
1172 *params = (**sh).GetCompileStatus(sh);
1173 break;
1174 case GL_INFO_LOG_LENGTH:
Brian Paul7c279f42006-11-15 21:35:06 +00001175 *params = (**sh)._generic.GetInfoLogLength((struct gl2_generic_intf **)sh);
Brian Pauld2f80772006-11-03 22:23:47 +00001176 break;
1177 case GL_SHADER_SOURCE_LENGTH:
1178 {
1179 const GLchar *src = (**sh).GetSource(sh);
1180 *params = src ? (_mesa_strlen(src) + 1) : 0;
1181 }
1182 break;
1183 default:
1184 _mesa_error(ctx, GL_INVALID_ENUM, "glGetShaderiv(pname)");
1185 return;
1186 }
Brian Paulf961d392006-11-02 16:11:31 +00001187}
1188
1189void GLAPIENTRY
1190_mesa_GetShaderInfoLog(GLuint shader, GLsizei bufSize,
1191 GLsizei *length, GLchar *infoLog)
1192{
1193 _mesa_GetInfoLogARB(shader, bufSize, length, infoLog);
1194}
1195
1196GLboolean GLAPIENTRY
Brian Paul12fe1b32006-11-02 16:21:04 +00001197_mesa_IsProgram(GLuint program)
Brian Paulf961d392006-11-02 16:11:31 +00001198{
1199 GET_CURRENT_CONTEXT(ctx);
Brian Paulc9365b72006-11-03 23:32:30 +00001200 GET_PROGRAM(pro, program, "glIsProgram");
1201 if (pro) {
1202 RELEASE_PROGRAM(pro);
1203 return GL_TRUE;
1204 }
1205 else {
1206 return GL_FALSE;
1207 }
Brian Paulf961d392006-11-02 16:11:31 +00001208}
1209
1210GLboolean GLAPIENTRY
1211_mesa_IsShader(GLuint shader)
1212{
1213 GET_CURRENT_CONTEXT(ctx);
Brian Paulc9365b72006-11-03 23:32:30 +00001214 GET_SHADER(sh, shader, "glIsProgram");
1215 if (sh) {
1216 RELEASE_SHADER(sh);
1217 return GL_TRUE;
1218 }
1219 else {
1220 return GL_FALSE;
1221 }
Brian Paulf961d392006-11-02 16:11:31 +00001222}
1223
1224
Brian Paulbdb251b2006-11-03 17:29:31 +00001225/**
1226 ** 2.1 functions
1227 **/
1228
1229void GLAPIENTRY
1230_mesa_UniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose,
1231 const GLfloat *value)
1232{
1233 uniform_matrix(2, 3, "glUniformMatrix2x3fv", GL_FLOAT_MAT2x3,
1234 location, count, transpose, value);
1235}
1236
1237void GLAPIENTRY
1238_mesa_UniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose,
1239 const GLfloat *value)
1240{
1241 uniform_matrix(3, 2, "glUniformMatrix3x2fv", GL_FLOAT_MAT3x2,
1242 location, count, transpose, value);
1243}
1244
1245void GLAPIENTRY
1246_mesa_UniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose,
1247 const GLfloat *value)
1248{
1249 uniform_matrix(2, 4, "glUniformMatrix2x4fv", GL_FLOAT_MAT2x4,
1250 location, count, transpose, value);
1251}
1252
1253void GLAPIENTRY
1254_mesa_UniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose,
1255 const GLfloat *value)
1256{
1257 uniform_matrix(4, 2, "glUniformMatrix4x2fv", GL_FLOAT_MAT4x2,
1258 location, count, transpose, value);
1259}
1260
1261void GLAPIENTRY
1262_mesa_UniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose,
1263 const GLfloat *value)
1264{
1265 uniform_matrix(3, 4, "glUniformMatrix3x4fv", GL_FLOAT_MAT3x4,
1266 location, count, transpose, value);
1267}
1268
1269void GLAPIENTRY
1270_mesa_UniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose,
1271 const GLfloat *value)
1272{
1273 uniform_matrix(4, 3, "glUniformMatrix4x3fv", GL_FLOAT_MAT4x3,
1274 location, count, transpose, value);
1275}
1276
1277
1278
Brianfe1d01c2006-12-13 14:54:47 -07001279#ifdef NEW_SLANG
1280
1281struct gl_linked_program *
1282_mesa_new_linked_program(GLcontext *ctx, GLuint name)
1283{
1284 struct gl_linked_program *linked;
1285 linked = CALLOC_STRUCT(gl_linked_program);
1286 linked->Name = name;
1287 return linked;
1288}
Brian Paulbdb251b2006-11-03 17:29:31 +00001289
1290
Brianfe1d01c2006-12-13 14:54:47 -07001291struct gl_linked_program *
1292_mesa_lookup_linked_program(GLcontext *ctx, GLuint name)
1293{
1294 GET_PROGRAM(pro, name, "_mesa_lookup_linked_program");
1295 if (pro) {
1296 if (!(*pro)->Linked) {
1297 (*pro)->Linked = _mesa_new_linked_program(ctx, name);
1298 }
1299 return (*pro)->Linked;
1300 }
1301 return NULL;
1302}
1303
1304
1305struct gl_program *
1306_mesa_lookup_shader(GLcontext *ctx, GLuint name)
1307{
1308 GET_SHADER(sh, name, "_mesa_lookup_shader");
1309 if (sh)
1310 return (*sh)->Program;
1311 return NULL;
1312}
1313
1314
1315#endif /* NEW_SLANG */
1316
1317
1318#endif /* FEATURE_ARB_shader_objects */
1319
1320
Michal Krol365582d2006-08-01 20:07:31 +00001321
Michal Krol9ac96052006-02-27 14:41:41 +00001322GLvoid
Brian Paule71e4c92006-11-02 16:09:10 +00001323_mesa_init_shaderobjects(GLcontext * ctx)
Michal Krol1d7f7192005-03-25 12:12:50 +00001324{
Brian Paule71e4c92006-11-02 16:09:10 +00001325 ctx->ShaderObjects.CurrentProgram = NULL;
1326 ctx->ShaderObjects._FragmentShaderPresent = GL_FALSE;
1327 ctx->ShaderObjects._VertexShaderPresent = GL_FALSE;
Michal Krol1d7f7192005-03-25 12:12:50 +00001328
Brian Paule71e4c92006-11-02 16:09:10 +00001329 _mesa_init_shaderobjects_3dlabs(ctx);
Michal Krolc1fe4692004-10-27 17:09:10 +00001330}