blob: 976fa0aa312647c0b795c33bec70fef690461efd [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"
Briancc0c8b22006-12-14 13:59:25 -070036#include "program.h"
Michal Krol1d7f7192005-03-25 12:12:50 +000037#include "shaderobjects.h"
Michal Krol6324f732005-01-13 14:12:50 +000038#include "shaderobjects_3dlabs.h"
Brianfe1d01c2006-12-13 14:54:47 -070039#include "slang_link.h"
Michal Krol1d7f7192005-03-25 12:12:50 +000040
Briancc0c8b22006-12-14 13:59:25 -070041#define NEW_SLANG 1
Michal Krol1d7f7192005-03-25 12:12:50 +000042
Michal Krol365582d2006-08-01 20:07:31 +000043#if FEATURE_ARB_shader_objects
44
Michal Krol9ac96052006-02-27 14:41:41 +000045#define RELEASE_GENERIC(x)\
Michal Krola1a02e62006-05-16 09:40:30 +000046 (**x)._unknown.Release ((struct gl2_unknown_intf **) (x))
Michal Krol9ac96052006-02-27 14:41:41 +000047
48#define RELEASE_CONTAINER(x)\
Michal Krola1a02e62006-05-16 09:40:30 +000049 (**x)._generic._unknown.Release ((struct gl2_unknown_intf **) (x))
Michal Krol9ac96052006-02-27 14:41:41 +000050
51#define RELEASE_PROGRAM(x)\
Michal Krola1a02e62006-05-16 09:40:30 +000052 (**x)._container._generic._unknown.Release ((struct gl2_unknown_intf **) (x))
Michal Krol9ac96052006-02-27 14:41:41 +000053
54#define RELEASE_SHADER(x)\
Michal Krola1a02e62006-05-16 09:40:30 +000055 (**x)._generic._unknown.Release ((struct gl2_unknown_intf **) (x))
Michal Krol9ac96052006-02-27 14:41:41 +000056
Brian Paulbdb251b2006-11-03 17:29:31 +000057
58
Michal Krola1a02e62006-05-16 09:40:30 +000059static struct gl2_unknown_intf **
Brian Paule71e4c92006-11-02 16:09:10 +000060lookup_handle(GLcontext * ctx, GLhandleARB handle, enum gl2_uiid uiid,
61 const char *function)
Michal Krola1a02e62006-05-16 09:40:30 +000062{
63 struct gl2_unknown_intf **unk;
Michal Krol9ac96052006-02-27 14:41:41 +000064
Michal Krola1a02e62006-05-16 09:40:30 +000065 /*
Brian Paulbdb251b2006-11-03 17:29:31 +000066 * Note: _mesa_HashLookup() requires non-zero input values, so the
67 * passed-in handle value must be checked beforehand.
Michal Krola1a02e62006-05-16 09:40:30 +000068 */
69 if (handle == 0) {
Brian Paule71e4c92006-11-02 16:09:10 +000070 _mesa_error(ctx, GL_INVALID_VALUE, function);
Michal Krola1a02e62006-05-16 09:40:30 +000071 return NULL;
72 }
Brian Paule71e4c92006-11-02 16:09:10 +000073 _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
Brian Paul3bef6002006-11-03 22:15:43 +000074 unk = (struct gl2_unknown_intf **) _mesa_HashLookup(ctx->Shared->GL2Objects,
75 handle);
Brian Paule71e4c92006-11-02 16:09:10 +000076 _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
Brian Paulbdb251b2006-11-03 17:29:31 +000077
78 if (unk == NULL) {
Brian Paule71e4c92006-11-02 16:09:10 +000079 _mesa_error(ctx, GL_INVALID_VALUE, function);
Brian Paulbdb251b2006-11-03 17:29:31 +000080 }
Michal Krola1a02e62006-05-16 09:40:30 +000081 else {
Brian Paule71e4c92006-11-02 16:09:10 +000082 unk = (**unk).QueryInterface(unk, uiid);
Michal Krola1a02e62006-05-16 09:40:30 +000083 if (unk == NULL)
Brian Paule71e4c92006-11-02 16:09:10 +000084 _mesa_error(ctx, GL_INVALID_OPERATION, function);
Michal Krola1a02e62006-05-16 09:40:30 +000085 }
86 return unk;
87}
Michal Krol9ac96052006-02-27 14:41:41 +000088
89#define GET_GENERIC(x, handle, function)\
Michal Krola1a02e62006-05-16 09:40:30 +000090 struct gl2_generic_intf **x = (struct gl2_generic_intf **)\
91 lookup_handle (ctx, handle, UIID_GENERIC, function);
Michal Krol9ac96052006-02-27 14:41:41 +000092
93#define GET_CONTAINER(x, handle, function)\
Michal Krola1a02e62006-05-16 09:40:30 +000094 struct gl2_container_intf **x = (struct gl2_container_intf **)\
95 lookup_handle (ctx, handle, UIID_CONTAINER, function);
Michal Krol9ac96052006-02-27 14:41:41 +000096
97#define GET_PROGRAM(x, handle, function)\
Michal Krola1a02e62006-05-16 09:40:30 +000098 struct gl2_program_intf **x = (struct gl2_program_intf **)\
99 lookup_handle (ctx, handle, UIID_PROGRAM, function);
Michal Krol9ac96052006-02-27 14:41:41 +0000100
101#define GET_SHADER(x, handle, function)\
Michal Krola1a02e62006-05-16 09:40:30 +0000102 struct gl2_shader_intf **x = (struct gl2_shader_intf **)\
103 lookup_handle (ctx, handle, UIID_SHADER, function);
Michal Krol9ac96052006-02-27 14:41:41 +0000104
Brian Paul7e6701c2006-11-03 21:51:58 +0000105
106#define GET_LINKED_PROGRAM(x, handle, function) \
107 GET_PROGRAM(x, handle, function); \
108 if (x && (**x).GetLinkStatus(x) == GL_FALSE) { \
109 RELEASE_PROGRAM(x); \
110 _mesa_error(ctx, GL_INVALID_OPERATION, function); \
111 x = NULL; \
Michal Krola1a02e62006-05-16 09:40:30 +0000112 }
Michal Krol9ac96052006-02-27 14:41:41 +0000113
Brian Paul7e6701c2006-11-03 21:51:58 +0000114#define GET_CURRENT_LINKED_PROGRAM(x, function) \
115 struct gl2_program_intf **x = ctx->ShaderObjects.CurrentProgram; \
116 if (!x || (**x).GetLinkStatus(x) == GL_FALSE) { \
117 _mesa_error(ctx, GL_INVALID_OPERATION, function); \
118 return; \
Michal Krola1a02e62006-05-16 09:40:30 +0000119 }
Michal Krol9ac96052006-02-27 14:41:41 +0000120
Brian Paul7e6701c2006-11-03 21:51:58 +0000121
122
Michal Krold55de652006-04-18 10:30:29 +0000123#define IS_NAME_WITH_GL_PREFIX(x) ((x)[0] == 'g' && (x)[1] == 'l' && (x)[2] == '_')
124
Michal Krol9ac96052006-02-27 14:41:41 +0000125
126GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000127_mesa_DeleteObjectARB(GLhandleARB obj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000128{
Brian Paule71e4c92006-11-02 16:09:10 +0000129 if (obj != 0) {
Michal Krola1a02e62006-05-16 09:40:30 +0000130 GET_CURRENT_CONTEXT(ctx);
131 GET_GENERIC(gen, obj, "glDeleteObjectARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000132
Brian Paule71e4c92006-11-02 16:09:10 +0000133 if (gen != NULL) {
134 (**gen).Delete(gen);
Michal Krola1a02e62006-05-16 09:40:30 +0000135 RELEASE_GENERIC(gen);
136 }
137 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000138}
139
140GLhandleARB GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000141_mesa_GetHandleARB(GLenum pname)
Michal Krol1d7f7192005-03-25 12:12:50 +0000142{
Brian Paule71e4c92006-11-02 16:09:10 +0000143 GET_CURRENT_CONTEXT(ctx);
Michal Krol1d7f7192005-03-25 12:12:50 +0000144
Brian Paule71e4c92006-11-02 16:09:10 +0000145 switch (pname) {
Michal Krola1a02e62006-05-16 09:40:30 +0000146 case GL_PROGRAM_OBJECT_ARB:
147 {
148 struct gl2_program_intf **pro = ctx->ShaderObjects.CurrentProgram;
Michal Krol9ac96052006-02-27 14:41:41 +0000149
Michal Krola1a02e62006-05-16 09:40:30 +0000150 if (pro != NULL)
Brian Paule71e4c92006-11-02 16:09:10 +0000151 return (**pro)._container._generic.
152 GetName((struct gl2_generic_intf **) (pro));
Michal Krola1a02e62006-05-16 09:40:30 +0000153 }
154 break;
Brian Paule71e4c92006-11-02 16:09:10 +0000155 default:
156 _mesa_error(ctx, GL_INVALID_ENUM, "glGetHandleARB");
157 }
Michal Krol6324f732005-01-13 14:12:50 +0000158
Brian Paule71e4c92006-11-02 16:09:10 +0000159 return 0;
Michal Krolc1fe4692004-10-27 17:09:10 +0000160}
161
Michal Krol9ac96052006-02-27 14:41:41 +0000162GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000163_mesa_DetachObjectARB(GLhandleARB containerObj, GLhandleARB attachedObj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000164{
Brian Paule71e4c92006-11-02 16:09:10 +0000165 GET_CURRENT_CONTEXT(ctx);
166 GET_CONTAINER(con, containerObj, "glDetachObjectARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000167
Brian Paule71e4c92006-11-02 16:09:10 +0000168 if (con != NULL) {
169 GET_GENERIC(att, attachedObj, "glDetachObjectARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000170
Brian Paule71e4c92006-11-02 16:09:10 +0000171 if (att != NULL) {
172 (**con).Detach(con, att);
173 RELEASE_GENERIC(att);
174 }
175 RELEASE_CONTAINER(con);
176 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000177}
178
179GLhandleARB GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000180_mesa_CreateShaderObjectARB(GLenum shaderType)
Michal Krol1d7f7192005-03-25 12:12:50 +0000181{
Brian Paule71e4c92006-11-02 16:09:10 +0000182 return _mesa_3dlabs_create_shader_object(shaderType);
Michal Krolc1fe4692004-10-27 17:09:10 +0000183}
184
Michal Krol9ac96052006-02-27 14:41:41 +0000185GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000186_mesa_ShaderSourceARB(GLhandleARB shaderObj, GLsizei count,
187 const GLcharARB ** string, const GLint * length)
Michal Krol1d7f7192005-03-25 12:12:50 +0000188{
Brian Paule71e4c92006-11-02 16:09:10 +0000189 GET_CURRENT_CONTEXT(ctx);
190 GLint *offsets;
191 GLsizei i;
192 GLcharARB *source;
193 GET_SHADER(sha, shaderObj, "glShaderSourceARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000194
Brian Paule71e4c92006-11-02 16:09:10 +0000195 if (sha == NULL)
196 return;
Brian Paul93269622006-04-14 03:43:39 +0000197
Brian Paule71e4c92006-11-02 16:09:10 +0000198 if (string == NULL) {
199 RELEASE_SHADER(sha);
200 _mesa_error(ctx, GL_INVALID_VALUE, "glShaderSourceARB");
201 return;
202 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000203
Brian Paule71e4c92006-11-02 16:09:10 +0000204 /*
Brianfe1d01c2006-12-13 14:54:47 -0700205 * This array holds offsets of where the appropriate string ends, thus the
206 * last element will be set to the total length of the source code.
Brian Paule71e4c92006-11-02 16:09:10 +0000207 */
208 offsets = (GLint *) _mesa_malloc(count * sizeof(GLint));
209 if (offsets == NULL) {
210 RELEASE_SHADER(sha);
211 _mesa_error(ctx, GL_OUT_OF_MEMORY, "glShaderSourceARB");
212 return;
213 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000214
Brian Paule71e4c92006-11-02 16:09:10 +0000215 for (i = 0; i < count; i++) {
216 if (string[i] == NULL) {
217 _mesa_free((GLvoid *) offsets);
218 RELEASE_SHADER(sha);
219 _mesa_error(ctx, GL_INVALID_VALUE, "glShaderSourceARB");
220 return;
221 }
222 if (length == NULL || length[i] < 0)
223 offsets[i] = _mesa_strlen(string[i]);
224 else
225 offsets[i] = length[i];
226 /* accumulate string lengths */
227 if (i > 0)
228 offsets[i] += offsets[i - 1];
229 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000230
Brianfe1d01c2006-12-13 14:54:47 -0700231 source = (GLcharARB *) _mesa_malloc((offsets[count - 1] + 1) *
232 sizeof(GLcharARB));
Brian Paule71e4c92006-11-02 16:09:10 +0000233 if (source == NULL) {
234 _mesa_free((GLvoid *) offsets);
235 RELEASE_SHADER(sha);
236 _mesa_error(ctx, GL_OUT_OF_MEMORY, "glShaderSourceARB");
237 return;
238 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000239
Brian Paule71e4c92006-11-02 16:09:10 +0000240 for (i = 0; i < count; i++) {
241 GLint start = (i > 0) ? offsets[i - 1] : 0;
242 _mesa_memcpy(source + start, string[i],
243 (offsets[i] - start) * sizeof(GLcharARB));
244 }
245 source[offsets[count - 1]] = '\0';
Michal Krol1d7f7192005-03-25 12:12:50 +0000246
Brian Paule71e4c92006-11-02 16:09:10 +0000247 (**sha).SetSource(sha, source, offsets, count);
248 RELEASE_SHADER(sha);
Michal Krolc1fe4692004-10-27 17:09:10 +0000249}
250
Brian Paule71e4c92006-11-02 16:09:10 +0000251GLvoid GLAPIENTRY
252_mesa_CompileShaderARB(GLhandleARB shaderObj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000253{
Brian Paule71e4c92006-11-02 16:09:10 +0000254 GET_CURRENT_CONTEXT(ctx);
255 GET_SHADER(sha, shaderObj, "glCompileShaderARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000256
Brian Paule71e4c92006-11-02 16:09:10 +0000257 if (sha != NULL) {
258 (**sha).Compile(sha);
259 RELEASE_SHADER(sha);
260 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000261}
262
263GLhandleARB GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000264_mesa_CreateProgramObjectARB(GLvoid)
Michal Krolc1fe4692004-10-27 17:09:10 +0000265{
Brian Paule71e4c92006-11-02 16:09:10 +0000266 return _mesa_3dlabs_create_program_object();
Michal Krolc1fe4692004-10-27 17:09:10 +0000267}
268
Michal Krol9ac96052006-02-27 14:41:41 +0000269GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000270_mesa_AttachObjectARB(GLhandleARB containerObj, GLhandleARB obj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000271{
Brian Paule71e4c92006-11-02 16:09:10 +0000272 GET_CURRENT_CONTEXT(ctx);
273 GET_CONTAINER(con, containerObj, "glAttachObjectARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000274
Brian Paule71e4c92006-11-02 16:09:10 +0000275 if (con != NULL) {
276 GET_GENERIC(att, obj, "glAttachObjectARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000277
Brian Paule71e4c92006-11-02 16:09:10 +0000278 if (att != NULL) {
279 (**con).Attach(con, att);
280 RELEASE_GENERIC(att);
281 }
282 RELEASE_CONTAINER(con);
283 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000284}
285
Michal Krol9ac96052006-02-27 14:41:41 +0000286GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000287_mesa_LinkProgramARB(GLhandleARB programObj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000288{
Brian Paule71e4c92006-11-02 16:09:10 +0000289 GET_CURRENT_CONTEXT(ctx);
290 GET_PROGRAM(pro, programObj, "glLinkProgramARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000291
Brian Paule71e4c92006-11-02 16:09:10 +0000292 if (pro != NULL) {
293 (**pro).Link(pro);
294 if (pro == ctx->ShaderObjects.CurrentProgram) {
295 if ((**pro).GetLinkStatus(pro))
296 _mesa_UseProgramObjectARB(programObj);
297 else
298 _mesa_UseProgramObjectARB(0);
299 }
300 RELEASE_PROGRAM(pro);
301 }
Brianfe1d01c2006-12-13 14:54:47 -0700302#if NEW_SLANG
303 {
304 struct gl_linked_program *linked
305 = _mesa_lookup_linked_program(ctx, programObj);
306 _slang_link2(ctx, programObj, linked);
307 }
308#endif
Michal Krolc1fe4692004-10-27 17:09:10 +0000309}
310
Michal Krol9ac96052006-02-27 14:41:41 +0000311GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000312_mesa_UseProgramObjectARB(GLhandleARB programObj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000313{
Brian Paule71e4c92006-11-02 16:09:10 +0000314 GET_CURRENT_CONTEXT(ctx);
Michal Krola1a02e62006-05-16 09:40:30 +0000315 struct gl2_program_intf **program = NULL;
Michal Krol9ac96052006-02-27 14:41:41 +0000316
Brian Paule71e4c92006-11-02 16:09:10 +0000317 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000318
Brian Paule71e4c92006-11-02 16:09:10 +0000319 if (programObj != 0) {
Brian Paul82a9ba92006-11-15 21:38:26 +0000320 GET_PROGRAM(pro, programObj, "glUseProgramObjectARB(program)");
Michal Krol1d7f7192005-03-25 12:12:50 +0000321
Brian Paule71e4c92006-11-02 16:09:10 +0000322 if (pro == NULL)
323 return;
Michal Krol1d7f7192005-03-25 12:12:50 +0000324
Brian Paule71e4c92006-11-02 16:09:10 +0000325 if ((**pro).GetLinkStatus(pro) == GL_FALSE) {
326 RELEASE_PROGRAM(pro);
Brian Paul82a9ba92006-11-15 21:38:26 +0000327 _mesa_error(ctx, GL_INVALID_OPERATION, "glUseProgramObjectARB(not linked)");
Brian Paule71e4c92006-11-02 16:09:10 +0000328 return;
329 }
Michal Krol9ac96052006-02-27 14:41:41 +0000330
Brian Paule71e4c92006-11-02 16:09:10 +0000331 program = pro;
Brian Paul93269622006-04-14 03:43:39 +0000332
Brian Paule71e4c92006-11-02 16:09:10 +0000333 ctx->ShaderObjects._VertexShaderPresent =
334 (**pro).IsShaderPresent(pro, GL_VERTEX_SHADER_ARB);
335 ctx->ShaderObjects._FragmentShaderPresent =
336 (**pro).IsShaderPresent(pro, GL_FRAGMENT_SHADER_ARB);
337 }
338 else {
339 ctx->ShaderObjects._VertexShaderPresent = GL_FALSE;
340 ctx->ShaderObjects._FragmentShaderPresent = GL_FALSE;
341 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000342
Brian Paule71e4c92006-11-02 16:09:10 +0000343 if (ctx->ShaderObjects.CurrentProgram != NULL)
344 RELEASE_PROGRAM(ctx->ShaderObjects.CurrentProgram);
345 ctx->ShaderObjects.CurrentProgram = program;
Brianfe1d01c2006-12-13 14:54:47 -0700346
347#if NEW_SLANG
348 if (programObj) {
349 ctx->ShaderObjects.Linked = _mesa_lookup_linked_program(ctx, programObj);
350 }
351 else {
352 ctx->ShaderObjects.Linked = NULL;
353 }
354#endif
Michal Krolc1fe4692004-10-27 17:09:10 +0000355}
356
Michal Krol9ac96052006-02-27 14:41:41 +0000357GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000358_mesa_ValidateProgramARB(GLhandleARB programObj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000359{
Brian Paule71e4c92006-11-02 16:09:10 +0000360 GET_CURRENT_CONTEXT(ctx);
361 GET_PROGRAM(pro, programObj, "glValidateProgramARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000362
Brian Paule71e4c92006-11-02 16:09:10 +0000363 if (pro != NULL) {
364 (**pro).Validate(pro);
365 RELEASE_PROGRAM(pro);
366 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000367}
368
Brian Paul2659ee92006-11-03 21:30:16 +0000369
370/**
371 * Helper function for all the _mesa_Uniform*() functions below.
372 */
373static INLINE void
374uniform(GLint location, GLsizei count, const GLvoid *values, GLenum type,
375 const char *caller)
Michal Krol9ac96052006-02-27 14:41:41 +0000376{
Brian Paule71e4c92006-11-02 16:09:10 +0000377 GET_CURRENT_CONTEXT(ctx);
Brian Paul2659ee92006-11-03 21:30:16 +0000378 GET_CURRENT_LINKED_PROGRAM(pro, caller);
Brian Paul93269622006-04-14 03:43:39 +0000379
Brian Paule71e4c92006-11-02 16:09:10 +0000380 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol9ac96052006-02-27 14:41:41 +0000381
Brianfe1d01c2006-12-13 14:54:47 -0700382#if NEW_SLANG
383 if (ctx->ShaderObjects.Linked) {
384 struct gl_linked_program *linked = ctx->ShaderObjects.Linked;
Briancc0c8b22006-12-14 13:59:25 -0700385 if (location >= 0 && location < linked->Uniforms->NumParameters) {
386 GLfloat *v = linked->Uniforms->ParameterValues[location];
Brianfe1d01c2006-12-13 14:54:47 -0700387 const GLfloat *fValues = (const GLfloat *) values; /* XXX */
388 GLint i;
389 if (type == GL_FLOAT_VEC4)
390 count *= 4;
391 else if (type == GL_FLOAT_VEC3)
392 count *= 3;
393 else
394 abort();
395
396 for (i = 0; i < count; i++)
397 v[i] = fValues[i];
398 return;
399 }
400 }
Briancc0c8b22006-12-14 13:59:25 -0700401#else
Brian Paul2659ee92006-11-03 21:30:16 +0000402 if (!(**pro).WriteUniform(pro, location, count, values, type))
403 _mesa_error(ctx, GL_INVALID_OPERATION, caller);
Briancc0c8b22006-12-14 13:59:25 -0700404#endif
Brian Paul2659ee92006-11-03 21:30:16 +0000405}
406
407
408GLvoid GLAPIENTRY
409_mesa_Uniform1fARB(GLint location, GLfloat v0)
410{
411 uniform(location, 1, &v0, GL_FLOAT, "glUniform1fARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000412}
413
Michal Krol9ac96052006-02-27 14:41:41 +0000414GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000415_mesa_Uniform2fARB(GLint location, GLfloat v0, GLfloat v1)
Michal Krol1d7f7192005-03-25 12:12:50 +0000416{
Brian Paul2659ee92006-11-03 21:30:16 +0000417 GLfloat v[2];
418 v[0] = v0;
419 v[1] = v1;
420 uniform(location, 1, v, GL_FLOAT_VEC2, "glUniform2fARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000421}
422
Michal Krol9ac96052006-02-27 14:41:41 +0000423GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000424_mesa_Uniform3fARB(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
Michal Krol1d7f7192005-03-25 12:12:50 +0000425{
Brian Paul2659ee92006-11-03 21:30:16 +0000426 GLfloat v[3];
427 v[0] = v0;
428 v[1] = v1;
429 v[2] = v2;
430 uniform(location, 1, v, GL_FLOAT_VEC3, "glUniform3fARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000431}
432
Michal Krol9ac96052006-02-27 14:41:41 +0000433GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000434_mesa_Uniform4fARB(GLint location, GLfloat v0, GLfloat v1, GLfloat v2,
435 GLfloat v3)
Michal Krol1d7f7192005-03-25 12:12:50 +0000436{
Brian Paul2659ee92006-11-03 21:30:16 +0000437 GLfloat v[4];
438 v[0] = v0;
439 v[1] = v1;
440 v[2] = v2;
441 v[3] = v3;
442 uniform(location, 1, v, GL_FLOAT_VEC4, "glUniform4fARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000443}
444
Michal Krol9ac96052006-02-27 14:41:41 +0000445GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000446_mesa_Uniform1iARB(GLint location, GLint v0)
Michal Krol1d7f7192005-03-25 12:12:50 +0000447{
Brian Paul2659ee92006-11-03 21:30:16 +0000448 uniform(location, 1, &v0, GL_INT, "glUniform1iARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000449}
450
Michal Krol9ac96052006-02-27 14:41:41 +0000451GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000452_mesa_Uniform2iARB(GLint location, GLint v0, GLint v1)
Michal Krol1d7f7192005-03-25 12:12:50 +0000453{
Brian Paul2659ee92006-11-03 21:30:16 +0000454 GLint v[2];
455 v[0] = v0;
456 v[1] = v1;
457 uniform(location, 1, v, GL_INT_VEC2, "glUniform2iARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000458}
459
Michal Krol9ac96052006-02-27 14:41:41 +0000460GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000461_mesa_Uniform3iARB(GLint location, GLint v0, GLint v1, GLint v2)
Michal Krol1d7f7192005-03-25 12:12:50 +0000462{
Brian Paul2659ee92006-11-03 21:30:16 +0000463 GLint v[3];
464 v[0] = v0;
465 v[1] = v1;
466 v[2] = v2;
467 uniform(location, 1, v, GL_INT_VEC3, "glUniform3iARB");
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_Uniform4iARB(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
Michal Krol1d7f7192005-03-25 12:12:50 +0000472{
Brian Paul2659ee92006-11-03 21:30:16 +0000473 GLint v[4];
474 v[0] = v0;
475 v[1] = v1;
476 v[2] = v2;
477 v[3] = v3;
478 uniform(location, 1, v, GL_INT_VEC4, "glUniform4iARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000479}
480
Michal Krol9ac96052006-02-27 14:41:41 +0000481GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000482_mesa_Uniform1fvARB(GLint location, GLsizei count, const GLfloat * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000483{
Brian Paul2659ee92006-11-03 21:30:16 +0000484 uniform(location, count, value, GL_FLOAT, "glUniform1fvARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000485}
486
Michal Krol9ac96052006-02-27 14:41:41 +0000487GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000488_mesa_Uniform2fvARB(GLint location, GLsizei count, const GLfloat * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000489{
Brian Paul2659ee92006-11-03 21:30:16 +0000490 uniform(location, count, value, GL_FLOAT_VEC2, "glUniform2fvARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000491}
492
Michal Krol9ac96052006-02-27 14:41:41 +0000493GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000494_mesa_Uniform3fvARB(GLint location, GLsizei count, const GLfloat * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000495{
Brian Paul2659ee92006-11-03 21:30:16 +0000496 uniform(location, count, value, GL_FLOAT_VEC3, "glUniform3fvARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000497}
498
Michal Krol9ac96052006-02-27 14:41:41 +0000499GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000500_mesa_Uniform4fvARB(GLint location, GLsizei count, const GLfloat * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000501{
Brian Paul2659ee92006-11-03 21:30:16 +0000502 uniform(location, count, value, GL_FLOAT_VEC4, "glUniform4fvARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000503}
504
Michal Krol9ac96052006-02-27 14:41:41 +0000505GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000506_mesa_Uniform1ivARB(GLint location, GLsizei count, const GLint * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000507{
Brian Paul2659ee92006-11-03 21:30:16 +0000508 uniform(location, count, value, GL_INT, "glUniform1ivARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000509}
510
Michal Krol9ac96052006-02-27 14:41:41 +0000511GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000512_mesa_Uniform2ivARB(GLint location, GLsizei count, const GLint * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000513{
Brian Paul2659ee92006-11-03 21:30:16 +0000514 uniform(location, count, value, GL_INT_VEC2, "glUniform2ivARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000515}
516
Michal Krol9ac96052006-02-27 14:41:41 +0000517GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000518_mesa_Uniform3ivARB(GLint location, GLsizei count, const GLint * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000519{
Brian Paul2659ee92006-11-03 21:30:16 +0000520 uniform(location, count, value, GL_INT_VEC3, "glUniform3ivARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000521}
522
Michal Krol9ac96052006-02-27 14:41:41 +0000523GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000524_mesa_Uniform4ivARB(GLint location, GLsizei count, const GLint * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000525{
Brian Paul2659ee92006-11-03 21:30:16 +0000526 uniform(location, count, value, GL_INT_VEC4, "glUniform4ivARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000527}
528
Brian Paul93269622006-04-14 03:43:39 +0000529
Brian Paulbdb251b2006-11-03 17:29:31 +0000530/**
531 * Helper function used by UniformMatrix**vARB() functions below.
532 */
533static void
534uniform_matrix(GLint cols, GLint rows, const char *caller,
535 GLenum matrixType,
536 GLint location, GLsizei count, GLboolean transpose,
537 const GLfloat *values)
538{
539 const GLint matElements = rows * cols;
540 GET_CURRENT_CONTEXT(ctx);
541 GET_CURRENT_LINKED_PROGRAM(pro, caller);
542
543 if (values == NULL) {
544 _mesa_error(ctx, GL_INVALID_VALUE, caller);
Brian Paule71e4c92006-11-02 16:09:10 +0000545 return;
546 }
Michal Krold55de652006-04-18 10:30:29 +0000547
Brian Paule71e4c92006-11-02 16:09:10 +0000548 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000549
Brian Paulbdb251b2006-11-03 17:29:31 +0000550 if (transpose) {
551 GLfloat *trans, *pt;
552 const GLfloat *pv;
553 GLint i, j, k;
554
555 trans = (GLfloat *) _mesa_malloc(count * matElements * sizeof(GLfloat));
556 if (!trans) {
557 _mesa_error(ctx, GL_OUT_OF_MEMORY, caller);
558 return;
Brian Paule71e4c92006-11-02 16:09:10 +0000559 }
Brian Paulbdb251b2006-11-03 17:29:31 +0000560
561 pt = trans;
562 pv = values;
563 for (i = 0; i < count; i++) {
564 /* transpose from pv matrix into pt matrix */
565 for (j = 0; j < cols; j++) {
566 for (k = 0; k < rows; k++) {
567 /* XXX verify this */
568 pt[j * rows + k] = pv[k * cols + j];
569 }
570 }
571 pt += matElements;
572 pv += matElements;
Brian Paule71e4c92006-11-02 16:09:10 +0000573 }
Brian Paulbdb251b2006-11-03 17:29:31 +0000574
575 if (!(**pro).WriteUniform(pro, location, count, trans, matrixType))
576 _mesa_error(ctx, GL_INVALID_OPERATION, caller);
577 _mesa_free(trans);
Brian Paule71e4c92006-11-02 16:09:10 +0000578 }
Brian Paulbdb251b2006-11-03 17:29:31 +0000579 else {
580 if (!(**pro).WriteUniform(pro, location, count, values, matrixType))
581 _mesa_error(ctx, GL_INVALID_OPERATION, caller);
582 }
583}
584
585
586GLvoid GLAPIENTRY
587_mesa_UniformMatrix2fvARB(GLint location, GLsizei count, GLboolean transpose,
588 const GLfloat * value)
589{
590 uniform_matrix(2, 2, "glUniformMatrix2fvARB", GL_FLOAT_MAT2,
591 location, count, transpose, value);
Michal Krolc1fe4692004-10-27 17:09:10 +0000592}
593
Michal Krol9ac96052006-02-27 14:41:41 +0000594GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000595_mesa_UniformMatrix3fvARB(GLint location, GLsizei count, GLboolean transpose,
596 const GLfloat * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000597{
Brian Paulbdb251b2006-11-03 17:29:31 +0000598 uniform_matrix(3, 3, "glUniformMatrix3fvARB", GL_FLOAT_MAT3,
599 location, count, transpose, value);
Michal Krolc1fe4692004-10-27 17:09:10 +0000600}
601
Michal Krol9ac96052006-02-27 14:41:41 +0000602GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000603_mesa_UniformMatrix4fvARB(GLint location, GLsizei count, GLboolean transpose,
604 const GLfloat * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000605{
Brian Paulbdb251b2006-11-03 17:29:31 +0000606 uniform_matrix(4, 4, "glUniformMatrix4fvARB", GL_FLOAT_MAT4,
607 location, count, transpose, value);
Michal Krol1d7f7192005-03-25 12:12:50 +0000608}
609
610static GLboolean
Brian Paule71e4c92006-11-02 16:09:10 +0000611_mesa_get_object_parameter(GLhandleARB obj, GLenum pname, GLvoid * params,
612 GLboolean * integral, GLint * size)
Michal Krol1d7f7192005-03-25 12:12:50 +0000613{
Brian Paule71e4c92006-11-02 16:09:10 +0000614 GET_CURRENT_CONTEXT(ctx);
615 GLint *ipar = (GLint *) params;
Michal Krol1d7f7192005-03-25 12:12:50 +0000616
Brian Paule71e4c92006-11-02 16:09:10 +0000617 /* set default values */
Brian Paulbdb251b2006-11-03 17:29:31 +0000618 *integral = GL_TRUE; /* indicates param type, TRUE: GLint, FALSE: GLfloat */
619 *size = 1; /* param array size */
Michal Krol1d7f7192005-03-25 12:12:50 +0000620
Brian Paule71e4c92006-11-02 16:09:10 +0000621 switch (pname) {
622 case GL_OBJECT_TYPE_ARB:
623 case GL_OBJECT_DELETE_STATUS_ARB:
624 case GL_OBJECT_INFO_LOG_LENGTH_ARB:
625 {
626 GET_GENERIC(gen, obj, "glGetObjectParameterivARB");
Michal Krol9ac96052006-02-27 14:41:41 +0000627
Brian Paule71e4c92006-11-02 16:09:10 +0000628 if (gen == NULL)
629 return GL_FALSE;
Michal Krol9ac96052006-02-27 14:41:41 +0000630
Brian Paule71e4c92006-11-02 16:09:10 +0000631 switch (pname) {
632 case GL_OBJECT_TYPE_ARB:
633 *ipar = (**gen).GetType(gen);
634 break;
635 case GL_OBJECT_DELETE_STATUS_ARB:
636 *ipar = (**gen).GetDeleteStatus(gen);
637 break;
Michal Krola1a02e62006-05-16 09:40:30 +0000638 case GL_OBJECT_INFO_LOG_LENGTH_ARB:
Brian Paule71e4c92006-11-02 16:09:10 +0000639 *ipar = (**gen).GetInfoLogLength(gen);
Michal Krola1a02e62006-05-16 09:40:30 +0000640 break;
Brian Paule71e4c92006-11-02 16:09:10 +0000641 }
Michal Krol9ac96052006-02-27 14:41:41 +0000642
Brian Paule71e4c92006-11-02 16:09:10 +0000643 RELEASE_GENERIC(gen);
644 }
645 break;
646 case GL_OBJECT_SUBTYPE_ARB:
647 case GL_OBJECT_COMPILE_STATUS_ARB:
648 case GL_OBJECT_SHADER_SOURCE_LENGTH_ARB:
649 {
650 GET_SHADER(sha, obj, "glGetObjectParameterivARB");
Michal Krol9ac96052006-02-27 14:41:41 +0000651
Brian Paule71e4c92006-11-02 16:09:10 +0000652 if (sha == 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_SUBTYPE_ARB:
657 *ipar = (**sha).GetSubType(sha);
658 break;
659 case GL_OBJECT_COMPILE_STATUS_ARB:
660 *ipar = (**sha).GetCompileStatus(sha);
661 break;
662 case GL_OBJECT_SHADER_SOURCE_LENGTH_ARB:
663 {
664 const GLcharARB *src = (**sha).GetSource(sha);
Brian Paule71e4c92006-11-02 16:09:10 +0000665 if (src == NULL)
666 *ipar = 0;
667 else
668 *ipar = _mesa_strlen(src) + 1;
669 }
670 break;
671 }
Michal Krol9ac96052006-02-27 14:41:41 +0000672
Brian Paule71e4c92006-11-02 16:09:10 +0000673 RELEASE_SHADER(sha);
674 }
675 break;
676 case GL_OBJECT_LINK_STATUS_ARB:
677 case GL_OBJECT_VALIDATE_STATUS_ARB:
678 case GL_OBJECT_ATTACHED_OBJECTS_ARB:
679 case GL_OBJECT_ACTIVE_UNIFORMS_ARB:
680 case GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB:
681 {
682 GET_PROGRAM(pro, obj, "glGetObjectParameterivARB");
Michal Krol9ac96052006-02-27 14:41:41 +0000683
Brian Paule71e4c92006-11-02 16:09:10 +0000684 if (pro == NULL)
685 return GL_FALSE;
Michal Krol9ac96052006-02-27 14:41:41 +0000686
Brian Paule71e4c92006-11-02 16:09:10 +0000687 switch (pname) {
688 case GL_OBJECT_LINK_STATUS_ARB:
689 *ipar = (**pro).GetLinkStatus(pro);
690 break;
691 case GL_OBJECT_VALIDATE_STATUS_ARB:
692 *ipar = (**pro).GetValidateStatus(pro);
693 break;
Michal Krola1a02e62006-05-16 09:40:30 +0000694 case GL_OBJECT_ATTACHED_OBJECTS_ARB:
Brian Paule71e4c92006-11-02 16:09:10 +0000695 *ipar =
696 (**pro)._container.
697 GetAttachedCount((struct gl2_container_intf **) (pro));
Michal Krola1a02e62006-05-16 09:40:30 +0000698 break;
Brian Paule71e4c92006-11-02 16:09:10 +0000699 case GL_OBJECT_ACTIVE_UNIFORMS_ARB:
700 *ipar = (**pro).GetActiveUniformCount(pro);
701 break;
702 case GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB:
703 *ipar = (**pro).GetActiveUniformMaxLength(pro);
704 break;
705 case GL_OBJECT_ACTIVE_ATTRIBUTES_ARB:
706 *ipar = (**pro).GetActiveAttribCount(pro);
707 break;
708 case GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB:
709 *ipar = (**pro).GetActiveAttribMaxLength(pro);
710 break;
711 }
Michal Krol9ac96052006-02-27 14:41:41 +0000712
Brian Paule71e4c92006-11-02 16:09:10 +0000713 RELEASE_PROGRAM(pro);
714 }
715 break;
716 default:
717 _mesa_error(ctx, GL_INVALID_ENUM, "glGetObjectParameterivARB");
718 return GL_FALSE;
719 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000720
Brian Paule71e4c92006-11-02 16:09:10 +0000721 return GL_TRUE;
Michal Krol1d7f7192005-03-25 12:12:50 +0000722}
723
Michal Krol9ac96052006-02-27 14:41:41 +0000724GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000725_mesa_GetObjectParameterfvARB(GLhandleARB obj, GLenum pname, GLfloat * params)
Michal Krol1d7f7192005-03-25 12:12:50 +0000726{
Brian Paule71e4c92006-11-02 16:09:10 +0000727 GET_CURRENT_CONTEXT(ctx);
728 GLboolean integral;
729 GLint size;
Michal Krol1d7f7192005-03-25 12:12:50 +0000730
Brian Paule71e4c92006-11-02 16:09:10 +0000731 if (params == NULL) {
732 _mesa_error(ctx, GL_INVALID_VALUE, "glGetObjectParameterfvARB");
733 return;
734 }
Michal Krold55de652006-04-18 10:30:29 +0000735
Brian Paule71e4c92006-11-02 16:09:10 +0000736 assert(sizeof(GLfloat) == sizeof(GLint));
Michal Krol1d7f7192005-03-25 12:12:50 +0000737
Brian Paulbdb251b2006-11-03 17:29:31 +0000738 if (_mesa_get_object_parameter(obj, pname, (GLvoid *) params,
739 &integral, &size)) {
Brian Paule71e4c92006-11-02 16:09:10 +0000740 if (integral) {
741 GLint i;
Brian Paule71e4c92006-11-02 16:09:10 +0000742 for (i = 0; i < size; i++)
743 params[i] = (GLfloat) ((GLint *) params)[i];
744 }
Brian Paulbdb251b2006-11-03 17:29:31 +0000745 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000746}
747
Michal Krol9ac96052006-02-27 14:41:41 +0000748GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000749_mesa_GetObjectParameterivARB(GLhandleARB obj, GLenum pname, GLint * params)
Michal Krol1d7f7192005-03-25 12:12:50 +0000750{
Brian Paule71e4c92006-11-02 16:09:10 +0000751 GET_CURRENT_CONTEXT(ctx);
752 GLboolean integral;
753 GLint size;
Michal Krol1d7f7192005-03-25 12:12:50 +0000754
Brian Paule71e4c92006-11-02 16:09:10 +0000755 if (params == NULL) {
756 _mesa_error(ctx, GL_INVALID_VALUE, "glGetObjectParameterivARB");
757 return;
758 }
Michal Krold55de652006-04-18 10:30:29 +0000759
Brian Paule71e4c92006-11-02 16:09:10 +0000760 assert(sizeof(GLfloat) == sizeof(GLint));
Michal Krol1d7f7192005-03-25 12:12:50 +0000761
Brian Paulbdb251b2006-11-03 17:29:31 +0000762 if (_mesa_get_object_parameter(obj, pname, (GLvoid *) params,
763 &integral, &size)) {
Brian Paule71e4c92006-11-02 16:09:10 +0000764 if (!integral) {
765 GLint i;
Brian Paule71e4c92006-11-02 16:09:10 +0000766 for (i = 0; i < size; i++)
767 params[i] = (GLint) ((GLfloat *) params)[i];
768 }
Brian Paulbdb251b2006-11-03 17:29:31 +0000769 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000770}
771
Brian Paul93269622006-04-14 03:43:39 +0000772
773/**
774 * Copy string from <src> to <dst>, up to maxLength characters, returning
775 * length of <dst> in <length>.
776 * \param src the strings source
777 * \param maxLength max chars to copy
778 * \param length returns numberof chars copied
779 * \param dst the string destination
780 */
Michal Krol9ac96052006-02-27 14:41:41 +0000781static GLvoid
Brian Paule71e4c92006-11-02 16:09:10 +0000782copy_string(const GLcharARB * src, GLsizei maxLength, GLsizei * length,
783 GLcharARB * dst)
Michal Krol1d7f7192005-03-25 12:12:50 +0000784{
Brian Paule71e4c92006-11-02 16:09:10 +0000785 GLsizei len;
786 for (len = 0; len < maxLength - 1 && src && src[len]; len++)
787 dst[len] = src[len];
788 if (maxLength > 0)
789 dst[len] = 0;
790 if (length)
791 *length = len;
Michal Krolc1fe4692004-10-27 17:09:10 +0000792}
793
Brian Paul93269622006-04-14 03:43:39 +0000794
Michal Krol9ac96052006-02-27 14:41:41 +0000795GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000796_mesa_GetInfoLogARB(GLhandleARB obj, GLsizei maxLength, GLsizei * length,
797 GLcharARB * infoLog)
Michal Krol1d7f7192005-03-25 12:12:50 +0000798{
Brian Paule71e4c92006-11-02 16:09:10 +0000799 GET_CURRENT_CONTEXT(ctx);
800 GET_GENERIC(gen, obj, "glGetInfoLogARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000801
Brian Paule71e4c92006-11-02 16:09:10 +0000802 if (gen == NULL)
803 return;
Michal Krold55de652006-04-18 10:30:29 +0000804
Brian Paule71e4c92006-11-02 16:09:10 +0000805 if (infoLog == NULL)
806 _mesa_error(ctx, GL_INVALID_VALUE, "glGetInfoLogARB");
Michal Krola1a02e62006-05-16 09:40:30 +0000807 else {
Brian Paule71e4c92006-11-02 16:09:10 +0000808 GLsizei actualsize = (**gen).GetInfoLogLength(gen);
Michal Krola1a02e62006-05-16 09:40:30 +0000809 if (actualsize > maxLength)
810 actualsize = maxLength;
Brian Paule71e4c92006-11-02 16:09:10 +0000811 (**gen).GetInfoLog(gen, actualsize, infoLog);
Michal Krola1a02e62006-05-16 09:40:30 +0000812 if (length != NULL)
813 *length = (actualsize > 0) ? actualsize - 1 : 0;
814 }
Brian Paule71e4c92006-11-02 16:09:10 +0000815 RELEASE_GENERIC(gen);
Michal Krol1d7f7192005-03-25 12:12:50 +0000816}
817
Michal Krol9ac96052006-02-27 14:41:41 +0000818GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000819_mesa_GetAttachedObjectsARB(GLhandleARB containerObj, GLsizei maxCount,
820 GLsizei * count, GLhandleARB * obj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000821{
Brian Paule71e4c92006-11-02 16:09:10 +0000822 GET_CURRENT_CONTEXT(ctx);
823 GET_CONTAINER(con, containerObj, "glGetAttachedObjectsARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000824
Brian Paule71e4c92006-11-02 16:09:10 +0000825 if (con == NULL)
826 return;
Michal Krold55de652006-04-18 10:30:29 +0000827
Brian Paule71e4c92006-11-02 16:09:10 +0000828 if (obj == NULL)
829 _mesa_error(ctx, GL_INVALID_VALUE, "glGetAttachedObjectsARB");
830 else {
831 GLsizei cnt, i;
Michal Krold55de652006-04-18 10:30:29 +0000832
Brian Paule71e4c92006-11-02 16:09:10 +0000833 cnt = (**con).GetAttachedCount(con);
834 if (cnt > maxCount)
835 cnt = maxCount;
836 if (count != NULL)
837 *count = cnt;
Michal Krol9ac96052006-02-27 14:41:41 +0000838
Brian Paule71e4c92006-11-02 16:09:10 +0000839 for (i = 0; i < cnt; i++) {
840 struct gl2_generic_intf **x = (**con).GetAttached(con, i);
841 obj[i] = (**x).GetName(x);
842 RELEASE_GENERIC(x);
843 }
844 }
845 RELEASE_CONTAINER(con);
Michal Krol9ac96052006-02-27 14:41:41 +0000846}
Michal Krolc1fe4692004-10-27 17:09:10 +0000847
848GLint GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000849_mesa_GetUniformLocationARB(GLhandleARB programObj, const GLcharARB * name)
Michal Krol1d7f7192005-03-25 12:12:50 +0000850{
Brianfe1d01c2006-12-13 14:54:47 -0700851#if NEW_SLANG
852 GET_CURRENT_CONTEXT(ctx);
853
854 if (ctx->ShaderObjects.Linked) {
Briancc0c8b22006-12-14 13:59:25 -0700855 const struct gl_linked_program *linked = ctx->ShaderObjects.Linked;
Brianfe1d01c2006-12-13 14:54:47 -0700856 GLuint loc;
Briancc0c8b22006-12-14 13:59:25 -0700857 for (loc = 0; loc < linked->Uniforms->NumParameters; loc++) {
858 const struct gl_program_parameter *u
859 = linked->Uniforms->Parameters + loc;
860 if (u->Type == PROGRAM_UNIFORM && !strcmp(u->Name, name)) {
Brianfe1d01c2006-12-13 14:54:47 -0700861 return loc;
862 }
863 }
864 }
865 return -1;
866#else
Brian Paule71e4c92006-11-02 16:09:10 +0000867 GET_CURRENT_CONTEXT(ctx);
868 GLint loc = -1;
869 GET_LINKED_PROGRAM(pro, programObj, "glGetUniformLocationARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000870
Brian Paul7e6701c2006-11-03 21:51:58 +0000871 if (!pro)
Brian Paule71e4c92006-11-02 16:09:10 +0000872 return -1;
Michal Krold55de652006-04-18 10:30:29 +0000873
Brian Paule71e4c92006-11-02 16:09:10 +0000874 if (name == NULL)
875 _mesa_error(ctx, GL_INVALID_VALUE, "glGetUniformLocationARB");
876 else {
877 if (!IS_NAME_WITH_GL_PREFIX(name))
878 loc = (**pro).GetUniformLocation(pro, name);
879 }
880 RELEASE_PROGRAM(pro);
881 return loc;
Brianfe1d01c2006-12-13 14:54:47 -0700882#endif
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_GetActiveUniformARB(GLhandleARB programObj, GLuint index,
887 GLsizei maxLength, GLsizei * length, GLint * size,
888 GLenum * type, GLcharARB * name)
Michal Krol1d7f7192005-03-25 12:12:50 +0000889{
Brian Paule71e4c92006-11-02 16:09:10 +0000890 GET_CURRENT_CONTEXT(ctx);
891 GET_PROGRAM(pro, programObj, "glGetActiveUniformARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000892
Brian Paule71e4c92006-11-02 16:09:10 +0000893 if (pro == NULL)
894 return;
Michal Krold55de652006-04-18 10:30:29 +0000895
Brian Paule71e4c92006-11-02 16:09:10 +0000896 if (size == NULL || type == NULL || name == NULL)
897 _mesa_error(ctx, GL_INVALID_VALUE, "glGetActiveUniformARB");
898 else {
899 if (index < (**pro).GetActiveUniformCount(pro))
900 (**pro).GetActiveUniform(pro, index, maxLength, length, size, type,
901 name);
902 else
903 _mesa_error(ctx, GL_INVALID_VALUE, "glGetActiveUniformARB");
904 }
905 RELEASE_PROGRAM(pro);
Michal Krolc1fe4692004-10-27 17:09:10 +0000906}
907
Michal Krol9ac96052006-02-27 14:41:41 +0000908GLvoid GLAPIENTRY
Brian Paulbdb251b2006-11-03 17:29:31 +0000909_mesa_GetUniformfvARB(GLhandleARB programObj, GLint location, GLfloat * params)
Michal Krol1d7f7192005-03-25 12:12:50 +0000910{
Brian Paule71e4c92006-11-02 16:09:10 +0000911 GET_CURRENT_CONTEXT(ctx);
912 GET_LINKED_PROGRAM(pro, programObj, "glGetUniformfvARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000913
Brian Paul7e6701c2006-11-03 21:51:58 +0000914 if (!pro)
915 return;
916
917 if (!(**pro).ReadUniform(pro, location, 1, params, GL_FLOAT))
918 _mesa_error(ctx, GL_INVALID_OPERATION, "glGetUniformfvARB");
919
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_GetUniformivARB(GLhandleARB programObj, GLint location, GLint * params)
Michal Krol1d7f7192005-03-25 12:12:50 +0000925{
Brian Paule71e4c92006-11-02 16:09:10 +0000926 GET_CURRENT_CONTEXT(ctx);
927 GET_LINKED_PROGRAM(pro, programObj, "glGetUniformivARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000928
Brian Paul7e6701c2006-11-03 21:51:58 +0000929 if (!pro)
930 return;
931
932 if (!(**pro).ReadUniform(pro, location, 1, params, GL_INT))
933 _mesa_error(ctx, GL_INVALID_OPERATION, "glGetUniformivARB");
934 RELEASE_PROGRAM(pro);
Michal Krolc1fe4692004-10-27 17:09:10 +0000935}
936
Michal Krol9ac96052006-02-27 14:41:41 +0000937GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000938_mesa_GetShaderSourceARB(GLhandleARB obj, GLsizei maxLength, GLsizei * length,
939 GLcharARB * source)
Michal Krol1d7f7192005-03-25 12:12:50 +0000940{
Brian Paule71e4c92006-11-02 16:09:10 +0000941 GET_CURRENT_CONTEXT(ctx);
942 GET_SHADER(sha, obj, "glGetShaderSourceARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000943
Brian Paule71e4c92006-11-02 16:09:10 +0000944 if (sha == NULL)
945 return;
Michal Krold55de652006-04-18 10:30:29 +0000946
Brian Paule71e4c92006-11-02 16:09:10 +0000947 if (source == NULL)
948 _mesa_error(ctx, GL_INVALID_VALUE, "glGetShaderSourceARB");
949 else
950 copy_string((**sha).GetSource(sha), maxLength, length, source);
951 RELEASE_SHADER(sha);
Michal Krolc1fe4692004-10-27 17:09:10 +0000952}
953
954/* GL_ARB_vertex_shader */
955
Michal Krol9ac96052006-02-27 14:41:41 +0000956GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000957_mesa_BindAttribLocationARB(GLhandleARB programObj, GLuint index,
958 const GLcharARB * name)
Michal Krol1d7f7192005-03-25 12:12:50 +0000959{
Brian Paule71e4c92006-11-02 16:09:10 +0000960 GET_CURRENT_CONTEXT(ctx);
961 GET_PROGRAM(pro, programObj, "glBindAttribLocationARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000962
Brian Paule71e4c92006-11-02 16:09:10 +0000963 if (pro == NULL)
964 return;
Michal Krold55de652006-04-18 10:30:29 +0000965
Brian Paule71e4c92006-11-02 16:09:10 +0000966 if (name == NULL || index >= MAX_VERTEX_ATTRIBS)
967 _mesa_error(ctx, GL_INVALID_VALUE, "glBindAttribLocationARB");
968 else if (IS_NAME_WITH_GL_PREFIX(name))
969 _mesa_error(ctx, GL_INVALID_OPERATION, "glBindAttribLocationARB");
970 else
971 (**pro).OverrideAttribBinding(pro, index, name);
972 RELEASE_PROGRAM(pro);
Michal Krolc1fe4692004-10-27 17:09:10 +0000973}
974
Michal Krol9ac96052006-02-27 14:41:41 +0000975GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000976_mesa_GetActiveAttribARB(GLhandleARB programObj, GLuint index,
977 GLsizei maxLength, GLsizei * length, GLint * size,
978 GLenum * type, GLcharARB * name)
Michal Krol1d7f7192005-03-25 12:12:50 +0000979{
Brian Paule71e4c92006-11-02 16:09:10 +0000980 GET_CURRENT_CONTEXT(ctx);
981 GET_PROGRAM(pro, programObj, "glGetActiveAttribARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000982
Brian Paule71e4c92006-11-02 16:09:10 +0000983 if (pro == NULL)
984 return;
Michal Krold55de652006-04-18 10:30:29 +0000985
Brian Paule71e4c92006-11-02 16:09:10 +0000986 if (name == NULL || index >= (**pro).GetActiveAttribCount(pro))
987 _mesa_error(ctx, GL_INVALID_VALUE, "glGetActiveAttribARB");
988 else
989 (**pro).GetActiveAttrib(pro, index, maxLength, length, size, type,
990 name);
991 RELEASE_PROGRAM(pro);
Michal Krolc1fe4692004-10-27 17:09:10 +0000992}
993
994GLint GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000995_mesa_GetAttribLocationARB(GLhandleARB programObj, const GLcharARB * name)
Michal Krol1d7f7192005-03-25 12:12:50 +0000996{
Brian Paule71e4c92006-11-02 16:09:10 +0000997 GET_CURRENT_CONTEXT(ctx);
998 GLint loc = -1;
999 GET_LINKED_PROGRAM(pro, programObj, "glGetAttribLocationARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001000
Brian Paul7e6701c2006-11-03 21:51:58 +00001001 if (!pro)
Brian Paule71e4c92006-11-02 16:09:10 +00001002 return -1;
Michal Krold55de652006-04-18 10:30:29 +00001003
Brian Paule71e4c92006-11-02 16:09:10 +00001004 if (name == NULL)
1005 _mesa_error(ctx, GL_INVALID_VALUE, "glGetAttribLocationARB");
1006 else if (!IS_NAME_WITH_GL_PREFIX(name))
1007 loc = (**pro).GetAttribLocation(pro, name);
1008 RELEASE_PROGRAM(pro);
1009 return loc;
Michal Krolc1fe4692004-10-27 17:09:10 +00001010}
1011
Brian Paulf961d392006-11-02 16:11:31 +00001012
1013/**
1014 ** OpenGL 2.0 functions which basically wrap the ARB_shader functions
1015 **/
1016
1017void GLAPIENTRY
1018_mesa_AttachShader(GLuint program, GLuint shader)
1019{
1020 _mesa_AttachObjectARB(program, shader);
Brianfe1d01c2006-12-13 14:54:47 -07001021#if NEW_SLANG
1022 {
1023 GET_CURRENT_CONTEXT(ctx);
1024 struct gl_linked_program *linked
1025 = _mesa_lookup_linked_program(ctx, program);
1026 struct gl_program *prog
1027 = _mesa_lookup_shader(ctx, shader);
1028 const GLuint n = linked->NumShaders;
1029 GLuint i;
1030 if (!linked || !prog) {
1031 _mesa_error(ctx, GL_INVALID_OPERATION,
1032 "glAttachShader(bad program or shader name)");
1033 return;
1034 }
1035 for (i = 0; i < n; i++) {
1036 if (linked->Shaders[i] == prog) {
1037 /* already attached */
1038 return;
1039 }
1040 }
1041 /* append to list */
1042 linked->Shaders = _mesa_realloc(linked->Shaders,
1043 n * sizeof(struct gl_program *),
1044 (n + 1) * sizeof(struct gl_program *));
1045 linked->Shaders[n] = prog;
1046 prog->RefCount++;
1047 linked->NumShaders++;
1048 }
1049#endif
Brian Paulf961d392006-11-02 16:11:31 +00001050}
1051
1052
1053GLuint GLAPIENTRY
1054_mesa_CreateShader(GLenum type)
1055{
1056 return (GLuint) _mesa_CreateShaderObjectARB(type);
1057}
1058
1059GLuint GLAPIENTRY
1060_mesa_CreateProgram(void)
1061{
1062 return (GLuint) _mesa_CreateProgramObjectARB();
1063}
1064
1065void GLAPIENTRY
1066_mesa_DeleteProgram(GLuint program)
1067{
1068 _mesa_DeleteObjectARB(program);
1069}
1070
1071
1072void GLAPIENTRY
1073_mesa_DeleteShader(GLuint shader)
1074{
1075 _mesa_DeleteObjectARB(shader);
1076}
1077
1078void GLAPIENTRY
1079_mesa_DetachShader(GLuint program, GLuint shader)
1080{
1081 _mesa_DetachObjectARB(program, shader);
1082}
1083
1084void GLAPIENTRY
1085_mesa_GetAttachedShaders(GLuint program, GLsizei maxCount,
1086 GLsizei *count, GLuint *obj)
1087{
1088 _mesa_GetAttachedObjectsARB(program, maxCount, count, obj);
Brianfe1d01c2006-12-13 14:54:47 -07001089#if NEW_SLANG
1090 {
1091 GET_CURRENT_CONTEXT(ctx);
1092 struct gl_linked_program *linked
1093 = _mesa_lookup_linked_program(ctx, program);
1094 if (linked) {
1095 GLuint i;
1096 for (i = 0; i < maxCount && i < linked->NumShaders; i++) {
1097 obj[i] = linked->Shaders[i]->Id;
1098 }
1099 if (count)
1100 *count = i;
1101 }
1102 else {
1103 _mesa_error(ctx, GL_INVALID_OPERATION, "glGetAttachedShaders");
1104 }
1105 }
1106#endif
Brian Paulf961d392006-11-02 16:11:31 +00001107}
1108
1109void GLAPIENTRY
1110_mesa_GetProgramiv(GLuint program, GLenum pname, GLint *params)
1111{
Brian Paul3bef6002006-11-03 22:15:43 +00001112 GET_CURRENT_CONTEXT(ctx);
1113 GET_PROGRAM(pro, program, "glGetProgramiv");
1114
1115 if (!pro)
1116 return;
1117
1118 switch (pname) {
1119 case GL_DELETE_STATUS:
Brian Paul7c279f42006-11-15 21:35:06 +00001120 *params = (**pro)._container._generic.GetDeleteStatus((struct gl2_generic_intf **) pro);
Brian Paul3bef6002006-11-03 22:15:43 +00001121 break;
1122 case GL_LINK_STATUS:
1123 *params = (**pro).GetLinkStatus(pro);
1124 break;
1125 case GL_VALIDATE_STATUS:
1126 *params = (**pro).GetValidateStatus(pro);
1127 break;
1128 case GL_INFO_LOG_LENGTH:
Brian Paul7c279f42006-11-15 21:35:06 +00001129 *params = (**pro)._container._generic.GetInfoLogLength( (struct gl2_generic_intf **) pro );
Brian Paul3bef6002006-11-03 22:15:43 +00001130 break;
1131 case GL_ATTACHED_SHADERS:
Brian Paul7c279f42006-11-15 21:35:06 +00001132 *params = (**pro)._container.GetAttachedCount( (struct gl2_container_intf **) pro );
Brian Paul3bef6002006-11-03 22:15:43 +00001133 break;
1134 case GL_ACTIVE_ATTRIBUTES:
1135 *params = (**pro).GetActiveAttribCount(pro);
1136 break;
1137 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
1138 *params = (**pro).GetActiveAttribMaxLength(pro);
1139 break;
1140 case GL_ACTIVE_UNIFORMS:
1141 *params = (**pro).GetActiveUniformCount(pro);
1142 break;
1143 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
1144 *params = (**pro).GetActiveUniformMaxLength(pro);
1145 break;
1146 default:
1147 _mesa_error(ctx, GL_INVALID_ENUM, "glGetProgramiv(pname)");
1148 return;
1149 }
Brian Paulf961d392006-11-02 16:11:31 +00001150}
1151
1152void GLAPIENTRY
1153_mesa_GetProgramInfoLog(GLuint program, GLsizei bufSize,
1154 GLsizei *length, GLchar *infoLog)
1155{
1156 _mesa_GetInfoLogARB(program, bufSize, length, infoLog);
1157}
1158
1159void GLAPIENTRY
1160_mesa_GetShaderiv(GLuint shader, GLenum pname, GLint *params)
1161{
Brian Pauld2f80772006-11-03 22:23:47 +00001162 GET_CURRENT_CONTEXT(ctx);
1163 GET_SHADER(sh, shader, "glGetShaderiv");
1164
1165 if (!sh)
1166 return;
1167
1168 switch (pname) {
1169 case GL_SHADER_TYPE:
1170 *params = (**sh).GetSubType(sh);
1171 break;
1172 case GL_DELETE_STATUS:
Brian Paul7c279f42006-11-15 21:35:06 +00001173 *params = (**sh)._generic.GetDeleteStatus((struct gl2_generic_intf **) sh);
Brian Pauld2f80772006-11-03 22:23:47 +00001174 break;
1175 case GL_COMPILE_STATUS:
1176 *params = (**sh).GetCompileStatus(sh);
1177 break;
1178 case GL_INFO_LOG_LENGTH:
Brian Paul7c279f42006-11-15 21:35:06 +00001179 *params = (**sh)._generic.GetInfoLogLength((struct gl2_generic_intf **)sh);
Brian Pauld2f80772006-11-03 22:23:47 +00001180 break;
1181 case GL_SHADER_SOURCE_LENGTH:
1182 {
1183 const GLchar *src = (**sh).GetSource(sh);
1184 *params = src ? (_mesa_strlen(src) + 1) : 0;
1185 }
1186 break;
1187 default:
1188 _mesa_error(ctx, GL_INVALID_ENUM, "glGetShaderiv(pname)");
1189 return;
1190 }
Brian Paulf961d392006-11-02 16:11:31 +00001191}
1192
1193void GLAPIENTRY
1194_mesa_GetShaderInfoLog(GLuint shader, GLsizei bufSize,
1195 GLsizei *length, GLchar *infoLog)
1196{
1197 _mesa_GetInfoLogARB(shader, bufSize, length, infoLog);
1198}
1199
1200GLboolean GLAPIENTRY
Brian Paul12fe1b32006-11-02 16:21:04 +00001201_mesa_IsProgram(GLuint program)
Brian Paulf961d392006-11-02 16:11:31 +00001202{
1203 GET_CURRENT_CONTEXT(ctx);
Brian Paulc9365b72006-11-03 23:32:30 +00001204 GET_PROGRAM(pro, program, "glIsProgram");
1205 if (pro) {
1206 RELEASE_PROGRAM(pro);
1207 return GL_TRUE;
1208 }
1209 else {
1210 return GL_FALSE;
1211 }
Brian Paulf961d392006-11-02 16:11:31 +00001212}
1213
1214GLboolean GLAPIENTRY
1215_mesa_IsShader(GLuint shader)
1216{
1217 GET_CURRENT_CONTEXT(ctx);
Brian Paulc9365b72006-11-03 23:32:30 +00001218 GET_SHADER(sh, shader, "glIsProgram");
1219 if (sh) {
1220 RELEASE_SHADER(sh);
1221 return GL_TRUE;
1222 }
1223 else {
1224 return GL_FALSE;
1225 }
Brian Paulf961d392006-11-02 16:11:31 +00001226}
1227
1228
Brian Paulbdb251b2006-11-03 17:29:31 +00001229/**
1230 ** 2.1 functions
1231 **/
1232
1233void GLAPIENTRY
1234_mesa_UniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose,
1235 const GLfloat *value)
1236{
1237 uniform_matrix(2, 3, "glUniformMatrix2x3fv", GL_FLOAT_MAT2x3,
1238 location, count, transpose, value);
1239}
1240
1241void GLAPIENTRY
1242_mesa_UniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose,
1243 const GLfloat *value)
1244{
1245 uniform_matrix(3, 2, "glUniformMatrix3x2fv", GL_FLOAT_MAT3x2,
1246 location, count, transpose, value);
1247}
1248
1249void GLAPIENTRY
1250_mesa_UniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose,
1251 const GLfloat *value)
1252{
1253 uniform_matrix(2, 4, "glUniformMatrix2x4fv", GL_FLOAT_MAT2x4,
1254 location, count, transpose, value);
1255}
1256
1257void GLAPIENTRY
1258_mesa_UniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose,
1259 const GLfloat *value)
1260{
1261 uniform_matrix(4, 2, "glUniformMatrix4x2fv", GL_FLOAT_MAT4x2,
1262 location, count, transpose, value);
1263}
1264
1265void GLAPIENTRY
1266_mesa_UniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose,
1267 const GLfloat *value)
1268{
1269 uniform_matrix(3, 4, "glUniformMatrix3x4fv", GL_FLOAT_MAT3x4,
1270 location, count, transpose, value);
1271}
1272
1273void GLAPIENTRY
1274_mesa_UniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose,
1275 const GLfloat *value)
1276{
1277 uniform_matrix(4, 3, "glUniformMatrix4x3fv", GL_FLOAT_MAT4x3,
1278 location, count, transpose, value);
1279}
1280
1281
1282
Brianfe1d01c2006-12-13 14:54:47 -07001283#ifdef NEW_SLANG
1284
1285struct gl_linked_program *
1286_mesa_new_linked_program(GLcontext *ctx, GLuint name)
1287{
1288 struct gl_linked_program *linked;
1289 linked = CALLOC_STRUCT(gl_linked_program);
1290 linked->Name = name;
1291 return linked;
1292}
Brian Paulbdb251b2006-11-03 17:29:31 +00001293
1294
Brianfe1d01c2006-12-13 14:54:47 -07001295struct gl_linked_program *
1296_mesa_lookup_linked_program(GLcontext *ctx, GLuint name)
1297{
1298 GET_PROGRAM(pro, name, "_mesa_lookup_linked_program");
1299 if (pro) {
1300 if (!(*pro)->Linked) {
1301 (*pro)->Linked = _mesa_new_linked_program(ctx, name);
1302 }
1303 return (*pro)->Linked;
1304 }
1305 return NULL;
1306}
1307
1308
1309struct gl_program *
1310_mesa_lookup_shader(GLcontext *ctx, GLuint name)
1311{
1312 GET_SHADER(sh, name, "_mesa_lookup_shader");
1313 if (sh)
1314 return (*sh)->Program;
1315 return NULL;
1316}
1317
1318
1319#endif /* NEW_SLANG */
1320
1321
1322#endif /* FEATURE_ARB_shader_objects */
1323
1324
Michal Krol365582d2006-08-01 20:07:31 +00001325
Michal Krol9ac96052006-02-27 14:41:41 +00001326GLvoid
Brian Paule71e4c92006-11-02 16:09:10 +00001327_mesa_init_shaderobjects(GLcontext * ctx)
Michal Krol1d7f7192005-03-25 12:12:50 +00001328{
Brian Paule71e4c92006-11-02 16:09:10 +00001329 ctx->ShaderObjects.CurrentProgram = NULL;
1330 ctx->ShaderObjects._FragmentShaderPresent = GL_FALSE;
1331 ctx->ShaderObjects._VertexShaderPresent = GL_FALSE;
Michal Krol1d7f7192005-03-25 12:12:50 +00001332
Brian Paule71e4c92006-11-02 16:09:10 +00001333 _mesa_init_shaderobjects_3dlabs(ctx);
Michal Krolc1fe4692004-10-27 17:09:10 +00001334}