blob: 24fab9822bd9d06d2a51b18578a0e6847ff0ab43 [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"
Brian57d95312006-12-14 15:03:04 -070037#include "prog_parameter.h"
Michal Krol1d7f7192005-03-25 12:12:50 +000038#include "shaderobjects.h"
Michal Krol6324f732005-01-13 14:12:50 +000039#include "shaderobjects_3dlabs.h"
Brianfe1d01c2006-12-13 14:54:47 -070040#include "slang_link.h"
Michal Krol1d7f7192005-03-25 12:12:50 +000041
Briancc0c8b22006-12-14 13:59:25 -070042#define NEW_SLANG 1
Michal Krol1d7f7192005-03-25 12:12:50 +000043
Michal Krol365582d2006-08-01 20:07:31 +000044#if FEATURE_ARB_shader_objects
45
Michal Krol9ac96052006-02-27 14:41:41 +000046#define RELEASE_GENERIC(x)\
Michal Krola1a02e62006-05-16 09:40:30 +000047 (**x)._unknown.Release ((struct gl2_unknown_intf **) (x))
Michal Krol9ac96052006-02-27 14:41:41 +000048
49#define RELEASE_CONTAINER(x)\
Michal Krola1a02e62006-05-16 09:40:30 +000050 (**x)._generic._unknown.Release ((struct gl2_unknown_intf **) (x))
Michal Krol9ac96052006-02-27 14:41:41 +000051
52#define RELEASE_PROGRAM(x)\
Michal Krola1a02e62006-05-16 09:40:30 +000053 (**x)._container._generic._unknown.Release ((struct gl2_unknown_intf **) (x))
Michal Krol9ac96052006-02-27 14:41:41 +000054
55#define RELEASE_SHADER(x)\
Michal Krola1a02e62006-05-16 09:40:30 +000056 (**x)._generic._unknown.Release ((struct gl2_unknown_intf **) (x))
Michal Krol9ac96052006-02-27 14:41:41 +000057
Brian Paulbdb251b2006-11-03 17:29:31 +000058
59
Michal Krola1a02e62006-05-16 09:40:30 +000060static struct gl2_unknown_intf **
Brian Paule71e4c92006-11-02 16:09:10 +000061lookup_handle(GLcontext * ctx, GLhandleARB handle, enum gl2_uiid uiid,
62 const char *function)
Michal Krola1a02e62006-05-16 09:40:30 +000063{
64 struct gl2_unknown_intf **unk;
Michal Krol9ac96052006-02-27 14:41:41 +000065
Michal Krola1a02e62006-05-16 09:40:30 +000066 /*
Brian Paulbdb251b2006-11-03 17:29:31 +000067 * Note: _mesa_HashLookup() requires non-zero input values, so the
68 * passed-in handle value must be checked beforehand.
Michal Krola1a02e62006-05-16 09:40:30 +000069 */
70 if (handle == 0) {
Brian Paule71e4c92006-11-02 16:09:10 +000071 _mesa_error(ctx, GL_INVALID_VALUE, function);
Michal Krola1a02e62006-05-16 09:40:30 +000072 return NULL;
73 }
Brian Paule71e4c92006-11-02 16:09:10 +000074 _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
Brian Paul3bef6002006-11-03 22:15:43 +000075 unk = (struct gl2_unknown_intf **) _mesa_HashLookup(ctx->Shared->GL2Objects,
76 handle);
Brian Paule71e4c92006-11-02 16:09:10 +000077 _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
Brian Paulbdb251b2006-11-03 17:29:31 +000078
79 if (unk == NULL) {
Brian Paule71e4c92006-11-02 16:09:10 +000080 _mesa_error(ctx, GL_INVALID_VALUE, function);
Brian Paulbdb251b2006-11-03 17:29:31 +000081 }
Michal Krola1a02e62006-05-16 09:40:30 +000082 else {
Brian Paule71e4c92006-11-02 16:09:10 +000083 unk = (**unk).QueryInterface(unk, uiid);
Michal Krola1a02e62006-05-16 09:40:30 +000084 if (unk == NULL)
Brian Paule71e4c92006-11-02 16:09:10 +000085 _mesa_error(ctx, GL_INVALID_OPERATION, function);
Michal Krola1a02e62006-05-16 09:40:30 +000086 }
87 return unk;
88}
Michal Krol9ac96052006-02-27 14:41:41 +000089
90#define GET_GENERIC(x, handle, function)\
Michal Krola1a02e62006-05-16 09:40:30 +000091 struct gl2_generic_intf **x = (struct gl2_generic_intf **)\
92 lookup_handle (ctx, handle, UIID_GENERIC, function);
Michal Krol9ac96052006-02-27 14:41:41 +000093
94#define GET_CONTAINER(x, handle, function)\
Michal Krola1a02e62006-05-16 09:40:30 +000095 struct gl2_container_intf **x = (struct gl2_container_intf **)\
96 lookup_handle (ctx, handle, UIID_CONTAINER, function);
Michal Krol9ac96052006-02-27 14:41:41 +000097
98#define GET_PROGRAM(x, handle, function)\
Michal Krola1a02e62006-05-16 09:40:30 +000099 struct gl2_program_intf **x = (struct gl2_program_intf **)\
100 lookup_handle (ctx, handle, UIID_PROGRAM, function);
Michal Krol9ac96052006-02-27 14:41:41 +0000101
102#define GET_SHADER(x, handle, function)\
Michal Krola1a02e62006-05-16 09:40:30 +0000103 struct gl2_shader_intf **x = (struct gl2_shader_intf **)\
104 lookup_handle (ctx, handle, UIID_SHADER, function);
Michal Krol9ac96052006-02-27 14:41:41 +0000105
Brian Paul7e6701c2006-11-03 21:51:58 +0000106
107#define GET_LINKED_PROGRAM(x, handle, function) \
108 GET_PROGRAM(x, handle, function); \
109 if (x && (**x).GetLinkStatus(x) == GL_FALSE) { \
110 RELEASE_PROGRAM(x); \
111 _mesa_error(ctx, GL_INVALID_OPERATION, function); \
112 x = NULL; \
Michal Krola1a02e62006-05-16 09:40:30 +0000113 }
Michal Krol9ac96052006-02-27 14:41:41 +0000114
Brian Paul7e6701c2006-11-03 21:51:58 +0000115#define GET_CURRENT_LINKED_PROGRAM(x, function) \
116 struct gl2_program_intf **x = ctx->ShaderObjects.CurrentProgram; \
117 if (!x || (**x).GetLinkStatus(x) == GL_FALSE) { \
118 _mesa_error(ctx, GL_INVALID_OPERATION, function); \
119 return; \
Michal Krola1a02e62006-05-16 09:40:30 +0000120 }
Michal Krol9ac96052006-02-27 14:41:41 +0000121
Brian Paul7e6701c2006-11-03 21:51:58 +0000122
123
Michal Krold55de652006-04-18 10:30:29 +0000124#define IS_NAME_WITH_GL_PREFIX(x) ((x)[0] == 'g' && (x)[1] == 'l' && (x)[2] == '_')
125
Michal Krol9ac96052006-02-27 14:41:41 +0000126
127GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000128_mesa_DeleteObjectARB(GLhandleARB obj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000129{
Brian Paule71e4c92006-11-02 16:09:10 +0000130 if (obj != 0) {
Michal Krola1a02e62006-05-16 09:40:30 +0000131 GET_CURRENT_CONTEXT(ctx);
132 GET_GENERIC(gen, obj, "glDeleteObjectARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000133
Brian Paule71e4c92006-11-02 16:09:10 +0000134 if (gen != NULL) {
135 (**gen).Delete(gen);
Michal Krola1a02e62006-05-16 09:40:30 +0000136 RELEASE_GENERIC(gen);
137 }
138 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000139}
140
141GLhandleARB GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000142_mesa_GetHandleARB(GLenum pname)
Michal Krol1d7f7192005-03-25 12:12:50 +0000143{
Brian Paule71e4c92006-11-02 16:09:10 +0000144 GET_CURRENT_CONTEXT(ctx);
Michal Krol1d7f7192005-03-25 12:12:50 +0000145
Brian Paule71e4c92006-11-02 16:09:10 +0000146 switch (pname) {
Michal Krola1a02e62006-05-16 09:40:30 +0000147 case GL_PROGRAM_OBJECT_ARB:
148 {
149 struct gl2_program_intf **pro = ctx->ShaderObjects.CurrentProgram;
Michal Krol9ac96052006-02-27 14:41:41 +0000150
Michal Krola1a02e62006-05-16 09:40:30 +0000151 if (pro != NULL)
Brian Paule71e4c92006-11-02 16:09:10 +0000152 return (**pro)._container._generic.
153 GetName((struct gl2_generic_intf **) (pro));
Michal Krola1a02e62006-05-16 09:40:30 +0000154 }
155 break;
Brian Paule71e4c92006-11-02 16:09:10 +0000156 default:
157 _mesa_error(ctx, GL_INVALID_ENUM, "glGetHandleARB");
158 }
Michal Krol6324f732005-01-13 14:12:50 +0000159
Brian Paule71e4c92006-11-02 16:09:10 +0000160 return 0;
Michal Krolc1fe4692004-10-27 17:09:10 +0000161}
162
Michal Krol9ac96052006-02-27 14:41:41 +0000163GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000164_mesa_DetachObjectARB(GLhandleARB containerObj, GLhandleARB attachedObj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000165{
Brian Paule71e4c92006-11-02 16:09:10 +0000166 GET_CURRENT_CONTEXT(ctx);
167 GET_CONTAINER(con, containerObj, "glDetachObjectARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000168
Brian Paule71e4c92006-11-02 16:09:10 +0000169 if (con != NULL) {
170 GET_GENERIC(att, attachedObj, "glDetachObjectARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000171
Brian Paule71e4c92006-11-02 16:09:10 +0000172 if (att != NULL) {
173 (**con).Detach(con, att);
174 RELEASE_GENERIC(att);
175 }
176 RELEASE_CONTAINER(con);
177 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000178}
179
180GLhandleARB GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000181_mesa_CreateShaderObjectARB(GLenum shaderType)
Michal Krol1d7f7192005-03-25 12:12:50 +0000182{
Brian Paule71e4c92006-11-02 16:09:10 +0000183 return _mesa_3dlabs_create_shader_object(shaderType);
Michal Krolc1fe4692004-10-27 17:09:10 +0000184}
185
Michal Krol9ac96052006-02-27 14:41:41 +0000186GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000187_mesa_ShaderSourceARB(GLhandleARB shaderObj, GLsizei count,
188 const GLcharARB ** string, const GLint * length)
Michal Krol1d7f7192005-03-25 12:12:50 +0000189{
Brian Paule71e4c92006-11-02 16:09:10 +0000190 GET_CURRENT_CONTEXT(ctx);
191 GLint *offsets;
192 GLsizei i;
193 GLcharARB *source;
194 GET_SHADER(sha, shaderObj, "glShaderSourceARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000195
Brian Paule71e4c92006-11-02 16:09:10 +0000196 if (sha == NULL)
197 return;
Brian Paul93269622006-04-14 03:43:39 +0000198
Brian Paule71e4c92006-11-02 16:09:10 +0000199 if (string == NULL) {
200 RELEASE_SHADER(sha);
201 _mesa_error(ctx, GL_INVALID_VALUE, "glShaderSourceARB");
202 return;
203 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000204
Brian Paule71e4c92006-11-02 16:09:10 +0000205 /*
Brianfe1d01c2006-12-13 14:54:47 -0700206 * This array holds offsets of where the appropriate string ends, thus the
207 * last element will be set to the total length of the source code.
Brian Paule71e4c92006-11-02 16:09:10 +0000208 */
209 offsets = (GLint *) _mesa_malloc(count * sizeof(GLint));
210 if (offsets == NULL) {
211 RELEASE_SHADER(sha);
212 _mesa_error(ctx, GL_OUT_OF_MEMORY, "glShaderSourceARB");
213 return;
214 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000215
Brian Paule71e4c92006-11-02 16:09:10 +0000216 for (i = 0; i < count; i++) {
217 if (string[i] == NULL) {
218 _mesa_free((GLvoid *) offsets);
219 RELEASE_SHADER(sha);
220 _mesa_error(ctx, GL_INVALID_VALUE, "glShaderSourceARB");
221 return;
222 }
223 if (length == NULL || length[i] < 0)
224 offsets[i] = _mesa_strlen(string[i]);
225 else
226 offsets[i] = length[i];
227 /* accumulate string lengths */
228 if (i > 0)
229 offsets[i] += offsets[i - 1];
230 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000231
Brianfe1d01c2006-12-13 14:54:47 -0700232 source = (GLcharARB *) _mesa_malloc((offsets[count - 1] + 1) *
233 sizeof(GLcharARB));
Brian Paule71e4c92006-11-02 16:09:10 +0000234 if (source == NULL) {
235 _mesa_free((GLvoid *) offsets);
236 RELEASE_SHADER(sha);
237 _mesa_error(ctx, GL_OUT_OF_MEMORY, "glShaderSourceARB");
238 return;
239 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000240
Brian Paule71e4c92006-11-02 16:09:10 +0000241 for (i = 0; i < count; i++) {
242 GLint start = (i > 0) ? offsets[i - 1] : 0;
243 _mesa_memcpy(source + start, string[i],
244 (offsets[i] - start) * sizeof(GLcharARB));
245 }
246 source[offsets[count - 1]] = '\0';
Michal Krol1d7f7192005-03-25 12:12:50 +0000247
Brian Paule71e4c92006-11-02 16:09:10 +0000248 (**sha).SetSource(sha, source, offsets, count);
249 RELEASE_SHADER(sha);
Michal Krolc1fe4692004-10-27 17:09:10 +0000250}
251
Brian Paule71e4c92006-11-02 16:09:10 +0000252GLvoid GLAPIENTRY
253_mesa_CompileShaderARB(GLhandleARB shaderObj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000254{
Brian Paule71e4c92006-11-02 16:09:10 +0000255 GET_CURRENT_CONTEXT(ctx);
256 GET_SHADER(sha, shaderObj, "glCompileShaderARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000257
Brian Paule71e4c92006-11-02 16:09:10 +0000258 if (sha != NULL) {
259 (**sha).Compile(sha);
260 RELEASE_SHADER(sha);
261 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000262}
263
264GLhandleARB GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000265_mesa_CreateProgramObjectARB(GLvoid)
Michal Krolc1fe4692004-10-27 17:09:10 +0000266{
Brian Paule71e4c92006-11-02 16:09:10 +0000267 return _mesa_3dlabs_create_program_object();
Michal Krolc1fe4692004-10-27 17:09:10 +0000268}
269
Michal Krol9ac96052006-02-27 14:41:41 +0000270GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000271_mesa_AttachObjectARB(GLhandleARB containerObj, GLhandleARB obj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000272{
Brian Paule71e4c92006-11-02 16:09:10 +0000273 GET_CURRENT_CONTEXT(ctx);
274 GET_CONTAINER(con, containerObj, "glAttachObjectARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000275
Brian Paule71e4c92006-11-02 16:09:10 +0000276 if (con != NULL) {
277 GET_GENERIC(att, obj, "glAttachObjectARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000278
Brian Paule71e4c92006-11-02 16:09:10 +0000279 if (att != NULL) {
280 (**con).Attach(con, att);
281 RELEASE_GENERIC(att);
282 }
283 RELEASE_CONTAINER(con);
284 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000285}
286
Michal Krol9ac96052006-02-27 14:41:41 +0000287GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000288_mesa_LinkProgramARB(GLhandleARB programObj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000289{
Brian Paule71e4c92006-11-02 16:09:10 +0000290 GET_CURRENT_CONTEXT(ctx);
291 GET_PROGRAM(pro, programObj, "glLinkProgramARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000292
Brian Paule71e4c92006-11-02 16:09:10 +0000293 if (pro != NULL) {
294 (**pro).Link(pro);
295 if (pro == ctx->ShaderObjects.CurrentProgram) {
296 if ((**pro).GetLinkStatus(pro))
297 _mesa_UseProgramObjectARB(programObj);
298 else
299 _mesa_UseProgramObjectARB(0);
300 }
301 RELEASE_PROGRAM(pro);
302 }
Brianfe1d01c2006-12-13 14:54:47 -0700303#if NEW_SLANG
304 {
305 struct gl_linked_program *linked
306 = _mesa_lookup_linked_program(ctx, programObj);
307 _slang_link2(ctx, programObj, linked);
308 }
309#endif
Michal Krolc1fe4692004-10-27 17:09:10 +0000310}
311
Michal Krol9ac96052006-02-27 14:41:41 +0000312GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000313_mesa_UseProgramObjectARB(GLhandleARB programObj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000314{
Brian Paule71e4c92006-11-02 16:09:10 +0000315 GET_CURRENT_CONTEXT(ctx);
Michal Krola1a02e62006-05-16 09:40:30 +0000316 struct gl2_program_intf **program = NULL;
Michal Krol9ac96052006-02-27 14:41:41 +0000317
Brian Paule71e4c92006-11-02 16:09:10 +0000318 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000319
Brian Paule71e4c92006-11-02 16:09:10 +0000320 if (programObj != 0) {
Brian Paul82a9ba92006-11-15 21:38:26 +0000321 GET_PROGRAM(pro, programObj, "glUseProgramObjectARB(program)");
Michal Krol1d7f7192005-03-25 12:12:50 +0000322
Brian Paule71e4c92006-11-02 16:09:10 +0000323 if (pro == NULL)
324 return;
Michal Krol1d7f7192005-03-25 12:12:50 +0000325
Brian Paule71e4c92006-11-02 16:09:10 +0000326 if ((**pro).GetLinkStatus(pro) == GL_FALSE) {
327 RELEASE_PROGRAM(pro);
Brian Paul82a9ba92006-11-15 21:38:26 +0000328 _mesa_error(ctx, GL_INVALID_OPERATION, "glUseProgramObjectARB(not linked)");
Brian Paule71e4c92006-11-02 16:09:10 +0000329 return;
330 }
Michal Krol9ac96052006-02-27 14:41:41 +0000331
Brian Paule71e4c92006-11-02 16:09:10 +0000332 program = pro;
Brian Paul93269622006-04-14 03:43:39 +0000333
Brian Paule71e4c92006-11-02 16:09:10 +0000334 ctx->ShaderObjects._VertexShaderPresent =
335 (**pro).IsShaderPresent(pro, GL_VERTEX_SHADER_ARB);
336 ctx->ShaderObjects._FragmentShaderPresent =
337 (**pro).IsShaderPresent(pro, GL_FRAGMENT_SHADER_ARB);
338 }
339 else {
340 ctx->ShaderObjects._VertexShaderPresent = GL_FALSE;
341 ctx->ShaderObjects._FragmentShaderPresent = GL_FALSE;
342 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000343
Brian Paule71e4c92006-11-02 16:09:10 +0000344 if (ctx->ShaderObjects.CurrentProgram != NULL)
345 RELEASE_PROGRAM(ctx->ShaderObjects.CurrentProgram);
346 ctx->ShaderObjects.CurrentProgram = program;
Brianfe1d01c2006-12-13 14:54:47 -0700347
348#if NEW_SLANG
349 if (programObj) {
350 ctx->ShaderObjects.Linked = _mesa_lookup_linked_program(ctx, programObj);
351 }
352 else {
353 ctx->ShaderObjects.Linked = NULL;
354 }
355#endif
Michal Krolc1fe4692004-10-27 17:09:10 +0000356}
357
Michal Krol9ac96052006-02-27 14:41:41 +0000358GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000359_mesa_ValidateProgramARB(GLhandleARB programObj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000360{
Brian Paule71e4c92006-11-02 16:09:10 +0000361 GET_CURRENT_CONTEXT(ctx);
362 GET_PROGRAM(pro, programObj, "glValidateProgramARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000363
Brian Paule71e4c92006-11-02 16:09:10 +0000364 if (pro != NULL) {
365 (**pro).Validate(pro);
366 RELEASE_PROGRAM(pro);
367 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000368}
369
Brian Paul2659ee92006-11-03 21:30:16 +0000370
371/**
372 * Helper function for all the _mesa_Uniform*() functions below.
373 */
374static INLINE void
375uniform(GLint location, GLsizei count, const GLvoid *values, GLenum type,
376 const char *caller)
Michal Krol9ac96052006-02-27 14:41:41 +0000377{
Brian Paule71e4c92006-11-02 16:09:10 +0000378 GET_CURRENT_CONTEXT(ctx);
Brian Paul2659ee92006-11-03 21:30:16 +0000379 GET_CURRENT_LINKED_PROGRAM(pro, caller);
Brian Paul93269622006-04-14 03:43:39 +0000380
Brian Paule71e4c92006-11-02 16:09:10 +0000381 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol9ac96052006-02-27 14:41:41 +0000382
Brianfe1d01c2006-12-13 14:54:47 -0700383#if NEW_SLANG
384 if (ctx->ShaderObjects.Linked) {
385 struct gl_linked_program *linked = ctx->ShaderObjects.Linked;
Briancc0c8b22006-12-14 13:59:25 -0700386 if (location >= 0 && location < linked->Uniforms->NumParameters) {
387 GLfloat *v = linked->Uniforms->ParameterValues[location];
Brianfe1d01c2006-12-13 14:54:47 -0700388 const GLfloat *fValues = (const GLfloat *) values; /* XXX */
389 GLint i;
390 if (type == GL_FLOAT_VEC4)
391 count *= 4;
392 else if (type == GL_FLOAT_VEC3)
393 count *= 3;
394 else
395 abort();
396
397 for (i = 0; i < count; i++)
398 v[i] = fValues[i];
399 return;
400 }
401 }
Briancc0c8b22006-12-14 13:59:25 -0700402#else
Brian Paul2659ee92006-11-03 21:30:16 +0000403 if (!(**pro).WriteUniform(pro, location, count, values, type))
404 _mesa_error(ctx, GL_INVALID_OPERATION, caller);
Briancc0c8b22006-12-14 13:59:25 -0700405#endif
Brian Paul2659ee92006-11-03 21:30:16 +0000406}
407
408
409GLvoid GLAPIENTRY
410_mesa_Uniform1fARB(GLint location, GLfloat v0)
411{
412 uniform(location, 1, &v0, GL_FLOAT, "glUniform1fARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000413}
414
Michal Krol9ac96052006-02-27 14:41:41 +0000415GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000416_mesa_Uniform2fARB(GLint location, GLfloat v0, GLfloat v1)
Michal Krol1d7f7192005-03-25 12:12:50 +0000417{
Brian Paul2659ee92006-11-03 21:30:16 +0000418 GLfloat v[2];
419 v[0] = v0;
420 v[1] = v1;
421 uniform(location, 1, v, GL_FLOAT_VEC2, "glUniform2fARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000422}
423
Michal Krol9ac96052006-02-27 14:41:41 +0000424GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000425_mesa_Uniform3fARB(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
Michal Krol1d7f7192005-03-25 12:12:50 +0000426{
Brian Paul2659ee92006-11-03 21:30:16 +0000427 GLfloat v[3];
428 v[0] = v0;
429 v[1] = v1;
430 v[2] = v2;
431 uniform(location, 1, v, GL_FLOAT_VEC3, "glUniform3fARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000432}
433
Michal Krol9ac96052006-02-27 14:41:41 +0000434GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000435_mesa_Uniform4fARB(GLint location, GLfloat v0, GLfloat v1, GLfloat v2,
436 GLfloat v3)
Michal Krol1d7f7192005-03-25 12:12:50 +0000437{
Brian Paul2659ee92006-11-03 21:30:16 +0000438 GLfloat v[4];
439 v[0] = v0;
440 v[1] = v1;
441 v[2] = v2;
442 v[3] = v3;
443 uniform(location, 1, v, GL_FLOAT_VEC4, "glUniform4fARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000444}
445
Michal Krol9ac96052006-02-27 14:41:41 +0000446GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000447_mesa_Uniform1iARB(GLint location, GLint v0)
Michal Krol1d7f7192005-03-25 12:12:50 +0000448{
Brian Paul2659ee92006-11-03 21:30:16 +0000449 uniform(location, 1, &v0, GL_INT, "glUniform1iARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000450}
451
Michal Krol9ac96052006-02-27 14:41:41 +0000452GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000453_mesa_Uniform2iARB(GLint location, GLint v0, GLint v1)
Michal Krol1d7f7192005-03-25 12:12:50 +0000454{
Brian Paul2659ee92006-11-03 21:30:16 +0000455 GLint v[2];
456 v[0] = v0;
457 v[1] = v1;
458 uniform(location, 1, v, GL_INT_VEC2, "glUniform2iARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000459}
460
Michal Krol9ac96052006-02-27 14:41:41 +0000461GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000462_mesa_Uniform3iARB(GLint location, GLint v0, GLint v1, GLint v2)
Michal Krol1d7f7192005-03-25 12:12:50 +0000463{
Brian Paul2659ee92006-11-03 21:30:16 +0000464 GLint v[3];
465 v[0] = v0;
466 v[1] = v1;
467 v[2] = v2;
468 uniform(location, 1, v, GL_INT_VEC3, "glUniform3iARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000469}
470
Michal Krol9ac96052006-02-27 14:41:41 +0000471GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000472_mesa_Uniform4iARB(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
Michal Krol1d7f7192005-03-25 12:12:50 +0000473{
Brian Paul2659ee92006-11-03 21:30:16 +0000474 GLint v[4];
475 v[0] = v0;
476 v[1] = v1;
477 v[2] = v2;
478 v[3] = v3;
479 uniform(location, 1, v, GL_INT_VEC4, "glUniform4iARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000480}
481
Michal Krol9ac96052006-02-27 14:41:41 +0000482GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000483_mesa_Uniform1fvARB(GLint location, GLsizei count, const GLfloat * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000484{
Brian Paul2659ee92006-11-03 21:30:16 +0000485 uniform(location, count, value, GL_FLOAT, "glUniform1fvARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000486}
487
Michal Krol9ac96052006-02-27 14:41:41 +0000488GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000489_mesa_Uniform2fvARB(GLint location, GLsizei count, const GLfloat * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000490{
Brian Paul2659ee92006-11-03 21:30:16 +0000491 uniform(location, count, value, GL_FLOAT_VEC2, "glUniform2fvARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000492}
493
Michal Krol9ac96052006-02-27 14:41:41 +0000494GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000495_mesa_Uniform3fvARB(GLint location, GLsizei count, const GLfloat * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000496{
Brian Paul2659ee92006-11-03 21:30:16 +0000497 uniform(location, count, value, GL_FLOAT_VEC3, "glUniform3fvARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000498}
499
Michal Krol9ac96052006-02-27 14:41:41 +0000500GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000501_mesa_Uniform4fvARB(GLint location, GLsizei count, const GLfloat * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000502{
Brian Paul2659ee92006-11-03 21:30:16 +0000503 uniform(location, count, value, GL_FLOAT_VEC4, "glUniform4fvARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000504}
505
Michal Krol9ac96052006-02-27 14:41:41 +0000506GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000507_mesa_Uniform1ivARB(GLint location, GLsizei count, const GLint * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000508{
Brian Paul2659ee92006-11-03 21:30:16 +0000509 uniform(location, count, value, GL_INT, "glUniform1ivARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000510}
511
Michal Krol9ac96052006-02-27 14:41:41 +0000512GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000513_mesa_Uniform2ivARB(GLint location, GLsizei count, const GLint * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000514{
Brian Paul2659ee92006-11-03 21:30:16 +0000515 uniform(location, count, value, GL_INT_VEC2, "glUniform2ivARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000516}
517
Michal Krol9ac96052006-02-27 14:41:41 +0000518GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000519_mesa_Uniform3ivARB(GLint location, GLsizei count, const GLint * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000520{
Brian Paul2659ee92006-11-03 21:30:16 +0000521 uniform(location, count, value, GL_INT_VEC3, "glUniform3ivARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000522}
523
Michal Krol9ac96052006-02-27 14:41:41 +0000524GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000525_mesa_Uniform4ivARB(GLint location, GLsizei count, const GLint * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000526{
Brian Paul2659ee92006-11-03 21:30:16 +0000527 uniform(location, count, value, GL_INT_VEC4, "glUniform4ivARB");
Michal Krolc1fe4692004-10-27 17:09:10 +0000528}
529
Brian Paul93269622006-04-14 03:43:39 +0000530
Brian Paulbdb251b2006-11-03 17:29:31 +0000531/**
532 * Helper function used by UniformMatrix**vARB() functions below.
533 */
534static void
535uniform_matrix(GLint cols, GLint rows, const char *caller,
536 GLenum matrixType,
537 GLint location, GLsizei count, GLboolean transpose,
538 const GLfloat *values)
539{
540 const GLint matElements = rows * cols;
541 GET_CURRENT_CONTEXT(ctx);
542 GET_CURRENT_LINKED_PROGRAM(pro, caller);
543
544 if (values == NULL) {
545 _mesa_error(ctx, GL_INVALID_VALUE, caller);
Brian Paule71e4c92006-11-02 16:09:10 +0000546 return;
547 }
Michal Krold55de652006-04-18 10:30:29 +0000548
Brian Paule71e4c92006-11-02 16:09:10 +0000549 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
Michal Krol1d7f7192005-03-25 12:12:50 +0000550
Brian Paulbdb251b2006-11-03 17:29:31 +0000551 if (transpose) {
552 GLfloat *trans, *pt;
553 const GLfloat *pv;
554 GLint i, j, k;
555
556 trans = (GLfloat *) _mesa_malloc(count * matElements * sizeof(GLfloat));
557 if (!trans) {
558 _mesa_error(ctx, GL_OUT_OF_MEMORY, caller);
559 return;
Brian Paule71e4c92006-11-02 16:09:10 +0000560 }
Brian Paulbdb251b2006-11-03 17:29:31 +0000561
562 pt = trans;
563 pv = values;
564 for (i = 0; i < count; i++) {
565 /* transpose from pv matrix into pt matrix */
566 for (j = 0; j < cols; j++) {
567 for (k = 0; k < rows; k++) {
568 /* XXX verify this */
569 pt[j * rows + k] = pv[k * cols + j];
570 }
571 }
572 pt += matElements;
573 pv += matElements;
Brian Paule71e4c92006-11-02 16:09:10 +0000574 }
Brian Paulbdb251b2006-11-03 17:29:31 +0000575
576 if (!(**pro).WriteUniform(pro, location, count, trans, matrixType))
577 _mesa_error(ctx, GL_INVALID_OPERATION, caller);
578 _mesa_free(trans);
Brian Paule71e4c92006-11-02 16:09:10 +0000579 }
Brian Paulbdb251b2006-11-03 17:29:31 +0000580 else {
581 if (!(**pro).WriteUniform(pro, location, count, values, matrixType))
582 _mesa_error(ctx, GL_INVALID_OPERATION, caller);
583 }
584}
585
586
587GLvoid GLAPIENTRY
588_mesa_UniformMatrix2fvARB(GLint location, GLsizei count, GLboolean transpose,
589 const GLfloat * value)
590{
591 uniform_matrix(2, 2, "glUniformMatrix2fvARB", GL_FLOAT_MAT2,
592 location, count, transpose, value);
Michal Krolc1fe4692004-10-27 17:09:10 +0000593}
594
Michal Krol9ac96052006-02-27 14:41:41 +0000595GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000596_mesa_UniformMatrix3fvARB(GLint location, GLsizei count, GLboolean transpose,
597 const GLfloat * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000598{
Brian Paulbdb251b2006-11-03 17:29:31 +0000599 uniform_matrix(3, 3, "glUniformMatrix3fvARB", GL_FLOAT_MAT3,
600 location, count, transpose, value);
Michal Krolc1fe4692004-10-27 17:09:10 +0000601}
602
Michal Krol9ac96052006-02-27 14:41:41 +0000603GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000604_mesa_UniformMatrix4fvARB(GLint location, GLsizei count, GLboolean transpose,
605 const GLfloat * value)
Michal Krol1d7f7192005-03-25 12:12:50 +0000606{
Brian Paulbdb251b2006-11-03 17:29:31 +0000607 uniform_matrix(4, 4, "glUniformMatrix4fvARB", GL_FLOAT_MAT4,
608 location, count, transpose, value);
Michal Krol1d7f7192005-03-25 12:12:50 +0000609}
610
611static GLboolean
Brian Paule71e4c92006-11-02 16:09:10 +0000612_mesa_get_object_parameter(GLhandleARB obj, GLenum pname, GLvoid * params,
613 GLboolean * integral, GLint * size)
Michal Krol1d7f7192005-03-25 12:12:50 +0000614{
Brian Paule71e4c92006-11-02 16:09:10 +0000615 GET_CURRENT_CONTEXT(ctx);
616 GLint *ipar = (GLint *) params;
Michal Krol1d7f7192005-03-25 12:12:50 +0000617
Brian Paule71e4c92006-11-02 16:09:10 +0000618 /* set default values */
Brian Paulbdb251b2006-11-03 17:29:31 +0000619 *integral = GL_TRUE; /* indicates param type, TRUE: GLint, FALSE: GLfloat */
620 *size = 1; /* param array size */
Michal Krol1d7f7192005-03-25 12:12:50 +0000621
Brian Paule71e4c92006-11-02 16:09:10 +0000622 switch (pname) {
623 case GL_OBJECT_TYPE_ARB:
624 case GL_OBJECT_DELETE_STATUS_ARB:
625 case GL_OBJECT_INFO_LOG_LENGTH_ARB:
626 {
627 GET_GENERIC(gen, obj, "glGetObjectParameterivARB");
Michal Krol9ac96052006-02-27 14:41:41 +0000628
Brian Paule71e4c92006-11-02 16:09:10 +0000629 if (gen == NULL)
630 return GL_FALSE;
Michal Krol9ac96052006-02-27 14:41:41 +0000631
Brian Paule71e4c92006-11-02 16:09:10 +0000632 switch (pname) {
633 case GL_OBJECT_TYPE_ARB:
634 *ipar = (**gen).GetType(gen);
635 break;
636 case GL_OBJECT_DELETE_STATUS_ARB:
637 *ipar = (**gen).GetDeleteStatus(gen);
638 break;
Michal Krola1a02e62006-05-16 09:40:30 +0000639 case GL_OBJECT_INFO_LOG_LENGTH_ARB:
Brian Paule71e4c92006-11-02 16:09:10 +0000640 *ipar = (**gen).GetInfoLogLength(gen);
Michal Krola1a02e62006-05-16 09:40:30 +0000641 break;
Brian Paule71e4c92006-11-02 16:09:10 +0000642 }
Michal Krol9ac96052006-02-27 14:41:41 +0000643
Brian Paule71e4c92006-11-02 16:09:10 +0000644 RELEASE_GENERIC(gen);
645 }
646 break;
647 case GL_OBJECT_SUBTYPE_ARB:
648 case GL_OBJECT_COMPILE_STATUS_ARB:
649 case GL_OBJECT_SHADER_SOURCE_LENGTH_ARB:
650 {
651 GET_SHADER(sha, obj, "glGetObjectParameterivARB");
Michal Krol9ac96052006-02-27 14:41:41 +0000652
Brian Paule71e4c92006-11-02 16:09:10 +0000653 if (sha == NULL)
654 return GL_FALSE;
Michal Krol9ac96052006-02-27 14:41:41 +0000655
Brian Paule71e4c92006-11-02 16:09:10 +0000656 switch (pname) {
657 case GL_OBJECT_SUBTYPE_ARB:
658 *ipar = (**sha).GetSubType(sha);
659 break;
660 case GL_OBJECT_COMPILE_STATUS_ARB:
661 *ipar = (**sha).GetCompileStatus(sha);
662 break;
663 case GL_OBJECT_SHADER_SOURCE_LENGTH_ARB:
664 {
665 const GLcharARB *src = (**sha).GetSource(sha);
Brian Paule71e4c92006-11-02 16:09:10 +0000666 if (src == NULL)
667 *ipar = 0;
668 else
669 *ipar = _mesa_strlen(src) + 1;
670 }
671 break;
672 }
Michal Krol9ac96052006-02-27 14:41:41 +0000673
Brian Paule71e4c92006-11-02 16:09:10 +0000674 RELEASE_SHADER(sha);
675 }
676 break;
677 case GL_OBJECT_LINK_STATUS_ARB:
678 case GL_OBJECT_VALIDATE_STATUS_ARB:
679 case GL_OBJECT_ATTACHED_OBJECTS_ARB:
680 case GL_OBJECT_ACTIVE_UNIFORMS_ARB:
681 case GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB:
682 {
683 GET_PROGRAM(pro, obj, "glGetObjectParameterivARB");
Michal Krol9ac96052006-02-27 14:41:41 +0000684
Brian Paule71e4c92006-11-02 16:09:10 +0000685 if (pro == NULL)
686 return GL_FALSE;
Michal Krol9ac96052006-02-27 14:41:41 +0000687
Brian Paule71e4c92006-11-02 16:09:10 +0000688 switch (pname) {
689 case GL_OBJECT_LINK_STATUS_ARB:
690 *ipar = (**pro).GetLinkStatus(pro);
691 break;
692 case GL_OBJECT_VALIDATE_STATUS_ARB:
693 *ipar = (**pro).GetValidateStatus(pro);
694 break;
Michal Krola1a02e62006-05-16 09:40:30 +0000695 case GL_OBJECT_ATTACHED_OBJECTS_ARB:
Brian Paule71e4c92006-11-02 16:09:10 +0000696 *ipar =
697 (**pro)._container.
698 GetAttachedCount((struct gl2_container_intf **) (pro));
Michal Krola1a02e62006-05-16 09:40:30 +0000699 break;
Brian Paule71e4c92006-11-02 16:09:10 +0000700 case GL_OBJECT_ACTIVE_UNIFORMS_ARB:
701 *ipar = (**pro).GetActiveUniformCount(pro);
702 break;
703 case GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB:
704 *ipar = (**pro).GetActiveUniformMaxLength(pro);
705 break;
706 case GL_OBJECT_ACTIVE_ATTRIBUTES_ARB:
707 *ipar = (**pro).GetActiveAttribCount(pro);
708 break;
709 case GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB:
710 *ipar = (**pro).GetActiveAttribMaxLength(pro);
711 break;
712 }
Michal Krol9ac96052006-02-27 14:41:41 +0000713
Brian Paule71e4c92006-11-02 16:09:10 +0000714 RELEASE_PROGRAM(pro);
715 }
716 break;
717 default:
718 _mesa_error(ctx, GL_INVALID_ENUM, "glGetObjectParameterivARB");
719 return GL_FALSE;
720 }
Michal Krol1d7f7192005-03-25 12:12:50 +0000721
Brian Paule71e4c92006-11-02 16:09:10 +0000722 return GL_TRUE;
Michal Krol1d7f7192005-03-25 12:12:50 +0000723}
724
Michal Krol9ac96052006-02-27 14:41:41 +0000725GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000726_mesa_GetObjectParameterfvARB(GLhandleARB obj, GLenum pname, GLfloat * params)
Michal Krol1d7f7192005-03-25 12:12:50 +0000727{
Brian Paule71e4c92006-11-02 16:09:10 +0000728 GET_CURRENT_CONTEXT(ctx);
729 GLboolean integral;
730 GLint size;
Michal Krol1d7f7192005-03-25 12:12:50 +0000731
Brian Paule71e4c92006-11-02 16:09:10 +0000732 if (params == NULL) {
733 _mesa_error(ctx, GL_INVALID_VALUE, "glGetObjectParameterfvARB");
734 return;
735 }
Michal Krold55de652006-04-18 10:30:29 +0000736
Brian Paule71e4c92006-11-02 16:09:10 +0000737 assert(sizeof(GLfloat) == sizeof(GLint));
Michal Krol1d7f7192005-03-25 12:12:50 +0000738
Brian Paulbdb251b2006-11-03 17:29:31 +0000739 if (_mesa_get_object_parameter(obj, pname, (GLvoid *) params,
740 &integral, &size)) {
Brian Paule71e4c92006-11-02 16:09:10 +0000741 if (integral) {
742 GLint i;
Brian Paule71e4c92006-11-02 16:09:10 +0000743 for (i = 0; i < size; i++)
744 params[i] = (GLfloat) ((GLint *) params)[i];
745 }
Brian Paulbdb251b2006-11-03 17:29:31 +0000746 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000747}
748
Michal Krol9ac96052006-02-27 14:41:41 +0000749GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000750_mesa_GetObjectParameterivARB(GLhandleARB obj, GLenum pname, GLint * params)
Michal Krol1d7f7192005-03-25 12:12:50 +0000751{
Brian Paule71e4c92006-11-02 16:09:10 +0000752 GET_CURRENT_CONTEXT(ctx);
753 GLboolean integral;
754 GLint size;
Michal Krol1d7f7192005-03-25 12:12:50 +0000755
Brian Paule71e4c92006-11-02 16:09:10 +0000756 if (params == NULL) {
757 _mesa_error(ctx, GL_INVALID_VALUE, "glGetObjectParameterivARB");
758 return;
759 }
Michal Krold55de652006-04-18 10:30:29 +0000760
Brian Paule71e4c92006-11-02 16:09:10 +0000761 assert(sizeof(GLfloat) == sizeof(GLint));
Michal Krol1d7f7192005-03-25 12:12:50 +0000762
Brian Paulbdb251b2006-11-03 17:29:31 +0000763 if (_mesa_get_object_parameter(obj, pname, (GLvoid *) params,
764 &integral, &size)) {
Brian Paule71e4c92006-11-02 16:09:10 +0000765 if (!integral) {
766 GLint i;
Brian Paule71e4c92006-11-02 16:09:10 +0000767 for (i = 0; i < size; i++)
768 params[i] = (GLint) ((GLfloat *) params)[i];
769 }
Brian Paulbdb251b2006-11-03 17:29:31 +0000770 }
Michal Krolc1fe4692004-10-27 17:09:10 +0000771}
772
Brian Paul93269622006-04-14 03:43:39 +0000773
774/**
775 * Copy string from <src> to <dst>, up to maxLength characters, returning
776 * length of <dst> in <length>.
777 * \param src the strings source
778 * \param maxLength max chars to copy
779 * \param length returns numberof chars copied
780 * \param dst the string destination
781 */
Michal Krol9ac96052006-02-27 14:41:41 +0000782static GLvoid
Brian Paule71e4c92006-11-02 16:09:10 +0000783copy_string(const GLcharARB * src, GLsizei maxLength, GLsizei * length,
784 GLcharARB * dst)
Michal Krol1d7f7192005-03-25 12:12:50 +0000785{
Brian Paule71e4c92006-11-02 16:09:10 +0000786 GLsizei len;
787 for (len = 0; len < maxLength - 1 && src && src[len]; len++)
788 dst[len] = src[len];
789 if (maxLength > 0)
790 dst[len] = 0;
791 if (length)
792 *length = len;
Michal Krolc1fe4692004-10-27 17:09:10 +0000793}
794
Brian Paul93269622006-04-14 03:43:39 +0000795
Michal Krol9ac96052006-02-27 14:41:41 +0000796GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000797_mesa_GetInfoLogARB(GLhandleARB obj, GLsizei maxLength, GLsizei * length,
798 GLcharARB * infoLog)
Michal Krol1d7f7192005-03-25 12:12:50 +0000799{
Brian Paule71e4c92006-11-02 16:09:10 +0000800 GET_CURRENT_CONTEXT(ctx);
801 GET_GENERIC(gen, obj, "glGetInfoLogARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000802
Brian Paule71e4c92006-11-02 16:09:10 +0000803 if (gen == NULL)
804 return;
Michal Krold55de652006-04-18 10:30:29 +0000805
Brian Paule71e4c92006-11-02 16:09:10 +0000806 if (infoLog == NULL)
807 _mesa_error(ctx, GL_INVALID_VALUE, "glGetInfoLogARB");
Michal Krola1a02e62006-05-16 09:40:30 +0000808 else {
Brian Paule71e4c92006-11-02 16:09:10 +0000809 GLsizei actualsize = (**gen).GetInfoLogLength(gen);
Michal Krola1a02e62006-05-16 09:40:30 +0000810 if (actualsize > maxLength)
811 actualsize = maxLength;
Brian Paule71e4c92006-11-02 16:09:10 +0000812 (**gen).GetInfoLog(gen, actualsize, infoLog);
Michal Krola1a02e62006-05-16 09:40:30 +0000813 if (length != NULL)
814 *length = (actualsize > 0) ? actualsize - 1 : 0;
815 }
Brian Paule71e4c92006-11-02 16:09:10 +0000816 RELEASE_GENERIC(gen);
Michal Krol1d7f7192005-03-25 12:12:50 +0000817}
818
Michal Krol9ac96052006-02-27 14:41:41 +0000819GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000820_mesa_GetAttachedObjectsARB(GLhandleARB containerObj, GLsizei maxCount,
821 GLsizei * count, GLhandleARB * obj)
Michal Krol1d7f7192005-03-25 12:12:50 +0000822{
Brian Paule71e4c92006-11-02 16:09:10 +0000823 GET_CURRENT_CONTEXT(ctx);
824 GET_CONTAINER(con, containerObj, "glGetAttachedObjectsARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000825
Brian Paule71e4c92006-11-02 16:09:10 +0000826 if (con == NULL)
827 return;
Michal Krold55de652006-04-18 10:30:29 +0000828
Brian Paule71e4c92006-11-02 16:09:10 +0000829 if (obj == NULL)
830 _mesa_error(ctx, GL_INVALID_VALUE, "glGetAttachedObjectsARB");
831 else {
832 GLsizei cnt, i;
Michal Krold55de652006-04-18 10:30:29 +0000833
Brian Paule71e4c92006-11-02 16:09:10 +0000834 cnt = (**con).GetAttachedCount(con);
835 if (cnt > maxCount)
836 cnt = maxCount;
837 if (count != NULL)
838 *count = cnt;
Michal Krol9ac96052006-02-27 14:41:41 +0000839
Brian Paule71e4c92006-11-02 16:09:10 +0000840 for (i = 0; i < cnt; i++) {
841 struct gl2_generic_intf **x = (**con).GetAttached(con, i);
842 obj[i] = (**x).GetName(x);
843 RELEASE_GENERIC(x);
844 }
845 }
846 RELEASE_CONTAINER(con);
Michal Krol9ac96052006-02-27 14:41:41 +0000847}
Michal Krolc1fe4692004-10-27 17:09:10 +0000848
849GLint GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000850_mesa_GetUniformLocationARB(GLhandleARB programObj, const GLcharARB * name)
Michal Krol1d7f7192005-03-25 12:12:50 +0000851{
Brianfe1d01c2006-12-13 14:54:47 -0700852#if NEW_SLANG
853 GET_CURRENT_CONTEXT(ctx);
854
855 if (ctx->ShaderObjects.Linked) {
Briancc0c8b22006-12-14 13:59:25 -0700856 const struct gl_linked_program *linked = ctx->ShaderObjects.Linked;
Brianfe1d01c2006-12-13 14:54:47 -0700857 GLuint loc;
Briancc0c8b22006-12-14 13:59:25 -0700858 for (loc = 0; loc < linked->Uniforms->NumParameters; loc++) {
859 const struct gl_program_parameter *u
860 = linked->Uniforms->Parameters + loc;
861 if (u->Type == PROGRAM_UNIFORM && !strcmp(u->Name, name)) {
Brianfe1d01c2006-12-13 14:54:47 -0700862 return loc;
863 }
864 }
865 }
866 return -1;
867#else
Brian Paule71e4c92006-11-02 16:09:10 +0000868 GET_CURRENT_CONTEXT(ctx);
869 GLint loc = -1;
870 GET_LINKED_PROGRAM(pro, programObj, "glGetUniformLocationARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000871
Brian Paul7e6701c2006-11-03 21:51:58 +0000872 if (!pro)
Brian Paule71e4c92006-11-02 16:09:10 +0000873 return -1;
Michal Krold55de652006-04-18 10:30:29 +0000874
Brian Paule71e4c92006-11-02 16:09:10 +0000875 if (name == NULL)
876 _mesa_error(ctx, GL_INVALID_VALUE, "glGetUniformLocationARB");
877 else {
878 if (!IS_NAME_WITH_GL_PREFIX(name))
879 loc = (**pro).GetUniformLocation(pro, name);
880 }
881 RELEASE_PROGRAM(pro);
882 return loc;
Brianfe1d01c2006-12-13 14:54:47 -0700883#endif
Michal Krolc1fe4692004-10-27 17:09:10 +0000884}
885
Michal Krol9ac96052006-02-27 14:41:41 +0000886GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000887_mesa_GetActiveUniformARB(GLhandleARB programObj, GLuint index,
888 GLsizei maxLength, GLsizei * length, GLint * size,
889 GLenum * type, GLcharARB * name)
Michal Krol1d7f7192005-03-25 12:12:50 +0000890{
Brian Paule71e4c92006-11-02 16:09:10 +0000891 GET_CURRENT_CONTEXT(ctx);
892 GET_PROGRAM(pro, programObj, "glGetActiveUniformARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000893
Brian Paule71e4c92006-11-02 16:09:10 +0000894 if (pro == NULL)
895 return;
Michal Krold55de652006-04-18 10:30:29 +0000896
Brian Paule71e4c92006-11-02 16:09:10 +0000897 if (size == NULL || type == NULL || name == NULL)
898 _mesa_error(ctx, GL_INVALID_VALUE, "glGetActiveUniformARB");
899 else {
900 if (index < (**pro).GetActiveUniformCount(pro))
901 (**pro).GetActiveUniform(pro, index, maxLength, length, size, type,
902 name);
903 else
904 _mesa_error(ctx, GL_INVALID_VALUE, "glGetActiveUniformARB");
905 }
906 RELEASE_PROGRAM(pro);
Michal Krolc1fe4692004-10-27 17:09:10 +0000907}
908
Michal Krol9ac96052006-02-27 14:41:41 +0000909GLvoid GLAPIENTRY
Brian Paulbdb251b2006-11-03 17:29:31 +0000910_mesa_GetUniformfvARB(GLhandleARB programObj, GLint location, GLfloat * params)
Michal Krol1d7f7192005-03-25 12:12:50 +0000911{
Brian Paule71e4c92006-11-02 16:09:10 +0000912 GET_CURRENT_CONTEXT(ctx);
913 GET_LINKED_PROGRAM(pro, programObj, "glGetUniformfvARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000914
Brian Paul7e6701c2006-11-03 21:51:58 +0000915 if (!pro)
916 return;
917
918 if (!(**pro).ReadUniform(pro, location, 1, params, GL_FLOAT))
919 _mesa_error(ctx, GL_INVALID_OPERATION, "glGetUniformfvARB");
920
921 RELEASE_PROGRAM(pro);
Michal Krolc1fe4692004-10-27 17:09:10 +0000922}
923
Michal Krol9ac96052006-02-27 14:41:41 +0000924GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000925_mesa_GetUniformivARB(GLhandleARB programObj, GLint location, GLint * params)
Michal Krol1d7f7192005-03-25 12:12:50 +0000926{
Brian Paule71e4c92006-11-02 16:09:10 +0000927 GET_CURRENT_CONTEXT(ctx);
928 GET_LINKED_PROGRAM(pro, programObj, "glGetUniformivARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000929
Brian Paul7e6701c2006-11-03 21:51:58 +0000930 if (!pro)
931 return;
932
933 if (!(**pro).ReadUniform(pro, location, 1, params, GL_INT))
934 _mesa_error(ctx, GL_INVALID_OPERATION, "glGetUniformivARB");
935 RELEASE_PROGRAM(pro);
Michal Krolc1fe4692004-10-27 17:09:10 +0000936}
937
Michal Krol9ac96052006-02-27 14:41:41 +0000938GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000939_mesa_GetShaderSourceARB(GLhandleARB obj, GLsizei maxLength, GLsizei * length,
940 GLcharARB * source)
Michal Krol1d7f7192005-03-25 12:12:50 +0000941{
Brian Paule71e4c92006-11-02 16:09:10 +0000942 GET_CURRENT_CONTEXT(ctx);
943 GET_SHADER(sha, obj, "glGetShaderSourceARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000944
Brian Paule71e4c92006-11-02 16:09:10 +0000945 if (sha == NULL)
946 return;
Michal Krold55de652006-04-18 10:30:29 +0000947
Brian Paule71e4c92006-11-02 16:09:10 +0000948 if (source == NULL)
949 _mesa_error(ctx, GL_INVALID_VALUE, "glGetShaderSourceARB");
950 else
951 copy_string((**sha).GetSource(sha), maxLength, length, source);
952 RELEASE_SHADER(sha);
Michal Krolc1fe4692004-10-27 17:09:10 +0000953}
954
955/* GL_ARB_vertex_shader */
956
Michal Krol9ac96052006-02-27 14:41:41 +0000957GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000958_mesa_BindAttribLocationARB(GLhandleARB programObj, GLuint index,
959 const GLcharARB * name)
Michal Krol1d7f7192005-03-25 12:12:50 +0000960{
Brian Paule71e4c92006-11-02 16:09:10 +0000961 GET_CURRENT_CONTEXT(ctx);
962 GET_PROGRAM(pro, programObj, "glBindAttribLocationARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000963
Brian Paule71e4c92006-11-02 16:09:10 +0000964 if (pro == NULL)
965 return;
Michal Krold55de652006-04-18 10:30:29 +0000966
Brian Paule71e4c92006-11-02 16:09:10 +0000967 if (name == NULL || index >= MAX_VERTEX_ATTRIBS)
968 _mesa_error(ctx, GL_INVALID_VALUE, "glBindAttribLocationARB");
969 else if (IS_NAME_WITH_GL_PREFIX(name))
970 _mesa_error(ctx, GL_INVALID_OPERATION, "glBindAttribLocationARB");
971 else
972 (**pro).OverrideAttribBinding(pro, index, name);
973 RELEASE_PROGRAM(pro);
Michal Krolc1fe4692004-10-27 17:09:10 +0000974}
975
Michal Krol9ac96052006-02-27 14:41:41 +0000976GLvoid GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000977_mesa_GetActiveAttribARB(GLhandleARB programObj, GLuint index,
978 GLsizei maxLength, GLsizei * length, GLint * size,
979 GLenum * type, GLcharARB * name)
Michal Krol1d7f7192005-03-25 12:12:50 +0000980{
Brian Paule71e4c92006-11-02 16:09:10 +0000981 GET_CURRENT_CONTEXT(ctx);
982 GET_PROGRAM(pro, programObj, "glGetActiveAttribARB");
Michal Krol1d7f7192005-03-25 12:12:50 +0000983
Brian Paule71e4c92006-11-02 16:09:10 +0000984 if (pro == NULL)
985 return;
Michal Krold55de652006-04-18 10:30:29 +0000986
Brian Paule71e4c92006-11-02 16:09:10 +0000987 if (name == NULL || index >= (**pro).GetActiveAttribCount(pro))
988 _mesa_error(ctx, GL_INVALID_VALUE, "glGetActiveAttribARB");
989 else
990 (**pro).GetActiveAttrib(pro, index, maxLength, length, size, type,
991 name);
992 RELEASE_PROGRAM(pro);
Michal Krolc1fe4692004-10-27 17:09:10 +0000993}
994
995GLint GLAPIENTRY
Brian Paule71e4c92006-11-02 16:09:10 +0000996_mesa_GetAttribLocationARB(GLhandleARB programObj, const GLcharARB * name)
Michal Krol1d7f7192005-03-25 12:12:50 +0000997{
Brian Paule71e4c92006-11-02 16:09:10 +0000998 GET_CURRENT_CONTEXT(ctx);
999 GLint loc = -1;
1000 GET_LINKED_PROGRAM(pro, programObj, "glGetAttribLocationARB");
Michal Krol1d7f7192005-03-25 12:12:50 +00001001
Brian Paul7e6701c2006-11-03 21:51:58 +00001002 if (!pro)
Brian Paule71e4c92006-11-02 16:09:10 +00001003 return -1;
Michal Krold55de652006-04-18 10:30:29 +00001004
Brian Paule71e4c92006-11-02 16:09:10 +00001005 if (name == NULL)
1006 _mesa_error(ctx, GL_INVALID_VALUE, "glGetAttribLocationARB");
1007 else if (!IS_NAME_WITH_GL_PREFIX(name))
1008 loc = (**pro).GetAttribLocation(pro, name);
1009 RELEASE_PROGRAM(pro);
1010 return loc;
Michal Krolc1fe4692004-10-27 17:09:10 +00001011}
1012
Brian Paulf961d392006-11-02 16:11:31 +00001013
1014/**
1015 ** OpenGL 2.0 functions which basically wrap the ARB_shader functions
1016 **/
1017
1018void GLAPIENTRY
1019_mesa_AttachShader(GLuint program, GLuint shader)
1020{
1021 _mesa_AttachObjectARB(program, shader);
Brianfe1d01c2006-12-13 14:54:47 -07001022#if NEW_SLANG
1023 {
1024 GET_CURRENT_CONTEXT(ctx);
1025 struct gl_linked_program *linked
1026 = _mesa_lookup_linked_program(ctx, program);
1027 struct gl_program *prog
1028 = _mesa_lookup_shader(ctx, shader);
1029 const GLuint n = linked->NumShaders;
1030 GLuint i;
1031 if (!linked || !prog) {
1032 _mesa_error(ctx, GL_INVALID_OPERATION,
1033 "glAttachShader(bad program or shader name)");
1034 return;
1035 }
1036 for (i = 0; i < n; i++) {
1037 if (linked->Shaders[i] == prog) {
1038 /* already attached */
1039 return;
1040 }
1041 }
1042 /* append to list */
1043 linked->Shaders = _mesa_realloc(linked->Shaders,
1044 n * sizeof(struct gl_program *),
1045 (n + 1) * sizeof(struct gl_program *));
1046 linked->Shaders[n] = prog;
1047 prog->RefCount++;
1048 linked->NumShaders++;
1049 }
1050#endif
Brian Paulf961d392006-11-02 16:11:31 +00001051}
1052
1053
1054GLuint GLAPIENTRY
1055_mesa_CreateShader(GLenum type)
1056{
1057 return (GLuint) _mesa_CreateShaderObjectARB(type);
1058}
1059
1060GLuint GLAPIENTRY
1061_mesa_CreateProgram(void)
1062{
1063 return (GLuint) _mesa_CreateProgramObjectARB();
1064}
1065
1066void GLAPIENTRY
1067_mesa_DeleteProgram(GLuint program)
1068{
1069 _mesa_DeleteObjectARB(program);
1070}
1071
1072
1073void GLAPIENTRY
1074_mesa_DeleteShader(GLuint shader)
1075{
1076 _mesa_DeleteObjectARB(shader);
1077}
1078
1079void GLAPIENTRY
1080_mesa_DetachShader(GLuint program, GLuint shader)
1081{
1082 _mesa_DetachObjectARB(program, shader);
1083}
1084
1085void GLAPIENTRY
1086_mesa_GetAttachedShaders(GLuint program, GLsizei maxCount,
1087 GLsizei *count, GLuint *obj)
1088{
1089 _mesa_GetAttachedObjectsARB(program, maxCount, count, obj);
Brianfe1d01c2006-12-13 14:54:47 -07001090#if NEW_SLANG
1091 {
1092 GET_CURRENT_CONTEXT(ctx);
1093 struct gl_linked_program *linked
1094 = _mesa_lookup_linked_program(ctx, program);
1095 if (linked) {
1096 GLuint i;
1097 for (i = 0; i < maxCount && i < linked->NumShaders; i++) {
1098 obj[i] = linked->Shaders[i]->Id;
1099 }
1100 if (count)
1101 *count = i;
1102 }
1103 else {
1104 _mesa_error(ctx, GL_INVALID_OPERATION, "glGetAttachedShaders");
1105 }
1106 }
1107#endif
Brian Paulf961d392006-11-02 16:11:31 +00001108}
1109
1110void GLAPIENTRY
1111_mesa_GetProgramiv(GLuint program, GLenum pname, GLint *params)
1112{
Brian Paul3bef6002006-11-03 22:15:43 +00001113 GET_CURRENT_CONTEXT(ctx);
1114 GET_PROGRAM(pro, program, "glGetProgramiv");
1115
1116 if (!pro)
1117 return;
1118
1119 switch (pname) {
1120 case GL_DELETE_STATUS:
Brian Paul7c279f42006-11-15 21:35:06 +00001121 *params = (**pro)._container._generic.GetDeleteStatus((struct gl2_generic_intf **) pro);
Brian Paul3bef6002006-11-03 22:15:43 +00001122 break;
1123 case GL_LINK_STATUS:
1124 *params = (**pro).GetLinkStatus(pro);
1125 break;
1126 case GL_VALIDATE_STATUS:
1127 *params = (**pro).GetValidateStatus(pro);
1128 break;
1129 case GL_INFO_LOG_LENGTH:
Brian Paul7c279f42006-11-15 21:35:06 +00001130 *params = (**pro)._container._generic.GetInfoLogLength( (struct gl2_generic_intf **) pro );
Brian Paul3bef6002006-11-03 22:15:43 +00001131 break;
1132 case GL_ATTACHED_SHADERS:
Brian Paul7c279f42006-11-15 21:35:06 +00001133 *params = (**pro)._container.GetAttachedCount( (struct gl2_container_intf **) pro );
Brian Paul3bef6002006-11-03 22:15:43 +00001134 break;
1135 case GL_ACTIVE_ATTRIBUTES:
1136 *params = (**pro).GetActiveAttribCount(pro);
1137 break;
1138 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
1139 *params = (**pro).GetActiveAttribMaxLength(pro);
1140 break;
1141 case GL_ACTIVE_UNIFORMS:
1142 *params = (**pro).GetActiveUniformCount(pro);
1143 break;
1144 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
1145 *params = (**pro).GetActiveUniformMaxLength(pro);
1146 break;
1147 default:
1148 _mesa_error(ctx, GL_INVALID_ENUM, "glGetProgramiv(pname)");
1149 return;
1150 }
Brian Paulf961d392006-11-02 16:11:31 +00001151}
1152
1153void GLAPIENTRY
1154_mesa_GetProgramInfoLog(GLuint program, GLsizei bufSize,
1155 GLsizei *length, GLchar *infoLog)
1156{
1157 _mesa_GetInfoLogARB(program, bufSize, length, infoLog);
1158}
1159
1160void GLAPIENTRY
1161_mesa_GetShaderiv(GLuint shader, GLenum pname, GLint *params)
1162{
Brian Pauld2f80772006-11-03 22:23:47 +00001163 GET_CURRENT_CONTEXT(ctx);
1164 GET_SHADER(sh, shader, "glGetShaderiv");
1165
1166 if (!sh)
1167 return;
1168
1169 switch (pname) {
1170 case GL_SHADER_TYPE:
1171 *params = (**sh).GetSubType(sh);
1172 break;
1173 case GL_DELETE_STATUS:
Brian Paul7c279f42006-11-15 21:35:06 +00001174 *params = (**sh)._generic.GetDeleteStatus((struct gl2_generic_intf **) sh);
Brian Pauld2f80772006-11-03 22:23:47 +00001175 break;
1176 case GL_COMPILE_STATUS:
1177 *params = (**sh).GetCompileStatus(sh);
1178 break;
1179 case GL_INFO_LOG_LENGTH:
Brian Paul7c279f42006-11-15 21:35:06 +00001180 *params = (**sh)._generic.GetInfoLogLength((struct gl2_generic_intf **)sh);
Brian Pauld2f80772006-11-03 22:23:47 +00001181 break;
1182 case GL_SHADER_SOURCE_LENGTH:
1183 {
1184 const GLchar *src = (**sh).GetSource(sh);
1185 *params = src ? (_mesa_strlen(src) + 1) : 0;
1186 }
1187 break;
1188 default:
1189 _mesa_error(ctx, GL_INVALID_ENUM, "glGetShaderiv(pname)");
1190 return;
1191 }
Brian Paulf961d392006-11-02 16:11:31 +00001192}
1193
1194void GLAPIENTRY
1195_mesa_GetShaderInfoLog(GLuint shader, GLsizei bufSize,
1196 GLsizei *length, GLchar *infoLog)
1197{
1198 _mesa_GetInfoLogARB(shader, bufSize, length, infoLog);
1199}
1200
1201GLboolean GLAPIENTRY
Brian Paul12fe1b32006-11-02 16:21:04 +00001202_mesa_IsProgram(GLuint program)
Brian Paulf961d392006-11-02 16:11:31 +00001203{
1204 GET_CURRENT_CONTEXT(ctx);
Brian Paulc9365b72006-11-03 23:32:30 +00001205 GET_PROGRAM(pro, program, "glIsProgram");
1206 if (pro) {
1207 RELEASE_PROGRAM(pro);
1208 return GL_TRUE;
1209 }
1210 else {
1211 return GL_FALSE;
1212 }
Brian Paulf961d392006-11-02 16:11:31 +00001213}
1214
1215GLboolean GLAPIENTRY
1216_mesa_IsShader(GLuint shader)
1217{
1218 GET_CURRENT_CONTEXT(ctx);
Brian Paulc9365b72006-11-03 23:32:30 +00001219 GET_SHADER(sh, shader, "glIsProgram");
1220 if (sh) {
1221 RELEASE_SHADER(sh);
1222 return GL_TRUE;
1223 }
1224 else {
1225 return GL_FALSE;
1226 }
Brian Paulf961d392006-11-02 16:11:31 +00001227}
1228
1229
Brian Paulbdb251b2006-11-03 17:29:31 +00001230/**
1231 ** 2.1 functions
1232 **/
1233
1234void GLAPIENTRY
1235_mesa_UniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose,
1236 const GLfloat *value)
1237{
1238 uniform_matrix(2, 3, "glUniformMatrix2x3fv", GL_FLOAT_MAT2x3,
1239 location, count, transpose, value);
1240}
1241
1242void GLAPIENTRY
1243_mesa_UniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose,
1244 const GLfloat *value)
1245{
1246 uniform_matrix(3, 2, "glUniformMatrix3x2fv", GL_FLOAT_MAT3x2,
1247 location, count, transpose, value);
1248}
1249
1250void GLAPIENTRY
1251_mesa_UniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose,
1252 const GLfloat *value)
1253{
1254 uniform_matrix(2, 4, "glUniformMatrix2x4fv", GL_FLOAT_MAT2x4,
1255 location, count, transpose, value);
1256}
1257
1258void GLAPIENTRY
1259_mesa_UniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose,
1260 const GLfloat *value)
1261{
1262 uniform_matrix(4, 2, "glUniformMatrix4x2fv", GL_FLOAT_MAT4x2,
1263 location, count, transpose, value);
1264}
1265
1266void GLAPIENTRY
1267_mesa_UniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose,
1268 const GLfloat *value)
1269{
1270 uniform_matrix(3, 4, "glUniformMatrix3x4fv", GL_FLOAT_MAT3x4,
1271 location, count, transpose, value);
1272}
1273
1274void GLAPIENTRY
1275_mesa_UniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose,
1276 const GLfloat *value)
1277{
1278 uniform_matrix(4, 3, "glUniformMatrix4x3fv", GL_FLOAT_MAT4x3,
1279 location, count, transpose, value);
1280}
1281
1282
1283
Brianfe1d01c2006-12-13 14:54:47 -07001284#ifdef NEW_SLANG
1285
1286struct gl_linked_program *
1287_mesa_new_linked_program(GLcontext *ctx, GLuint name)
1288{
1289 struct gl_linked_program *linked;
1290 linked = CALLOC_STRUCT(gl_linked_program);
1291 linked->Name = name;
1292 return linked;
1293}
Brian Paulbdb251b2006-11-03 17:29:31 +00001294
1295
Brianfe1d01c2006-12-13 14:54:47 -07001296struct gl_linked_program *
1297_mesa_lookup_linked_program(GLcontext *ctx, GLuint name)
1298{
1299 GET_PROGRAM(pro, name, "_mesa_lookup_linked_program");
1300 if (pro) {
1301 if (!(*pro)->Linked) {
1302 (*pro)->Linked = _mesa_new_linked_program(ctx, name);
1303 }
1304 return (*pro)->Linked;
1305 }
1306 return NULL;
1307}
1308
1309
1310struct gl_program *
1311_mesa_lookup_shader(GLcontext *ctx, GLuint name)
1312{
1313 GET_SHADER(sh, name, "_mesa_lookup_shader");
1314 if (sh)
1315 return (*sh)->Program;
1316 return NULL;
1317}
1318
1319
1320#endif /* NEW_SLANG */
1321
1322
1323#endif /* FEATURE_ARB_shader_objects */
1324
1325
Michal Krol365582d2006-08-01 20:07:31 +00001326
Michal Krol9ac96052006-02-27 14:41:41 +00001327GLvoid
Brian Paule71e4c92006-11-02 16:09:10 +00001328_mesa_init_shaderobjects(GLcontext * ctx)
Michal Krol1d7f7192005-03-25 12:12:50 +00001329{
Brian Paule71e4c92006-11-02 16:09:10 +00001330 ctx->ShaderObjects.CurrentProgram = NULL;
1331 ctx->ShaderObjects._FragmentShaderPresent = GL_FALSE;
1332 ctx->ShaderObjects._VertexShaderPresent = GL_FALSE;
Michal Krol1d7f7192005-03-25 12:12:50 +00001333
Brian Paule71e4c92006-11-02 16:09:10 +00001334 _mesa_init_shaderobjects_3dlabs(ctx);
Michal Krolc1fe4692004-10-27 17:09:10 +00001335}