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 #define I_UNKNOWN struct gl2_unknown_intf **
40 #define I_GENERIC struct gl2_generic_intf **
41 #define I_CONTAINER struct gl2_container_intf **
42 #define I_PROGRAM struct gl2_program_intf **
43 #define I_SHADER struct gl2_shader_intf **
45 #define RELEASE_GENERIC(x)\
46 (**x)._unknown.Release ((I_UNKNOWN) x)
48 #define RELEASE_CONTAINER(x)\
49 (**x)._generic._unknown.Release ((I_UNKNOWN) x)
51 #define RELEASE_PROGRAM(x)\
52 (**x)._container._generic._unknown.Release ((I_UNKNOWN) x)
54 #define RELEASE_SHADER(x)\
55 (**x)._generic._unknown.Release ((I_UNKNOWN) x);
57 #define _LOOKUP_HANDLE(handle, function)\
59 _glthread_LOCK_MUTEX (ctx->Shared->Mutex);\
60 unk = (I_UNKNOWN) _mesa_HashLookup (ctx->Shared->GL2Objects, handle);\
61 _glthread_UNLOCK_MUTEX (ctx->Shared->Mutex);\
63 _mesa_error (ctx, GL_INVALID_VALUE, function);\
67 #define _QUERY_INTERFACE(x, type, uuid, function)\
68 x = (type) (**unk).QueryInterface (unk, uuid);\
70 _mesa_error (ctx, GL_INVALID_OPERATION, function);\
74 #define GET_GENERIC(x, handle, function)\
77 _LOOKUP_HANDLE(handle, function);\
78 _QUERY_INTERFACE(x, I_GENERIC, UIID_GENERIC, function);\
81 #define GET_CONTAINER(x, handle, function)\
82 I_CONTAINER x = NULL;\
84 _LOOKUP_HANDLE(handle, function);\
85 _QUERY_INTERFACE(x, I_CONTAINER, UIID_CONTAINER, function);\
88 #define GET_PROGRAM(x, handle, function)\
91 _LOOKUP_HANDLE(handle, function);\
92 _QUERY_INTERFACE(x, I_PROGRAM, UIID_PROGRAM, function);\
95 #define GET_SHADER(x, handle, function)\
98 _LOOKUP_HANDLE(handle, function);\
99 _QUERY_INTERFACE(x, I_SHADER, UIID_SHADER, function);\
102 #define _LINKED_PROGRAM(x, function, release)\
103 if ((**x).GetLinkStatus (x) == GL_FALSE) {\
104 if (release) RELEASE_PROGRAM(x);\
105 _mesa_error (ctx, GL_INVALID_OPERATION, function);\
109 #define GET_LINKED_PROGRAM(x, handle, function)\
112 _LOOKUP_HANDLE(handle, function);\
113 _QUERY_INTERFACE(x, I_PROGRAM, UIID_PROGRAM, function);\
114 _LINKED_PROGRAM(x, function, GL_TRUE);\
117 #define _CURRENT_PROGRAM(x, function)\
118 if (ctx->ShaderObjects.CurrentProgram == NULL) {\
119 _mesa_error (ctx, GL_INVALID_OPERATION, function);\
122 x = ctx->ShaderObjects.CurrentProgram;
124 #define GET_CURRENT_LINKED_PROGRAM(x, function)\
127 _CURRENT_PROGRAM(x, function);\
128 _LINKED_PROGRAM(x, function, GL_FALSE);\
131 #define IS_NAME_WITH_GL_PREFIX(x) ((x)[0] == 'g' && (x)[1] == 'l' && (x)[2] == '_')
135 _mesa_DeleteObjectARB (GLhandleARB obj
)
137 GET_CURRENT_CONTEXT(ctx
);
138 GET_GENERIC(gen
, obj
, "glDeleteObjectARB");
142 (**gen
).Delete (gen
);
143 RELEASE_GENERIC(gen
);
147 GLhandleARB GLAPIENTRY
148 _mesa_GetHandleARB (GLenum pname
)
150 GET_CURRENT_CONTEXT(ctx
);
154 case GL_PROGRAM_OBJECT_ARB
:
156 I_PROGRAM pro
= ctx
->ShaderObjects
.CurrentProgram
;
159 return (**pro
)._container
._generic
.GetName ((I_GENERIC
) pro
);
163 _mesa_error (ctx
, GL_INVALID_ENUM
, "glGetHandleARB");
170 _mesa_DetachObjectARB (GLhandleARB containerObj
, GLhandleARB attachedObj
)
172 GET_CURRENT_CONTEXT(ctx
);
173 GET_CONTAINER(con
, containerObj
, "glDetachObjectARB");
177 GET_GENERIC(att
, attachedObj
, "glDetachObjectARB");
181 (**con
).Detach (con
, att
);
182 RELEASE_GENERIC(att
);
184 RELEASE_CONTAINER(con
);
188 GLhandleARB GLAPIENTRY
189 _mesa_CreateShaderObjectARB (GLenum shaderType
)
191 return _mesa_3dlabs_create_shader_object (shaderType
);
195 _mesa_ShaderSourceARB (GLhandleARB shaderObj
, GLsizei count
, const GLcharARB
**string
,
198 GET_CURRENT_CONTEXT(ctx
);
202 GET_SHADER(sha
, shaderObj
, "glShaderSourceARB");
210 _mesa_error (ctx
, GL_INVALID_VALUE
, "glShaderSourceARB");
215 * This array holds offsets of where the appropriate string ends, thus the last
216 * element will be set to the total length of the source code.
218 offsets
= (GLint
*) _mesa_malloc (count
* sizeof (GLint
));
222 _mesa_error (ctx
, GL_OUT_OF_MEMORY
, "glShaderSourceARB");
226 for (i
= 0; i
< count
; i
++)
228 if (string
[i
] == NULL
)
230 _mesa_free ((GLvoid
*) offsets
);
232 _mesa_error (ctx
, GL_INVALID_VALUE
, "glShaderSourceARB");
235 if (length
== NULL
|| length
[i
] < 0)
236 offsets
[i
] = _mesa_strlen (string
[i
]);
238 offsets
[i
] = length
[i
];
239 /* accumulate string lengths */
241 offsets
[i
] += offsets
[i
- 1];
244 source
= (GLcharARB
*) _mesa_malloc ((offsets
[count
- 1] + 1) * sizeof (GLcharARB
));
247 _mesa_free ((GLvoid
*) offsets
);
249 _mesa_error (ctx
, GL_OUT_OF_MEMORY
, "glShaderSourceARB");
253 for (i
= 0; i
< count
; i
++)
255 GLint start
= (i
> 0) ? offsets
[i
- 1] : 0;
256 _mesa_memcpy (source
+ start
, string
[i
], (offsets
[i
] - start
) * sizeof (GLcharARB
));
258 source
[offsets
[count
- 1]] = '\0';
260 (**sha
).SetSource (sha
, source
, offsets
, count
);
265 _mesa_CompileShaderARB (GLhandleARB shaderObj
)
267 GET_CURRENT_CONTEXT(ctx
);
268 GET_SHADER(sha
, shaderObj
, "glCompileShaderARB");
272 (**sha
).Compile (sha
);
277 GLhandleARB GLAPIENTRY
278 _mesa_CreateProgramObjectARB (GLvoid
)
280 return _mesa_3dlabs_create_program_object ();
284 _mesa_AttachObjectARB (GLhandleARB containerObj
, GLhandleARB obj
)
286 GET_CURRENT_CONTEXT(ctx
);
287 GET_CONTAINER(con
, containerObj
, "glAttachObjectARB");
291 GET_GENERIC(att
, obj
, "glAttachObjectARB");
295 (**con
).Attach (con
, att
);
296 RELEASE_GENERIC(att
);
298 RELEASE_CONTAINER(con
);
303 _mesa_LinkProgramARB (GLhandleARB programObj
)
305 GET_CURRENT_CONTEXT(ctx
);
306 GET_PROGRAM(pro
, programObj
, "glLinkProgramARB");
311 if (pro
== ctx
->ShaderObjects
.CurrentProgram
)
313 if ((**pro
).GetLinkStatus (pro
))
314 _mesa_UseProgramObjectARB (programObj
);
316 _mesa_UseProgramObjectARB (0);
318 RELEASE_PROGRAM(pro
);
323 _mesa_UseProgramObjectARB (GLhandleARB programObj
)
325 GET_CURRENT_CONTEXT(ctx
);
326 I_PROGRAM program
= NULL
;
328 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
332 GET_PROGRAM(pro
, programObj
, "glUseProgramObjectARB");
337 if ((**pro
).GetLinkStatus (pro
) == GL_FALSE
)
339 RELEASE_PROGRAM(pro
);
340 _mesa_error (ctx
, GL_INVALID_OPERATION
, "glUseProgramObjectARB");
346 ctx
->ShaderObjects
._VertexShaderPresent
= (**pro
).IsShaderPresent (pro
, GL_VERTEX_SHADER_ARB
);
347 ctx
->ShaderObjects
._FragmentShaderPresent
= (**pro
).IsShaderPresent (pro
,
348 GL_FRAGMENT_SHADER_ARB
);
352 ctx
->ShaderObjects
._VertexShaderPresent
= GL_FALSE
;
353 ctx
->ShaderObjects
._FragmentShaderPresent
= GL_FALSE
;
356 if (ctx
->ShaderObjects
.CurrentProgram
!= NULL
)
357 RELEASE_PROGRAM(ctx
->ShaderObjects
.CurrentProgram
);
358 ctx
->ShaderObjects
.CurrentProgram
= program
;
362 _mesa_ValidateProgramARB (GLhandleARB programObj
)
364 GET_CURRENT_CONTEXT(ctx
);
365 GET_PROGRAM(pro
, programObj
, "glValidateProgramARB");
369 (**pro
).Validate (pro
);
370 RELEASE_PROGRAM(pro
);
375 _mesa_Uniform1fARB (GLint location
, GLfloat v0
)
377 GET_CURRENT_CONTEXT(ctx
);
378 GET_CURRENT_LINKED_PROGRAM(pro
, "glUniform1fARB");
380 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
384 if (!(**pro
).WriteUniform (pro
, location
, 1, &v0
, GL_FLOAT
))
385 _mesa_error (ctx
, GL_INVALID_OPERATION
, "glUniform1fARB");
390 _mesa_Uniform2fARB (GLint location
, GLfloat v0
, GLfloat v1
)
392 GET_CURRENT_CONTEXT(ctx
);
393 GET_CURRENT_LINKED_PROGRAM(pro
, "glUniform2fARB");
395 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
403 if (!(**pro
).WriteUniform (pro
, location
, 1, v
, GL_FLOAT_VEC2
))
404 _mesa_error (ctx
, GL_INVALID_OPERATION
, "glUniform2fARB");
409 _mesa_Uniform3fARB (GLint location
, GLfloat v0
, GLfloat v1
, GLfloat v2
)
411 GET_CURRENT_CONTEXT(ctx
);
412 GET_CURRENT_LINKED_PROGRAM(pro
, "glUniform3fARB");
414 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
423 if (!(**pro
).WriteUniform (pro
, location
, 1, v
, GL_FLOAT_VEC3
))
424 _mesa_error (ctx
, GL_INVALID_OPERATION
, "glUniform3fARB");
429 _mesa_Uniform4fARB (GLint location
, GLfloat v0
, GLfloat v1
, GLfloat v2
, GLfloat v3
)
431 GET_CURRENT_CONTEXT(ctx
);
432 GET_CURRENT_LINKED_PROGRAM(pro
, "glUniform4fARB");
434 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
444 if (!(**pro
).WriteUniform (pro
, location
, 1, v
, GL_FLOAT_VEC4
))
445 _mesa_error (ctx
, GL_INVALID_OPERATION
, "glUniform4fARB");
450 _mesa_Uniform1iARB (GLint location
, GLint v0
)
452 GET_CURRENT_CONTEXT(ctx
);
453 GET_CURRENT_LINKED_PROGRAM(pro
, "glUniform1iARB");
455 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
459 if (!(**pro
).WriteUniform (pro
, location
, 1, &v0
, GL_INT
))
460 _mesa_error (ctx
, GL_INVALID_OPERATION
, "glUniform1iARB");
465 _mesa_Uniform2iARB (GLint location
, GLint v0
, GLint v1
)
467 GET_CURRENT_CONTEXT(ctx
);
468 GET_CURRENT_LINKED_PROGRAM(pro
, "glUniform2iARB");
470 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
478 if (!(**pro
).WriteUniform (pro
, location
, 1, v
, GL_INT_VEC2
))
479 _mesa_error (ctx
, GL_INVALID_OPERATION
, "glUniform2iARB");
484 _mesa_Uniform3iARB (GLint location
, GLint v0
, GLint v1
, GLint v2
)
486 GET_CURRENT_CONTEXT(ctx
);
487 GET_CURRENT_LINKED_PROGRAM(pro
, "glUniform3iARB");
489 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
498 if (!(**pro
).WriteUniform (pro
, location
, 1, v
, GL_INT_VEC3
))
499 _mesa_error (ctx
, GL_INVALID_OPERATION
, "glUniform3iARB");
504 _mesa_Uniform4iARB (GLint location
, GLint v0
, GLint v1
, GLint v2
, GLint v3
)
506 GET_CURRENT_CONTEXT(ctx
);
507 GET_CURRENT_LINKED_PROGRAM(pro
, "glUniform4iARB");
509 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
519 if (!(**pro
).WriteUniform (pro
, location
, 1, v
, GL_INT_VEC4
))
520 _mesa_error (ctx
, GL_INVALID_OPERATION
, "glUniform4iARB");
525 _mesa_Uniform1fvARB (GLint location
, GLsizei count
, const GLfloat
*value
)
527 GET_CURRENT_CONTEXT(ctx
);
528 GET_CURRENT_LINKED_PROGRAM(pro
, "glUniform1fvARB");
532 _mesa_error (ctx
, GL_INVALID_VALUE
, "glUniform1fvARB");
536 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
540 if (!(**pro
).WriteUniform (pro
, location
, count
, value
, GL_FLOAT
))
541 _mesa_error (ctx
, GL_INVALID_OPERATION
, "glUniform1fvARB");
546 _mesa_Uniform2fvARB (GLint location
, GLsizei count
, const GLfloat
*value
)
548 GET_CURRENT_CONTEXT(ctx
);
549 GET_CURRENT_LINKED_PROGRAM(pro
, "glUniform2fvARB");
553 _mesa_error (ctx
, GL_INVALID_VALUE
, "glUniform2fvARB");
557 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
561 if (!(**pro
).WriteUniform (pro
, location
, count
, value
, GL_FLOAT_VEC2
))
562 _mesa_error (ctx
, GL_INVALID_OPERATION
, "glUniform2fvARB");
567 _mesa_Uniform3fvARB (GLint location
, GLsizei count
, const GLfloat
*value
)
569 GET_CURRENT_CONTEXT(ctx
);
570 GET_CURRENT_LINKED_PROGRAM(pro
, "glUniform3fvARB");
574 _mesa_error (ctx
, GL_INVALID_VALUE
, "glUniform3fvARB");
578 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
582 if (!(**pro
).WriteUniform (pro
, location
, count
, value
, GL_FLOAT_VEC3
))
583 _mesa_error (ctx
, GL_INVALID_OPERATION
, "glUniform3fvARB");
588 _mesa_Uniform4fvARB (GLint location
, GLsizei count
, const GLfloat
*value
)
590 GET_CURRENT_CONTEXT(ctx
);
591 GET_CURRENT_LINKED_PROGRAM(pro
, "glUniform4fvARB");
595 _mesa_error (ctx
, GL_INVALID_VALUE
, "glUniform4fvARB");
599 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
603 if (!(**pro
).WriteUniform (pro
, location
, count
, value
, GL_FLOAT_VEC4
))
604 _mesa_error (ctx
, GL_INVALID_OPERATION
, "glUniform4fvARB");
609 _mesa_Uniform1ivARB (GLint location
, GLsizei count
, const GLint
*value
)
611 GET_CURRENT_CONTEXT(ctx
);
612 GET_CURRENT_LINKED_PROGRAM(pro
, "glUniform1ivARB");
616 _mesa_error (ctx
, GL_INVALID_VALUE
, "glUniform1ivARB");
620 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
624 if (!(**pro
).WriteUniform (pro
, location
, count
, value
, GL_INT
))
625 _mesa_error (ctx
, GL_INVALID_OPERATION
, "glUniform1ivARB");
630 _mesa_Uniform2ivARB (GLint location
, GLsizei count
, const GLint
*value
)
632 GET_CURRENT_CONTEXT(ctx
);
633 GET_CURRENT_LINKED_PROGRAM(pro
, "glUniform2ivARB");
637 _mesa_error (ctx
, GL_INVALID_VALUE
, "glUniform2ivARB");
641 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
645 if (!(**pro
).WriteUniform (pro
, location
, count
, value
, GL_INT_VEC2
))
646 _mesa_error (ctx
, GL_INVALID_OPERATION
, "glUniform2ivARB");
651 _mesa_Uniform3ivARB (GLint location
, GLsizei count
, const GLint
*value
)
653 GET_CURRENT_CONTEXT(ctx
);
654 GET_CURRENT_LINKED_PROGRAM(pro
, "glUniform3ivARB");
658 _mesa_error (ctx
, GL_INVALID_VALUE
, "glUniform3ivARB");
662 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
666 if (!(**pro
).WriteUniform (pro
, location
, count
, value
, GL_INT_VEC3
))
667 _mesa_error (ctx
, GL_INVALID_OPERATION
, "glUniform3ivARB");
672 _mesa_Uniform4ivARB (GLint location
, GLsizei count
, const GLint
*value
)
674 GET_CURRENT_CONTEXT(ctx
);
675 GET_CURRENT_LINKED_PROGRAM(pro
, "glUniform4ivARB");
679 _mesa_error (ctx
, GL_INVALID_VALUE
, "glUniform4ivARB");
683 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
687 if (!(**pro
).WriteUniform (pro
, location
, count
, value
, GL_INT_VEC4
))
688 _mesa_error (ctx
, GL_INVALID_OPERATION
, "glUniform4ivARB");
693 _mesa_UniformMatrix2fvARB (GLint location
, GLsizei count
, GLboolean transpose
, const GLfloat
*value
)
695 GET_CURRENT_CONTEXT(ctx
);
696 GET_CURRENT_LINKED_PROGRAM(pro
, "glUniformMatrix2fvARB");
700 _mesa_error (ctx
, GL_INVALID_VALUE
, "glUniformMatrix2fvARB");
704 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
713 trans
= (GLfloat
*) _mesa_malloc (count
* 4 * sizeof (GLfloat
));
716 _mesa_error (ctx
, GL_OUT_OF_MEMORY
, "glUniformMatrix2fvARB");
719 for (pt
= trans
, pv
= value
; pt
!= trans
+ count
* 4; pt
+= 4, pv
+= 4)
726 if (!(**pro
).WriteUniform (pro
, location
, count
, trans
, GL_FLOAT_MAT2
))
727 _mesa_error (ctx
, GL_INVALID_OPERATION
, "glUniformMatrix2fvARB");
732 if (!(**pro
).WriteUniform (pro
, location
, count
, value
, GL_FLOAT_MAT2
))
733 _mesa_error (ctx
, GL_INVALID_OPERATION
, "glUniformMatrix2fvARB");
739 _mesa_UniformMatrix3fvARB (GLint location
, GLsizei count
, GLboolean transpose
, const GLfloat
*value
)
741 GET_CURRENT_CONTEXT(ctx
);
742 GET_CURRENT_LINKED_PROGRAM(pro
, "glUniformMatrix3fvARB");
746 _mesa_error (ctx
, GL_INVALID_VALUE
, "glUniformMatrix3fvARB");
750 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
759 trans
= (GLfloat
*) _mesa_malloc (count
* 9 * sizeof (GLfloat
));
762 _mesa_error (ctx
, GL_OUT_OF_MEMORY
, "glUniformMatrix3fvARB");
765 for (pt
= trans
, pv
= value
; pt
!= trans
+ count
* 9; pt
+= 9, pv
+= 9)
777 if (!(**pro
).WriteUniform (pro
, location
, count
, trans
, GL_FLOAT_MAT3
))
778 _mesa_error (ctx
, GL_INVALID_OPERATION
, "glUniformMatrix3fvARB");
783 if (!(**pro
).WriteUniform (pro
, location
, count
, value
, GL_FLOAT_MAT3
))
784 _mesa_error (ctx
, GL_INVALID_OPERATION
, "glUniformMatrix3fvARB");
790 _mesa_UniformMatrix4fvARB (GLint location
, GLsizei count
, GLboolean transpose
, const GLfloat
*value
)
792 GET_CURRENT_CONTEXT(ctx
);
793 GET_CURRENT_LINKED_PROGRAM(pro
, "glUniformMatrix4fvARB");
797 _mesa_error (ctx
, GL_INVALID_VALUE
, "glUniformMatrix4fvARB");
801 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
810 trans
= (GLfloat
*) _mesa_malloc (count
* 16 * sizeof (GLfloat
));
813 _mesa_error (ctx
, GL_OUT_OF_MEMORY
, "glUniformMatrix4fvARB");
816 for (pt
= trans
, pv
= value
; pt
!= trans
+ count
* 16; pt
+= 16, pv
+= 16)
818 _math_transposef (pt
, pv
);
820 if (!(**pro
).WriteUniform (pro
, location
, count
, trans
, GL_FLOAT_MAT4
))
821 _mesa_error (ctx
, GL_INVALID_OPERATION
, "glUniformMatrix4fvARB");
826 if (!(**pro
).WriteUniform (pro
, location
, count
, value
, GL_FLOAT_MAT4
))
827 _mesa_error (ctx
, GL_INVALID_OPERATION
, "glUniformMatrix4fvARB");
833 _mesa_get_object_parameter (GLhandleARB obj
, GLenum pname
, GLvoid
*params
, GLboolean
*integral
,
836 GET_CURRENT_CONTEXT(ctx
);
837 GLint
*ipar
= (GLint
*) params
;
839 /* set default values */
840 *integral
= GL_TRUE
; /* indicates param type, TRUE: GLint, FALSE: GLfloat */
841 *size
= 1; /* param array size */
845 case GL_OBJECT_TYPE_ARB
:
846 case GL_OBJECT_DELETE_STATUS_ARB
:
847 case GL_OBJECT_INFO_LOG_LENGTH_ARB
:
849 GET_GENERIC(gen
, obj
, "glGetObjectParameterivARB");
856 case GL_OBJECT_TYPE_ARB
:
857 *ipar
= (**gen
).GetType (gen
);
859 case GL_OBJECT_DELETE_STATUS_ARB
:
860 *ipar
= (**gen
).GetDeleteStatus (gen
);
862 case GL_OBJECT_INFO_LOG_LENGTH_ARB
:
864 const GLcharARB
*info
= (**gen
).GetInfoLog (gen
);
869 *ipar
= _mesa_strlen (info
) + 1;
874 RELEASE_GENERIC(gen
);
877 case GL_OBJECT_SUBTYPE_ARB
:
878 case GL_OBJECT_COMPILE_STATUS_ARB
:
879 case GL_OBJECT_SHADER_SOURCE_LENGTH_ARB
:
881 GET_SHADER(sha
, obj
, "glGetObjectParameterivARB");
888 case GL_OBJECT_SUBTYPE_ARB
:
889 *ipar
= (**sha
).GetSubType (sha
);
891 case GL_OBJECT_COMPILE_STATUS_ARB
:
892 *ipar
= (**sha
).GetCompileStatus (sha
);
894 case GL_OBJECT_SHADER_SOURCE_LENGTH_ARB
:
896 const GLcharARB
*src
= (**sha
).GetSource (sha
);
901 *ipar
= _mesa_strlen (src
) + 1;
909 case GL_OBJECT_LINK_STATUS_ARB
:
910 case GL_OBJECT_VALIDATE_STATUS_ARB
:
911 case GL_OBJECT_ATTACHED_OBJECTS_ARB
:
912 case GL_OBJECT_ACTIVE_UNIFORMS_ARB
:
913 case GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB
:
915 GET_PROGRAM(pro
, obj
, "glGetObjectParameterivARB");
922 case GL_OBJECT_LINK_STATUS_ARB
:
923 *ipar
= (**pro
).GetLinkStatus (pro
);
925 case GL_OBJECT_VALIDATE_STATUS_ARB
:
926 *ipar
= (**pro
).GetValidateStatus (pro
);
928 case GL_OBJECT_ATTACHED_OBJECTS_ARB
:
929 *ipar
= (**pro
)._container
.GetAttachedCount ((I_CONTAINER
) pro
);
931 case GL_OBJECT_ACTIVE_UNIFORMS_ARB
:
932 *ipar
= (**pro
).GetActiveUniformCount (pro
);
934 case GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB
:
935 *ipar
= (**pro
).GetActiveUniformMaxLength (pro
);
937 case GL_OBJECT_ACTIVE_ATTRIBUTES_ARB
:
938 *ipar
= (**pro
).GetActiveAttribCount (pro
);
940 case GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB
:
941 *ipar
= (**pro
).GetActiveAttribMaxLength (pro
);
945 RELEASE_PROGRAM(pro
);
949 _mesa_error (ctx
, GL_INVALID_ENUM
, "glGetObjectParameterivARB");
957 _mesa_GetObjectParameterfvARB (GLhandleARB obj
, GLenum pname
, GLfloat
*params
)
959 GET_CURRENT_CONTEXT(ctx
);
965 _mesa_error (ctx
, GL_INVALID_VALUE
, "glGetObjectParameterfvARB");
969 assert (sizeof (GLfloat
) == sizeof (GLint
));
971 if (_mesa_get_object_parameter (obj
, pname
, (GLvoid
*) params
, &integral
, &size
))
976 for (i
= 0; i
< size
; i
++)
977 params
[i
] = (GLfloat
) ((GLint
*) params
)[i
];
982 _mesa_GetObjectParameterivARB (GLhandleARB obj
, GLenum pname
, GLint
*params
)
984 GET_CURRENT_CONTEXT(ctx
);
990 _mesa_error (ctx
, GL_INVALID_VALUE
, "glGetObjectParameterivARB");
994 assert (sizeof (GLfloat
) == sizeof (GLint
));
996 if (_mesa_get_object_parameter (obj
, pname
, (GLvoid
*) params
, &integral
, &size
))
1001 for (i
= 0; i
< size
; i
++)
1002 params
[i
] = (GLint
) ((GLfloat
*) params
)[i
];
1008 * Copy string from <src> to <dst>, up to maxLength characters, returning
1009 * length of <dst> in <length>.
1010 * \param src the strings source
1011 * \param maxLength max chars to copy
1012 * \param length returns numberof chars copied
1013 * \param dst the string destination
1016 copy_string(const GLcharARB
*src
, GLsizei maxLength
, GLsizei
*length
,
1020 for (len
= 0; len
< maxLength
- 1 && src
&& src
[len
]; len
++)
1021 dst
[len
] = src
[len
];
1030 _mesa_GetInfoLogARB (GLhandleARB obj
, GLsizei maxLength
, GLsizei
*length
, GLcharARB
*infoLog
)
1032 GET_CURRENT_CONTEXT(ctx
);
1033 GET_GENERIC(gen
, obj
, "glGetInfoLogARB");
1038 if (infoLog
== NULL
)
1039 _mesa_error (ctx
, GL_INVALID_VALUE
, "glGetInfoLogARB");
1041 copy_string ((**gen
).GetInfoLog (gen
), maxLength
, length
, infoLog
);
1042 RELEASE_GENERIC(gen
);
1046 _mesa_GetAttachedObjectsARB (GLhandleARB containerObj
, GLsizei maxCount
, GLsizei
*count
,
1049 GET_CURRENT_CONTEXT(ctx
);
1050 GET_CONTAINER(con
, containerObj
, "glGetAttachedObjectsARB");
1056 _mesa_error (ctx
, GL_INVALID_VALUE
, "glGetAttachedObjectsARB");
1061 cnt
= (**con
).GetAttachedCount (con
);
1067 for (i
= 0; i
< cnt
; i
++)
1069 I_GENERIC x
= (**con
).GetAttached (con
, i
);
1070 obj
[i
] = (**x
).GetName (x
);
1074 RELEASE_CONTAINER(con
);
1078 _mesa_GetUniformLocationARB (GLhandleARB programObj
, const GLcharARB
*name
)
1080 GET_CURRENT_CONTEXT(ctx
);
1082 GET_LINKED_PROGRAM(pro
, programObj
, "glGetUniformLocationARB");
1088 _mesa_error (ctx
, GL_INVALID_VALUE
, "glGetUniformLocationARB");
1091 if (!IS_NAME_WITH_GL_PREFIX(name
))
1092 loc
= (**pro
).GetUniformLocation (pro
, name
);
1094 RELEASE_PROGRAM(pro
);
1099 _mesa_GetActiveUniformARB (GLhandleARB programObj
, GLuint index
, GLsizei maxLength
, GLsizei
*length
,
1100 GLint
*size
, GLenum
*type
, GLcharARB
*name
)
1102 GET_CURRENT_CONTEXT(ctx
);
1103 GET_PROGRAM(pro
, programObj
, "glGetActiveUniformARB");
1108 if (size
== NULL
|| type
== NULL
|| name
== NULL
)
1109 _mesa_error (ctx
, GL_INVALID_VALUE
, "glGetActiveUniformARB");
1112 if (index
< (**pro
).GetActiveUniformCount (pro
))
1113 (**pro
).GetActiveUniform (pro
, index
, maxLength
, length
, size
, type
, name
);
1115 _mesa_error (ctx
, GL_INVALID_VALUE
, "glGetActiveUniformARB");
1117 RELEASE_PROGRAM(pro
);
1121 _mesa_GetUniformfvARB (GLhandleARB programObj
, GLint location
, GLfloat
*params
)
1123 GET_CURRENT_CONTEXT(ctx
);
1124 GET_LINKED_PROGRAM(pro
, programObj
, "glGetUniformfvARB");
1129 RELEASE_PROGRAM(pro
);
1134 _mesa_GetUniformivARB (GLhandleARB programObj
, GLint location
, GLint
*params
)
1136 GET_CURRENT_CONTEXT(ctx
);
1137 GET_LINKED_PROGRAM(pro
, programObj
, "glGetUniformivARB");
1142 RELEASE_PROGRAM(pro
);
1147 _mesa_GetShaderSourceARB (GLhandleARB obj
, GLsizei maxLength
, GLsizei
*length
, GLcharARB
*source
)
1149 GET_CURRENT_CONTEXT(ctx
);
1150 GET_SHADER(sha
, obj
, "glGetShaderSourceARB");
1156 _mesa_error (ctx
, GL_INVALID_VALUE
, "glGetShaderSourceARB");
1158 copy_string ((**sha
).GetSource (sha
), maxLength
, length
, source
);
1159 RELEASE_SHADER(sha
);
1162 /* GL_ARB_vertex_shader */
1165 _mesa_BindAttribLocationARB (GLhandleARB programObj
, GLuint index
, const GLcharARB
*name
)
1167 GET_CURRENT_CONTEXT(ctx
);
1168 GET_PROGRAM(pro
, programObj
, "glBindAttribLocationARB");
1173 if (name
== NULL
|| index
>= MAX_VERTEX_ATTRIBS
)
1174 _mesa_error (ctx
, GL_INVALID_VALUE
, "glBindAttribLocationARB");
1175 else if (IS_NAME_WITH_GL_PREFIX(name
))
1176 _mesa_error (ctx
, GL_INVALID_OPERATION
, "glBindAttribLocationARB");
1178 (**pro
).OverrideAttribBinding (pro
, index
, name
);
1179 RELEASE_PROGRAM(pro
);
1183 _mesa_GetActiveAttribARB (GLhandleARB programObj
, GLuint index
, GLsizei maxLength
, GLsizei
*length
,
1184 GLint
*size
, GLenum
*type
, GLcharARB
*name
)
1186 GET_CURRENT_CONTEXT(ctx
);
1187 GET_PROGRAM(pro
, programObj
, "glGetActiveAttribARB");
1192 if (name
== NULL
|| index
>= (**pro
).GetActiveAttribCount (pro
))
1193 _mesa_error (ctx
, GL_INVALID_VALUE
, "glGetActiveAttribARB");
1195 (**pro
).GetActiveAttrib (pro
, index
, maxLength
, length
, size
, type
, name
);
1196 RELEASE_PROGRAM(pro
);
1200 _mesa_GetAttribLocationARB (GLhandleARB programObj
, const GLcharARB
*name
)
1202 GET_CURRENT_CONTEXT(ctx
);
1204 GET_LINKED_PROGRAM(pro
, programObj
, "glGetAttribLocationARB");
1210 _mesa_error (ctx
, GL_INVALID_VALUE
, "glGetAttribLocationARB");
1211 else if (!IS_NAME_WITH_GL_PREFIX(name
))
1212 loc
= (**pro
).GetAttribLocation (pro
, name
);
1213 RELEASE_PROGRAM(pro
);
1218 _mesa_init_shaderobjects (GLcontext
*ctx
)
1220 ctx
->ShaderObjects
.CurrentProgram
= NULL
;
1221 ctx
->ShaderObjects
._FragmentShaderPresent
= GL_FALSE
;
1222 ctx
->ShaderObjects
._VertexShaderPresent
= GL_FALSE
;
1224 _mesa_init_shaderobjects_3dlabs (ctx
);