2 * Mesa 3-D graphics library
5 * Copyright (C) 2004-2006 Brian Paul All Rights Reserved.
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:
14 * The above copyright notice and this permission notice shall be included
15 * in all copies or substantial portions of the Software.
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.
26 * \file shaderobjects.c
27 * ARB_shader_objects state management functions
35 #include "shaderobjects.h"
36 #include "shaderobjects_3dlabs.h"
39 #if FEATURE_ARB_shader_objects
41 #define RELEASE_GENERIC(x)\
42 (**x)._unknown.Release ((struct gl2_unknown_intf **) (x))
44 #define RELEASE_CONTAINER(x)\
45 (**x)._generic._unknown.Release ((struct gl2_unknown_intf **) (x))
47 #define RELEASE_PROGRAM(x)\
48 (**x)._container._generic._unknown.Release ((struct gl2_unknown_intf **) (x))
50 #define RELEASE_SHADER(x)\
51 (**x)._generic._unknown.Release ((struct gl2_unknown_intf **) (x))
53 static struct gl2_unknown_intf
**
54 lookup_handle (GLcontext
*ctx
, GLhandleARB handle
, enum gl2_uiid uiid
, const char *function
)
56 struct gl2_unknown_intf
**unk
;
59 * Note: _mesa_HashLookup() requires non-zero input values, so the passed-in handle value
60 * must be checked beforehand.
63 _mesa_error (ctx
, GL_INVALID_VALUE
, function
);
66 _glthread_LOCK_MUTEX (ctx
->Shared
->Mutex
);
67 unk
= (struct gl2_unknown_intf
**) (_mesa_HashLookup (ctx
->Shared
->GL2Objects
, handle
));
68 _glthread_UNLOCK_MUTEX (ctx
->Shared
->Mutex
);
70 _mesa_error (ctx
, GL_INVALID_VALUE
, function
);
72 unk
= (**unk
).QueryInterface (unk
, uiid
);
74 _mesa_error (ctx
, GL_INVALID_OPERATION
, function
);
79 #define GET_GENERIC(x, handle, function)\
80 struct gl2_generic_intf **x = (struct gl2_generic_intf **)\
81 lookup_handle (ctx, handle, UIID_GENERIC, function);
83 #define GET_CONTAINER(x, handle, function)\
84 struct gl2_container_intf **x = (struct gl2_container_intf **)\
85 lookup_handle (ctx, handle, UIID_CONTAINER, function);
87 #define GET_PROGRAM(x, handle, function)\
88 struct gl2_program_intf **x = (struct gl2_program_intf **)\
89 lookup_handle (ctx, handle, UIID_PROGRAM, function);
91 #define GET_SHADER(x, handle, function)\
92 struct gl2_shader_intf **x = (struct gl2_shader_intf **)\
93 lookup_handle (ctx, handle, UIID_SHADER, function);
95 #define GET_LINKED_PROGRAM(x, handle, function)\
96 GET_PROGRAM(x, handle, function);\
97 if (x != NULL && (**x).GetLinkStatus (x) == GL_FALSE) {\
100 _mesa_error (ctx, GL_INVALID_OPERATION, function);\
103 #define GET_CURRENT_LINKED_PROGRAM(x, function)\
104 struct gl2_program_intf **x = NULL;\
105 if (ctx->ShaderObjects.CurrentProgram == NULL)\
106 _mesa_error (ctx, GL_INVALID_OPERATION, function);\
108 x = ctx->ShaderObjects.CurrentProgram;\
109 if (x != NULL && (**x).GetLinkStatus (x) == GL_FALSE) {\
111 _mesa_error (ctx, GL_INVALID_OPERATION, function);\
115 #define IS_NAME_WITH_GL_PREFIX(x) ((x)[0] == 'g' && (x)[1] == 'l' && (x)[2] == '_')
119 _mesa_DeleteObjectARB (GLhandleARB obj
)
123 GET_CURRENT_CONTEXT(ctx
);
124 GET_GENERIC(gen
, obj
, "glDeleteObjectARB");
128 (**gen
).Delete (gen
);
129 RELEASE_GENERIC(gen
);
134 GLhandleARB GLAPIENTRY
135 _mesa_GetHandleARB (GLenum pname
)
137 GET_CURRENT_CONTEXT(ctx
);
141 case GL_PROGRAM_OBJECT_ARB
:
143 struct gl2_program_intf
**pro
= ctx
->ShaderObjects
.CurrentProgram
;
146 return (**pro
)._container
._generic
.GetName ((struct gl2_generic_intf
**) (pro
));
150 _mesa_error (ctx
, GL_INVALID_ENUM
, "glGetHandleARB");
157 _mesa_DetachObjectARB (GLhandleARB containerObj
, GLhandleARB attachedObj
)
159 GET_CURRENT_CONTEXT(ctx
);
160 GET_CONTAINER(con
, containerObj
, "glDetachObjectARB");
164 GET_GENERIC(att
, attachedObj
, "glDetachObjectARB");
168 (**con
).Detach (con
, att
);
169 RELEASE_GENERIC(att
);
171 RELEASE_CONTAINER(con
);
175 GLhandleARB GLAPIENTRY
176 _mesa_CreateShaderObjectARB (GLenum shaderType
)
178 return _mesa_3dlabs_create_shader_object (shaderType
);
182 _mesa_ShaderSourceARB (GLhandleARB shaderObj
, GLsizei count
, const GLcharARB
**string
,
185 GET_CURRENT_CONTEXT(ctx
);
189 GET_SHADER(sha
, shaderObj
, "glShaderSourceARB");
197 _mesa_error (ctx
, GL_INVALID_VALUE
, "glShaderSourceARB");
202 * This array holds offsets of where the appropriate string ends, thus the last
203 * element will be set to the total length of the source code.
205 offsets
= (GLint
*) _mesa_malloc (count
* sizeof (GLint
));
209 _mesa_error (ctx
, GL_OUT_OF_MEMORY
, "glShaderSourceARB");
213 for (i
= 0; i
< count
; i
++)
215 if (string
[i
] == NULL
)
217 _mesa_free ((GLvoid
*) offsets
);
219 _mesa_error (ctx
, GL_INVALID_VALUE
, "glShaderSourceARB");
222 if (length
== NULL
|| length
[i
] < 0)
223 offsets
[i
] = _mesa_strlen (string
[i
]);
225 offsets
[i
] = length
[i
];
226 /* accumulate string lengths */
228 offsets
[i
] += offsets
[i
- 1];
231 source
= (GLcharARB
*) _mesa_malloc ((offsets
[count
- 1] + 1) * sizeof (GLcharARB
));
234 _mesa_free ((GLvoid
*) offsets
);
236 _mesa_error (ctx
, GL_OUT_OF_MEMORY
, "glShaderSourceARB");
240 for (i
= 0; i
< count
; i
++)
242 GLint start
= (i
> 0) ? offsets
[i
- 1] : 0;
243 _mesa_memcpy (source
+ start
, string
[i
], (offsets
[i
] - start
) * sizeof (GLcharARB
));
245 source
[offsets
[count
- 1]] = '\0';
247 (**sha
).SetSource (sha
, source
, offsets
, count
);
252 _mesa_CompileShaderARB (GLhandleARB shaderObj
)
254 GET_CURRENT_CONTEXT(ctx
);
255 GET_SHADER(sha
, shaderObj
, "glCompileShaderARB");
259 (**sha
).Compile (sha
);
264 GLhandleARB GLAPIENTRY
265 _mesa_CreateProgramObjectARB (GLvoid
)
267 return _mesa_3dlabs_create_program_object ();
271 _mesa_AttachObjectARB (GLhandleARB containerObj
, GLhandleARB obj
)
273 GET_CURRENT_CONTEXT(ctx
);
274 GET_CONTAINER(con
, containerObj
, "glAttachObjectARB");
278 GET_GENERIC(att
, obj
, "glAttachObjectARB");
282 (**con
).Attach (con
, att
);
283 RELEASE_GENERIC(att
);
285 RELEASE_CONTAINER(con
);
290 _mesa_LinkProgramARB (GLhandleARB programObj
)
292 GET_CURRENT_CONTEXT(ctx
);
293 GET_PROGRAM(pro
, programObj
, "glLinkProgramARB");
298 if (pro
== ctx
->ShaderObjects
.CurrentProgram
)
300 if ((**pro
).GetLinkStatus (pro
))
301 _mesa_UseProgramObjectARB (programObj
);
303 _mesa_UseProgramObjectARB (0);
305 RELEASE_PROGRAM(pro
);
310 _mesa_UseProgramObjectARB (GLhandleARB programObj
)
312 GET_CURRENT_CONTEXT(ctx
);
313 struct gl2_program_intf
**program
= NULL
;
315 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
319 GET_PROGRAM(pro
, programObj
, "glUseProgramObjectARB");
324 if ((**pro
).GetLinkStatus (pro
) == GL_FALSE
)
326 RELEASE_PROGRAM(pro
);
327 _mesa_error (ctx
, GL_INVALID_OPERATION
, "glUseProgramObjectARB");
333 ctx
->ShaderObjects
._VertexShaderPresent
= (**pro
).IsShaderPresent (pro
, GL_VERTEX_SHADER_ARB
);
334 ctx
->ShaderObjects
._FragmentShaderPresent
= (**pro
).IsShaderPresent (pro
,
335 GL_FRAGMENT_SHADER_ARB
);
339 ctx
->ShaderObjects
._VertexShaderPresent
= GL_FALSE
;
340 ctx
->ShaderObjects
._FragmentShaderPresent
= GL_FALSE
;
343 if (ctx
->ShaderObjects
.CurrentProgram
!= NULL
)
344 RELEASE_PROGRAM(ctx
->ShaderObjects
.CurrentProgram
);
345 ctx
->ShaderObjects
.CurrentProgram
= program
;
349 _mesa_ValidateProgramARB (GLhandleARB programObj
)
351 GET_CURRENT_CONTEXT(ctx
);
352 GET_PROGRAM(pro
, programObj
, "glValidateProgramARB");
356 (**pro
).Validate (pro
);
357 RELEASE_PROGRAM(pro
);
362 _mesa_Uniform1fARB (GLint location
, GLfloat v0
)
364 GET_CURRENT_CONTEXT(ctx
);
365 GET_CURRENT_LINKED_PROGRAM(pro
, "glUniform1fARB");
367 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
371 if (!(**pro
).WriteUniform (pro
, location
, 1, &v0
, GL_FLOAT
))
372 _mesa_error (ctx
, GL_INVALID_OPERATION
, "glUniform1fARB");
377 _mesa_Uniform2fARB (GLint location
, GLfloat v0
, GLfloat v1
)
379 GET_CURRENT_CONTEXT(ctx
);
380 GET_CURRENT_LINKED_PROGRAM(pro
, "glUniform2fARB");
382 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
390 if (!(**pro
).WriteUniform (pro
, location
, 1, v
, GL_FLOAT_VEC2
))
391 _mesa_error (ctx
, GL_INVALID_OPERATION
, "glUniform2fARB");
396 _mesa_Uniform3fARB (GLint location
, GLfloat v0
, GLfloat v1
, GLfloat v2
)
398 GET_CURRENT_CONTEXT(ctx
);
399 GET_CURRENT_LINKED_PROGRAM(pro
, "glUniform3fARB");
401 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
410 if (!(**pro
).WriteUniform (pro
, location
, 1, v
, GL_FLOAT_VEC3
))
411 _mesa_error (ctx
, GL_INVALID_OPERATION
, "glUniform3fARB");
416 _mesa_Uniform4fARB (GLint location
, GLfloat v0
, GLfloat v1
, GLfloat v2
, GLfloat v3
)
418 GET_CURRENT_CONTEXT(ctx
);
419 GET_CURRENT_LINKED_PROGRAM(pro
, "glUniform4fARB");
421 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
431 if (!(**pro
).WriteUniform (pro
, location
, 1, v
, GL_FLOAT_VEC4
))
432 _mesa_error (ctx
, GL_INVALID_OPERATION
, "glUniform4fARB");
437 _mesa_Uniform1iARB (GLint location
, GLint v0
)
439 GET_CURRENT_CONTEXT(ctx
);
440 GET_CURRENT_LINKED_PROGRAM(pro
, "glUniform1iARB");
442 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
446 if (!(**pro
).WriteUniform (pro
, location
, 1, &v0
, GL_INT
))
447 _mesa_error (ctx
, GL_INVALID_OPERATION
, "glUniform1iARB");
452 _mesa_Uniform2iARB (GLint location
, GLint v0
, GLint v1
)
454 GET_CURRENT_CONTEXT(ctx
);
455 GET_CURRENT_LINKED_PROGRAM(pro
, "glUniform2iARB");
457 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
465 if (!(**pro
).WriteUniform (pro
, location
, 1, v
, GL_INT_VEC2
))
466 _mesa_error (ctx
, GL_INVALID_OPERATION
, "glUniform2iARB");
471 _mesa_Uniform3iARB (GLint location
, GLint v0
, GLint v1
, GLint v2
)
473 GET_CURRENT_CONTEXT(ctx
);
474 GET_CURRENT_LINKED_PROGRAM(pro
, "glUniform3iARB");
476 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
485 if (!(**pro
).WriteUniform (pro
, location
, 1, v
, GL_INT_VEC3
))
486 _mesa_error (ctx
, GL_INVALID_OPERATION
, "glUniform3iARB");
491 _mesa_Uniform4iARB (GLint location
, GLint v0
, GLint v1
, GLint v2
, GLint v3
)
493 GET_CURRENT_CONTEXT(ctx
);
494 GET_CURRENT_LINKED_PROGRAM(pro
, "glUniform4iARB");
496 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
506 if (!(**pro
).WriteUniform (pro
, location
, 1, v
, GL_INT_VEC4
))
507 _mesa_error (ctx
, GL_INVALID_OPERATION
, "glUniform4iARB");
512 _mesa_Uniform1fvARB (GLint location
, GLsizei count
, const GLfloat
*value
)
514 GET_CURRENT_CONTEXT(ctx
);
515 GET_CURRENT_LINKED_PROGRAM(pro
, "glUniform1fvARB");
519 _mesa_error (ctx
, GL_INVALID_VALUE
, "glUniform1fvARB");
523 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
527 if (!(**pro
).WriteUniform (pro
, location
, count
, value
, GL_FLOAT
))
528 _mesa_error (ctx
, GL_INVALID_OPERATION
, "glUniform1fvARB");
533 _mesa_Uniform2fvARB (GLint location
, GLsizei count
, const GLfloat
*value
)
535 GET_CURRENT_CONTEXT(ctx
);
536 GET_CURRENT_LINKED_PROGRAM(pro
, "glUniform2fvARB");
540 _mesa_error (ctx
, GL_INVALID_VALUE
, "glUniform2fvARB");
544 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
548 if (!(**pro
).WriteUniform (pro
, location
, count
, value
, GL_FLOAT_VEC2
))
549 _mesa_error (ctx
, GL_INVALID_OPERATION
, "glUniform2fvARB");
554 _mesa_Uniform3fvARB (GLint location
, GLsizei count
, const GLfloat
*value
)
556 GET_CURRENT_CONTEXT(ctx
);
557 GET_CURRENT_LINKED_PROGRAM(pro
, "glUniform3fvARB");
561 _mesa_error (ctx
, GL_INVALID_VALUE
, "glUniform3fvARB");
565 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
569 if (!(**pro
).WriteUniform (pro
, location
, count
, value
, GL_FLOAT_VEC3
))
570 _mesa_error (ctx
, GL_INVALID_OPERATION
, "glUniform3fvARB");
575 _mesa_Uniform4fvARB (GLint location
, GLsizei count
, const GLfloat
*value
)
577 GET_CURRENT_CONTEXT(ctx
);
578 GET_CURRENT_LINKED_PROGRAM(pro
, "glUniform4fvARB");
582 _mesa_error (ctx
, GL_INVALID_VALUE
, "glUniform4fvARB");
586 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
590 if (!(**pro
).WriteUniform (pro
, location
, count
, value
, GL_FLOAT_VEC4
))
591 _mesa_error (ctx
, GL_INVALID_OPERATION
, "glUniform4fvARB");
596 _mesa_Uniform1ivARB (GLint location
, GLsizei count
, const GLint
*value
)
598 GET_CURRENT_CONTEXT(ctx
);
599 GET_CURRENT_LINKED_PROGRAM(pro
, "glUniform1ivARB");
603 _mesa_error (ctx
, GL_INVALID_VALUE
, "glUniform1ivARB");
607 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
611 if (!(**pro
).WriteUniform (pro
, location
, count
, value
, GL_INT
))
612 _mesa_error (ctx
, GL_INVALID_OPERATION
, "glUniform1ivARB");
617 _mesa_Uniform2ivARB (GLint location
, GLsizei count
, const GLint
*value
)
619 GET_CURRENT_CONTEXT(ctx
);
620 GET_CURRENT_LINKED_PROGRAM(pro
, "glUniform2ivARB");
624 _mesa_error (ctx
, GL_INVALID_VALUE
, "glUniform2ivARB");
628 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
632 if (!(**pro
).WriteUniform (pro
, location
, count
, value
, GL_INT_VEC2
))
633 _mesa_error (ctx
, GL_INVALID_OPERATION
, "glUniform2ivARB");
638 _mesa_Uniform3ivARB (GLint location
, GLsizei count
, const GLint
*value
)
640 GET_CURRENT_CONTEXT(ctx
);
641 GET_CURRENT_LINKED_PROGRAM(pro
, "glUniform3ivARB");
645 _mesa_error (ctx
, GL_INVALID_VALUE
, "glUniform3ivARB");
649 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
653 if (!(**pro
).WriteUniform (pro
, location
, count
, value
, GL_INT_VEC3
))
654 _mesa_error (ctx
, GL_INVALID_OPERATION
, "glUniform3ivARB");
659 _mesa_Uniform4ivARB (GLint location
, GLsizei count
, const GLint
*value
)
661 GET_CURRENT_CONTEXT(ctx
);
662 GET_CURRENT_LINKED_PROGRAM(pro
, "glUniform4ivARB");
666 _mesa_error (ctx
, GL_INVALID_VALUE
, "glUniform4ivARB");
670 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
674 if (!(**pro
).WriteUniform (pro
, location
, count
, value
, GL_INT_VEC4
))
675 _mesa_error (ctx
, GL_INVALID_OPERATION
, "glUniform4ivARB");
680 _mesa_UniformMatrix2fvARB (GLint location
, GLsizei count
, GLboolean transpose
, const GLfloat
*value
)
682 GET_CURRENT_CONTEXT(ctx
);
683 GET_CURRENT_LINKED_PROGRAM(pro
, "glUniformMatrix2fvARB");
687 _mesa_error (ctx
, GL_INVALID_VALUE
, "glUniformMatrix2fvARB");
691 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
700 trans
= (GLfloat
*) _mesa_malloc (count
* 4 * sizeof (GLfloat
));
703 _mesa_error (ctx
, GL_OUT_OF_MEMORY
, "glUniformMatrix2fvARB");
706 for (pt
= trans
, pv
= value
; pt
!= trans
+ count
* 4; pt
+= 4, pv
+= 4)
713 if (!(**pro
).WriteUniform (pro
, location
, count
, trans
, GL_FLOAT_MAT2
))
714 _mesa_error (ctx
, GL_INVALID_OPERATION
, "glUniformMatrix2fvARB");
719 if (!(**pro
).WriteUniform (pro
, location
, count
, value
, GL_FLOAT_MAT2
))
720 _mesa_error (ctx
, GL_INVALID_OPERATION
, "glUniformMatrix2fvARB");
726 _mesa_UniformMatrix3fvARB (GLint location
, GLsizei count
, GLboolean transpose
, const GLfloat
*value
)
728 GET_CURRENT_CONTEXT(ctx
);
729 GET_CURRENT_LINKED_PROGRAM(pro
, "glUniformMatrix3fvARB");
733 _mesa_error (ctx
, GL_INVALID_VALUE
, "glUniformMatrix3fvARB");
737 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
746 trans
= (GLfloat
*) _mesa_malloc (count
* 9 * sizeof (GLfloat
));
749 _mesa_error (ctx
, GL_OUT_OF_MEMORY
, "glUniformMatrix3fvARB");
752 for (pt
= trans
, pv
= value
; pt
!= trans
+ count
* 9; pt
+= 9, pv
+= 9)
764 if (!(**pro
).WriteUniform (pro
, location
, count
, trans
, GL_FLOAT_MAT3
))
765 _mesa_error (ctx
, GL_INVALID_OPERATION
, "glUniformMatrix3fvARB");
770 if (!(**pro
).WriteUniform (pro
, location
, count
, value
, GL_FLOAT_MAT3
))
771 _mesa_error (ctx
, GL_INVALID_OPERATION
, "glUniformMatrix3fvARB");
777 _mesa_UniformMatrix4fvARB (GLint location
, GLsizei count
, GLboolean transpose
, const GLfloat
*value
)
779 GET_CURRENT_CONTEXT(ctx
);
780 GET_CURRENT_LINKED_PROGRAM(pro
, "glUniformMatrix4fvARB");
784 _mesa_error (ctx
, GL_INVALID_VALUE
, "glUniformMatrix4fvARB");
788 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
797 trans
= (GLfloat
*) _mesa_malloc (count
* 16 * sizeof (GLfloat
));
800 _mesa_error (ctx
, GL_OUT_OF_MEMORY
, "glUniformMatrix4fvARB");
803 for (pt
= trans
, pv
= value
; pt
!= trans
+ count
* 16; pt
+= 16, pv
+= 16)
805 _math_transposef (pt
, pv
);
807 if (!(**pro
).WriteUniform (pro
, location
, count
, trans
, GL_FLOAT_MAT4
))
808 _mesa_error (ctx
, GL_INVALID_OPERATION
, "glUniformMatrix4fvARB");
813 if (!(**pro
).WriteUniform (pro
, location
, count
, value
, GL_FLOAT_MAT4
))
814 _mesa_error (ctx
, GL_INVALID_OPERATION
, "glUniformMatrix4fvARB");
820 _mesa_get_object_parameter (GLhandleARB obj
, GLenum pname
, GLvoid
*params
, GLboolean
*integral
,
823 GET_CURRENT_CONTEXT(ctx
);
824 GLint
*ipar
= (GLint
*) params
;
826 /* set default values */
827 *integral
= GL_TRUE
; /* indicates param type, TRUE: GLint, FALSE: GLfloat */
828 *size
= 1; /* param array size */
832 case GL_OBJECT_TYPE_ARB
:
833 case GL_OBJECT_DELETE_STATUS_ARB
:
834 case GL_OBJECT_INFO_LOG_LENGTH_ARB
:
836 GET_GENERIC(gen
, obj
, "glGetObjectParameterivARB");
843 case GL_OBJECT_TYPE_ARB
:
844 *ipar
= (**gen
).GetType (gen
);
846 case GL_OBJECT_DELETE_STATUS_ARB
:
847 *ipar
= (**gen
).GetDeleteStatus (gen
);
849 case GL_OBJECT_INFO_LOG_LENGTH_ARB
:
850 *ipar
= (**gen
).GetInfoLogLength (gen
);
854 RELEASE_GENERIC(gen
);
857 case GL_OBJECT_SUBTYPE_ARB
:
858 case GL_OBJECT_COMPILE_STATUS_ARB
:
859 case GL_OBJECT_SHADER_SOURCE_LENGTH_ARB
:
861 GET_SHADER(sha
, obj
, "glGetObjectParameterivARB");
868 case GL_OBJECT_SUBTYPE_ARB
:
869 *ipar
= (**sha
).GetSubType (sha
);
871 case GL_OBJECT_COMPILE_STATUS_ARB
:
872 *ipar
= (**sha
).GetCompileStatus (sha
);
874 case GL_OBJECT_SHADER_SOURCE_LENGTH_ARB
:
876 const GLcharARB
*src
= (**sha
).GetSource (sha
);
881 *ipar
= _mesa_strlen (src
) + 1;
889 case GL_OBJECT_LINK_STATUS_ARB
:
890 case GL_OBJECT_VALIDATE_STATUS_ARB
:
891 case GL_OBJECT_ATTACHED_OBJECTS_ARB
:
892 case GL_OBJECT_ACTIVE_UNIFORMS_ARB
:
893 case GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB
:
895 GET_PROGRAM(pro
, obj
, "glGetObjectParameterivARB");
902 case GL_OBJECT_LINK_STATUS_ARB
:
903 *ipar
= (**pro
).GetLinkStatus (pro
);
905 case GL_OBJECT_VALIDATE_STATUS_ARB
:
906 *ipar
= (**pro
).GetValidateStatus (pro
);
908 case GL_OBJECT_ATTACHED_OBJECTS_ARB
:
909 *ipar
= (**pro
)._container
.GetAttachedCount ((struct gl2_container_intf
**) (pro
));
911 case GL_OBJECT_ACTIVE_UNIFORMS_ARB
:
912 *ipar
= (**pro
).GetActiveUniformCount (pro
);
914 case GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB
:
915 *ipar
= (**pro
).GetActiveUniformMaxLength (pro
);
917 case GL_OBJECT_ACTIVE_ATTRIBUTES_ARB
:
918 *ipar
= (**pro
).GetActiveAttribCount (pro
);
920 case GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB
:
921 *ipar
= (**pro
).GetActiveAttribMaxLength (pro
);
925 RELEASE_PROGRAM(pro
);
929 _mesa_error (ctx
, GL_INVALID_ENUM
, "glGetObjectParameterivARB");
937 _mesa_GetObjectParameterfvARB (GLhandleARB obj
, GLenum pname
, GLfloat
*params
)
939 GET_CURRENT_CONTEXT(ctx
);
945 _mesa_error (ctx
, GL_INVALID_VALUE
, "glGetObjectParameterfvARB");
949 assert (sizeof (GLfloat
) == sizeof (GLint
));
951 if (_mesa_get_object_parameter (obj
, pname
, (GLvoid
*) params
, &integral
, &size
))
956 for (i
= 0; i
< size
; i
++)
957 params
[i
] = (GLfloat
) ((GLint
*) params
)[i
];
962 _mesa_GetObjectParameterivARB (GLhandleARB obj
, GLenum pname
, GLint
*params
)
964 GET_CURRENT_CONTEXT(ctx
);
970 _mesa_error (ctx
, GL_INVALID_VALUE
, "glGetObjectParameterivARB");
974 assert (sizeof (GLfloat
) == sizeof (GLint
));
976 if (_mesa_get_object_parameter (obj
, pname
, (GLvoid
*) params
, &integral
, &size
))
981 for (i
= 0; i
< size
; i
++)
982 params
[i
] = (GLint
) ((GLfloat
*) params
)[i
];
988 * Copy string from <src> to <dst>, up to maxLength characters, returning
989 * length of <dst> in <length>.
990 * \param src the strings source
991 * \param maxLength max chars to copy
992 * \param length returns numberof chars copied
993 * \param dst the string destination
996 copy_string(const GLcharARB
*src
, GLsizei maxLength
, GLsizei
*length
,
1000 for (len
= 0; len
< maxLength
- 1 && src
&& src
[len
]; len
++)
1001 dst
[len
] = src
[len
];
1010 _mesa_GetInfoLogARB (GLhandleARB obj
, GLsizei maxLength
, GLsizei
*length
, GLcharARB
*infoLog
)
1012 GET_CURRENT_CONTEXT(ctx
);
1013 GET_GENERIC(gen
, obj
, "glGetInfoLogARB");
1018 if (infoLog
== NULL
)
1019 _mesa_error (ctx
, GL_INVALID_VALUE
, "glGetInfoLogARB");
1021 GLsizei actualsize
= (**gen
).GetInfoLogLength (gen
);
1022 if (actualsize
> maxLength
)
1023 actualsize
= maxLength
;
1024 (**gen
).GetInfoLog (gen
, actualsize
, infoLog
);
1026 *length
= (actualsize
> 0) ? actualsize
- 1 : 0;
1028 RELEASE_GENERIC(gen
);
1032 _mesa_GetAttachedObjectsARB (GLhandleARB containerObj
, GLsizei maxCount
, GLsizei
*count
,
1035 GET_CURRENT_CONTEXT(ctx
);
1036 GET_CONTAINER(con
, containerObj
, "glGetAttachedObjectsARB");
1042 _mesa_error (ctx
, GL_INVALID_VALUE
, "glGetAttachedObjectsARB");
1047 cnt
= (**con
).GetAttachedCount (con
);
1053 for (i
= 0; i
< cnt
; i
++)
1055 struct gl2_generic_intf
**x
= (**con
).GetAttached (con
, i
);
1056 obj
[i
] = (**x
).GetName (x
);
1060 RELEASE_CONTAINER(con
);
1064 _mesa_GetUniformLocationARB (GLhandleARB programObj
, const GLcharARB
*name
)
1066 GET_CURRENT_CONTEXT(ctx
);
1068 GET_LINKED_PROGRAM(pro
, programObj
, "glGetUniformLocationARB");
1074 _mesa_error (ctx
, GL_INVALID_VALUE
, "glGetUniformLocationARB");
1077 if (!IS_NAME_WITH_GL_PREFIX(name
))
1078 loc
= (**pro
).GetUniformLocation (pro
, name
);
1080 RELEASE_PROGRAM(pro
);
1085 _mesa_GetActiveUniformARB (GLhandleARB programObj
, GLuint index
, GLsizei maxLength
, GLsizei
*length
,
1086 GLint
*size
, GLenum
*type
, GLcharARB
*name
)
1088 GET_CURRENT_CONTEXT(ctx
);
1089 GET_PROGRAM(pro
, programObj
, "glGetActiveUniformARB");
1094 if (size
== NULL
|| type
== NULL
|| name
== NULL
)
1095 _mesa_error (ctx
, GL_INVALID_VALUE
, "glGetActiveUniformARB");
1098 if (index
< (**pro
).GetActiveUniformCount (pro
))
1099 (**pro
).GetActiveUniform (pro
, index
, maxLength
, length
, size
, type
, name
);
1101 _mesa_error (ctx
, GL_INVALID_VALUE
, "glGetActiveUniformARB");
1103 RELEASE_PROGRAM(pro
);
1107 _mesa_GetUniformfvARB (GLhandleARB programObj
, GLint location
, GLfloat
*params
)
1109 GET_CURRENT_CONTEXT(ctx
);
1110 GET_LINKED_PROGRAM(pro
, programObj
, "glGetUniformfvARB");
1115 RELEASE_PROGRAM(pro
);
1120 _mesa_GetUniformivARB (GLhandleARB programObj
, GLint location
, GLint
*params
)
1122 GET_CURRENT_CONTEXT(ctx
);
1123 GET_LINKED_PROGRAM(pro
, programObj
, "glGetUniformivARB");
1128 RELEASE_PROGRAM(pro
);
1133 _mesa_GetShaderSourceARB (GLhandleARB obj
, GLsizei maxLength
, GLsizei
*length
, GLcharARB
*source
)
1135 GET_CURRENT_CONTEXT(ctx
);
1136 GET_SHADER(sha
, obj
, "glGetShaderSourceARB");
1142 _mesa_error (ctx
, GL_INVALID_VALUE
, "glGetShaderSourceARB");
1144 copy_string ((**sha
).GetSource (sha
), maxLength
, length
, source
);
1145 RELEASE_SHADER(sha
);
1148 /* GL_ARB_vertex_shader */
1151 _mesa_BindAttribLocationARB (GLhandleARB programObj
, GLuint index
, const GLcharARB
*name
)
1153 GET_CURRENT_CONTEXT(ctx
);
1154 GET_PROGRAM(pro
, programObj
, "glBindAttribLocationARB");
1159 if (name
== NULL
|| index
>= MAX_VERTEX_ATTRIBS
)
1160 _mesa_error (ctx
, GL_INVALID_VALUE
, "glBindAttribLocationARB");
1161 else if (IS_NAME_WITH_GL_PREFIX(name
))
1162 _mesa_error (ctx
, GL_INVALID_OPERATION
, "glBindAttribLocationARB");
1164 (**pro
).OverrideAttribBinding (pro
, index
, name
);
1165 RELEASE_PROGRAM(pro
);
1169 _mesa_GetActiveAttribARB (GLhandleARB programObj
, GLuint index
, GLsizei maxLength
, GLsizei
*length
,
1170 GLint
*size
, GLenum
*type
, GLcharARB
*name
)
1172 GET_CURRENT_CONTEXT(ctx
);
1173 GET_PROGRAM(pro
, programObj
, "glGetActiveAttribARB");
1178 if (name
== NULL
|| index
>= (**pro
).GetActiveAttribCount (pro
))
1179 _mesa_error (ctx
, GL_INVALID_VALUE
, "glGetActiveAttribARB");
1181 (**pro
).GetActiveAttrib (pro
, index
, maxLength
, length
, size
, type
, name
);
1182 RELEASE_PROGRAM(pro
);
1186 _mesa_GetAttribLocationARB (GLhandleARB programObj
, const GLcharARB
*name
)
1188 GET_CURRENT_CONTEXT(ctx
);
1190 GET_LINKED_PROGRAM(pro
, programObj
, "glGetAttribLocationARB");
1196 _mesa_error (ctx
, GL_INVALID_VALUE
, "glGetAttribLocationARB");
1197 else if (!IS_NAME_WITH_GL_PREFIX(name
))
1198 loc
= (**pro
).GetAttribLocation (pro
, name
);
1199 RELEASE_PROGRAM(pro
);
1206 _mesa_init_shaderobjects (GLcontext
*ctx
)
1208 ctx
->ShaderObjects
.CurrentProgram
= NULL
;
1209 ctx
->ShaderObjects
._FragmentShaderPresent
= GL_FALSE
;
1210 ctx
->ShaderObjects
._VertexShaderPresent
= GL_FALSE
;
1212 _mesa_init_shaderobjects_3dlabs (ctx
);