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))
55 static struct gl2_unknown_intf
**
56 lookup_handle(GLcontext
* ctx
, GLhandleARB handle
, enum gl2_uiid uiid
,
59 struct gl2_unknown_intf
**unk
;
62 * Note: _mesa_HashLookup() requires non-zero input values, so the
63 * passed-in handle value must be checked beforehand.
66 _mesa_error(ctx
, GL_INVALID_VALUE
, function
);
69 _glthread_LOCK_MUTEX(ctx
->Shared
->Mutex
);
70 unk
= (struct gl2_unknown_intf
**) _mesa_HashLookup(ctx
->Shared
->GL2Objects
,
72 _glthread_UNLOCK_MUTEX(ctx
->Shared
->Mutex
);
75 _mesa_error(ctx
, GL_INVALID_VALUE
, function
);
78 unk
= (**unk
).QueryInterface(unk
, uiid
);
80 _mesa_error(ctx
, GL_INVALID_OPERATION
, function
);
85 #define GET_GENERIC(x, handle, function)\
86 struct gl2_generic_intf **x = (struct gl2_generic_intf **)\
87 lookup_handle (ctx, handle, UIID_GENERIC, function);
89 #define GET_CONTAINER(x, handle, function)\
90 struct gl2_container_intf **x = (struct gl2_container_intf **)\
91 lookup_handle (ctx, handle, UIID_CONTAINER, function);
93 #define GET_PROGRAM(x, handle, function)\
94 struct gl2_program_intf **x = (struct gl2_program_intf **)\
95 lookup_handle (ctx, handle, UIID_PROGRAM, function);
97 #define GET_SHADER(x, handle, function)\
98 struct gl2_shader_intf **x = (struct gl2_shader_intf **)\
99 lookup_handle (ctx, handle, UIID_SHADER, function);
102 #define GET_LINKED_PROGRAM(x, handle, function) \
103 GET_PROGRAM(x, handle, function); \
104 if (x && (**x).GetLinkStatus(x) == GL_FALSE) { \
105 RELEASE_PROGRAM(x); \
106 _mesa_error(ctx, GL_INVALID_OPERATION, function); \
110 #define GET_CURRENT_LINKED_PROGRAM(x, function) \
111 struct gl2_program_intf **x = ctx->ShaderObjects.CurrentProgram; \
112 if (!x || (**x).GetLinkStatus(x) == GL_FALSE) { \
113 _mesa_error(ctx, GL_INVALID_OPERATION, function); \
119 #define IS_NAME_WITH_GL_PREFIX(x) ((x)[0] == 'g' && (x)[1] == 'l' && (x)[2] == '_')
123 _mesa_DeleteObjectARB(GLhandleARB obj
)
126 GET_CURRENT_CONTEXT(ctx
);
127 GET_GENERIC(gen
, obj
, "glDeleteObjectARB");
131 RELEASE_GENERIC(gen
);
136 GLhandleARB GLAPIENTRY
137 _mesa_GetHandleARB(GLenum pname
)
139 GET_CURRENT_CONTEXT(ctx
);
142 case GL_PROGRAM_OBJECT_ARB
:
144 struct gl2_program_intf
**pro
= ctx
->ShaderObjects
.CurrentProgram
;
147 return (**pro
)._container
._generic
.
148 GetName((struct gl2_generic_intf
**) (pro
));
152 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetHandleARB");
159 _mesa_DetachObjectARB(GLhandleARB containerObj
, GLhandleARB attachedObj
)
161 GET_CURRENT_CONTEXT(ctx
);
162 GET_CONTAINER(con
, containerObj
, "glDetachObjectARB");
165 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
,
183 const GLcharARB
** string
, const GLint
* length
)
185 GET_CURRENT_CONTEXT(ctx
);
189 GET_SHADER(sha
, shaderObj
, "glShaderSourceARB");
194 if (string
== NULL
) {
196 _mesa_error(ctx
, GL_INVALID_VALUE
, "glShaderSourceARB");
201 * This array holds offsets of where the appropriate string ends, thus the last
202 * element will be set to the total length of the source code.
204 offsets
= (GLint
*) _mesa_malloc(count
* sizeof(GLint
));
205 if (offsets
== NULL
) {
207 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "glShaderSourceARB");
211 for (i
= 0; i
< count
; i
++) {
212 if (string
[i
] == NULL
) {
213 _mesa_free((GLvoid
*) offsets
);
215 _mesa_error(ctx
, GL_INVALID_VALUE
, "glShaderSourceARB");
218 if (length
== NULL
|| length
[i
] < 0)
219 offsets
[i
] = _mesa_strlen(string
[i
]);
221 offsets
[i
] = length
[i
];
222 /* accumulate string lengths */
224 offsets
[i
] += offsets
[i
- 1];
228 (GLcharARB
*) _mesa_malloc((offsets
[count
- 1] + 1) *
230 if (source
== NULL
) {
231 _mesa_free((GLvoid
*) offsets
);
233 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "glShaderSourceARB");
237 for (i
= 0; i
< count
; i
++) {
238 GLint start
= (i
> 0) ? offsets
[i
- 1] : 0;
239 _mesa_memcpy(source
+ start
, string
[i
],
240 (offsets
[i
] - start
) * sizeof(GLcharARB
));
242 source
[offsets
[count
- 1]] = '\0';
244 (**sha
).SetSource(sha
, source
, offsets
, count
);
249 _mesa_CompileShaderARB(GLhandleARB shaderObj
)
251 GET_CURRENT_CONTEXT(ctx
);
252 GET_SHADER(sha
, shaderObj
, "glCompileShaderARB");
255 (**sha
).Compile(sha
);
260 GLhandleARB GLAPIENTRY
261 _mesa_CreateProgramObjectARB(GLvoid
)
263 return _mesa_3dlabs_create_program_object();
267 _mesa_AttachObjectARB(GLhandleARB containerObj
, GLhandleARB obj
)
269 GET_CURRENT_CONTEXT(ctx
);
270 GET_CONTAINER(con
, containerObj
, "glAttachObjectARB");
273 GET_GENERIC(att
, obj
, "glAttachObjectARB");
276 (**con
).Attach(con
, att
);
277 RELEASE_GENERIC(att
);
279 RELEASE_CONTAINER(con
);
284 _mesa_LinkProgramARB(GLhandleARB programObj
)
286 GET_CURRENT_CONTEXT(ctx
);
287 GET_PROGRAM(pro
, programObj
, "glLinkProgramARB");
291 if (pro
== ctx
->ShaderObjects
.CurrentProgram
) {
292 if ((**pro
).GetLinkStatus(pro
))
293 _mesa_UseProgramObjectARB(programObj
);
295 _mesa_UseProgramObjectARB(0);
297 RELEASE_PROGRAM(pro
);
302 _mesa_UseProgramObjectARB(GLhandleARB programObj
)
304 GET_CURRENT_CONTEXT(ctx
);
305 struct gl2_program_intf
**program
= NULL
;
307 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
309 if (programObj
!= 0) {
310 GET_PROGRAM(pro
, programObj
, "glUseProgramObjectARB");
315 if ((**pro
).GetLinkStatus(pro
) == GL_FALSE
) {
316 RELEASE_PROGRAM(pro
);
317 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glUseProgramObjectARB");
323 ctx
->ShaderObjects
._VertexShaderPresent
=
324 (**pro
).IsShaderPresent(pro
, GL_VERTEX_SHADER_ARB
);
325 ctx
->ShaderObjects
._FragmentShaderPresent
=
326 (**pro
).IsShaderPresent(pro
, GL_FRAGMENT_SHADER_ARB
);
329 ctx
->ShaderObjects
._VertexShaderPresent
= GL_FALSE
;
330 ctx
->ShaderObjects
._FragmentShaderPresent
= GL_FALSE
;
333 if (ctx
->ShaderObjects
.CurrentProgram
!= NULL
)
334 RELEASE_PROGRAM(ctx
->ShaderObjects
.CurrentProgram
);
335 ctx
->ShaderObjects
.CurrentProgram
= program
;
339 _mesa_ValidateProgramARB(GLhandleARB programObj
)
341 GET_CURRENT_CONTEXT(ctx
);
342 GET_PROGRAM(pro
, programObj
, "glValidateProgramARB");
345 (**pro
).Validate(pro
);
346 RELEASE_PROGRAM(pro
);
352 * Helper function for all the _mesa_Uniform*() functions below.
355 uniform(GLint location
, GLsizei count
, const GLvoid
*values
, GLenum type
,
358 GET_CURRENT_CONTEXT(ctx
);
359 GET_CURRENT_LINKED_PROGRAM(pro
, caller
);
361 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
363 if (!(**pro
).WriteUniform(pro
, location
, count
, values
, type
))
364 _mesa_error(ctx
, GL_INVALID_OPERATION
, caller
);
369 _mesa_Uniform1fARB(GLint location
, GLfloat v0
)
371 uniform(location
, 1, &v0
, GL_FLOAT
, "glUniform1fARB");
375 _mesa_Uniform2fARB(GLint location
, GLfloat v0
, GLfloat v1
)
380 uniform(location
, 1, v
, GL_FLOAT_VEC2
, "glUniform2fARB");
384 _mesa_Uniform3fARB(GLint location
, GLfloat v0
, GLfloat v1
, GLfloat v2
)
390 uniform(location
, 1, v
, GL_FLOAT_VEC3
, "glUniform3fARB");
394 _mesa_Uniform4fARB(GLint location
, GLfloat v0
, GLfloat v1
, GLfloat v2
,
402 uniform(location
, 1, v
, GL_FLOAT_VEC4
, "glUniform4fARB");
406 _mesa_Uniform1iARB(GLint location
, GLint v0
)
408 uniform(location
, 1, &v0
, GL_INT
, "glUniform1iARB");
412 _mesa_Uniform2iARB(GLint location
, GLint v0
, GLint v1
)
417 uniform(location
, 1, v
, GL_INT_VEC2
, "glUniform2iARB");
421 _mesa_Uniform3iARB(GLint location
, GLint v0
, GLint v1
, GLint v2
)
427 uniform(location
, 1, v
, GL_INT_VEC3
, "glUniform3iARB");
431 _mesa_Uniform4iARB(GLint location
, GLint v0
, GLint v1
, GLint v2
, GLint v3
)
438 uniform(location
, 1, v
, GL_INT_VEC4
, "glUniform4iARB");
442 _mesa_Uniform1fvARB(GLint location
, GLsizei count
, const GLfloat
* value
)
444 uniform(location
, count
, value
, GL_FLOAT
, "glUniform1fvARB");
448 _mesa_Uniform2fvARB(GLint location
, GLsizei count
, const GLfloat
* value
)
450 uniform(location
, count
, value
, GL_FLOAT_VEC2
, "glUniform2fvARB");
454 _mesa_Uniform3fvARB(GLint location
, GLsizei count
, const GLfloat
* value
)
456 uniform(location
, count
, value
, GL_FLOAT_VEC3
, "glUniform3fvARB");
460 _mesa_Uniform4fvARB(GLint location
, GLsizei count
, const GLfloat
* value
)
462 uniform(location
, count
, value
, GL_FLOAT_VEC4
, "glUniform4fvARB");
466 _mesa_Uniform1ivARB(GLint location
, GLsizei count
, const GLint
* value
)
468 uniform(location
, count
, value
, GL_INT
, "glUniform1ivARB");
472 _mesa_Uniform2ivARB(GLint location
, GLsizei count
, const GLint
* value
)
474 uniform(location
, count
, value
, GL_INT_VEC2
, "glUniform2ivARB");
478 _mesa_Uniform3ivARB(GLint location
, GLsizei count
, const GLint
* value
)
480 uniform(location
, count
, value
, GL_INT_VEC3
, "glUniform3ivARB");
484 _mesa_Uniform4ivARB(GLint location
, GLsizei count
, const GLint
* value
)
486 uniform(location
, count
, value
, GL_INT_VEC4
, "glUniform4ivARB");
491 * Helper function used by UniformMatrix**vARB() functions below.
494 uniform_matrix(GLint cols
, GLint rows
, const char *caller
,
496 GLint location
, GLsizei count
, GLboolean transpose
,
497 const GLfloat
*values
)
499 const GLint matElements
= rows
* cols
;
500 GET_CURRENT_CONTEXT(ctx
);
501 GET_CURRENT_LINKED_PROGRAM(pro
, caller
);
503 if (values
== NULL
) {
504 _mesa_error(ctx
, GL_INVALID_VALUE
, caller
);
508 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
515 trans
= (GLfloat
*) _mesa_malloc(count
* matElements
* sizeof(GLfloat
));
517 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, caller
);
523 for (i
= 0; i
< count
; i
++) {
524 /* transpose from pv matrix into pt matrix */
525 for (j
= 0; j
< cols
; j
++) {
526 for (k
= 0; k
< rows
; k
++) {
527 /* XXX verify this */
528 pt
[j
* rows
+ k
] = pv
[k
* cols
+ j
];
535 if (!(**pro
).WriteUniform(pro
, location
, count
, trans
, matrixType
))
536 _mesa_error(ctx
, GL_INVALID_OPERATION
, caller
);
540 if (!(**pro
).WriteUniform(pro
, location
, count
, values
, matrixType
))
541 _mesa_error(ctx
, GL_INVALID_OPERATION
, caller
);
547 _mesa_UniformMatrix2fvARB(GLint location
, GLsizei count
, GLboolean transpose
,
548 const GLfloat
* value
)
550 uniform_matrix(2, 2, "glUniformMatrix2fvARB", GL_FLOAT_MAT2
,
551 location
, count
, transpose
, value
);
555 _mesa_UniformMatrix3fvARB(GLint location
, GLsizei count
, GLboolean transpose
,
556 const GLfloat
* value
)
558 uniform_matrix(3, 3, "glUniformMatrix3fvARB", GL_FLOAT_MAT3
,
559 location
, count
, transpose
, value
);
563 _mesa_UniformMatrix4fvARB(GLint location
, GLsizei count
, GLboolean transpose
,
564 const GLfloat
* value
)
566 uniform_matrix(4, 4, "glUniformMatrix4fvARB", GL_FLOAT_MAT4
,
567 location
, count
, transpose
, value
);
571 _mesa_get_object_parameter(GLhandleARB obj
, GLenum pname
, GLvoid
* params
,
572 GLboolean
* integral
, GLint
* size
)
574 GET_CURRENT_CONTEXT(ctx
);
575 GLint
*ipar
= (GLint
*) params
;
577 /* set default values */
578 *integral
= GL_TRUE
; /* indicates param type, TRUE: GLint, FALSE: GLfloat */
579 *size
= 1; /* param array size */
582 case GL_OBJECT_TYPE_ARB
:
583 case GL_OBJECT_DELETE_STATUS_ARB
:
584 case GL_OBJECT_INFO_LOG_LENGTH_ARB
:
586 GET_GENERIC(gen
, obj
, "glGetObjectParameterivARB");
592 case GL_OBJECT_TYPE_ARB
:
593 *ipar
= (**gen
).GetType(gen
);
595 case GL_OBJECT_DELETE_STATUS_ARB
:
596 *ipar
= (**gen
).GetDeleteStatus(gen
);
598 case GL_OBJECT_INFO_LOG_LENGTH_ARB
:
599 *ipar
= (**gen
).GetInfoLogLength(gen
);
603 RELEASE_GENERIC(gen
);
606 case GL_OBJECT_SUBTYPE_ARB
:
607 case GL_OBJECT_COMPILE_STATUS_ARB
:
608 case GL_OBJECT_SHADER_SOURCE_LENGTH_ARB
:
610 GET_SHADER(sha
, obj
, "glGetObjectParameterivARB");
616 case GL_OBJECT_SUBTYPE_ARB
:
617 *ipar
= (**sha
).GetSubType(sha
);
619 case GL_OBJECT_COMPILE_STATUS_ARB
:
620 *ipar
= (**sha
).GetCompileStatus(sha
);
622 case GL_OBJECT_SHADER_SOURCE_LENGTH_ARB
:
624 const GLcharARB
*src
= (**sha
).GetSource(sha
);
628 *ipar
= _mesa_strlen(src
) + 1;
636 case GL_OBJECT_LINK_STATUS_ARB
:
637 case GL_OBJECT_VALIDATE_STATUS_ARB
:
638 case GL_OBJECT_ATTACHED_OBJECTS_ARB
:
639 case GL_OBJECT_ACTIVE_UNIFORMS_ARB
:
640 case GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB
:
642 GET_PROGRAM(pro
, obj
, "glGetObjectParameterivARB");
648 case GL_OBJECT_LINK_STATUS_ARB
:
649 *ipar
= (**pro
).GetLinkStatus(pro
);
651 case GL_OBJECT_VALIDATE_STATUS_ARB
:
652 *ipar
= (**pro
).GetValidateStatus(pro
);
654 case GL_OBJECT_ATTACHED_OBJECTS_ARB
:
657 GetAttachedCount((struct gl2_container_intf
**) (pro
));
659 case GL_OBJECT_ACTIVE_UNIFORMS_ARB
:
660 *ipar
= (**pro
).GetActiveUniformCount(pro
);
662 case GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB
:
663 *ipar
= (**pro
).GetActiveUniformMaxLength(pro
);
665 case GL_OBJECT_ACTIVE_ATTRIBUTES_ARB
:
666 *ipar
= (**pro
).GetActiveAttribCount(pro
);
668 case GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB
:
669 *ipar
= (**pro
).GetActiveAttribMaxLength(pro
);
673 RELEASE_PROGRAM(pro
);
677 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetObjectParameterivARB");
685 _mesa_GetObjectParameterfvARB(GLhandleARB obj
, GLenum pname
, GLfloat
* params
)
687 GET_CURRENT_CONTEXT(ctx
);
691 if (params
== NULL
) {
692 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetObjectParameterfvARB");
696 assert(sizeof(GLfloat
) == sizeof(GLint
));
698 if (_mesa_get_object_parameter(obj
, pname
, (GLvoid
*) params
,
702 for (i
= 0; i
< size
; i
++)
703 params
[i
] = (GLfloat
) ((GLint
*) params
)[i
];
709 _mesa_GetObjectParameterivARB(GLhandleARB obj
, GLenum pname
, GLint
* params
)
711 GET_CURRENT_CONTEXT(ctx
);
715 if (params
== NULL
) {
716 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetObjectParameterivARB");
720 assert(sizeof(GLfloat
) == sizeof(GLint
));
722 if (_mesa_get_object_parameter(obj
, pname
, (GLvoid
*) params
,
726 for (i
= 0; i
< size
; i
++)
727 params
[i
] = (GLint
) ((GLfloat
*) params
)[i
];
734 * Copy string from <src> to <dst>, up to maxLength characters, returning
735 * length of <dst> in <length>.
736 * \param src the strings source
737 * \param maxLength max chars to copy
738 * \param length returns numberof chars copied
739 * \param dst the string destination
742 copy_string(const GLcharARB
* src
, GLsizei maxLength
, GLsizei
* length
,
746 for (len
= 0; len
< maxLength
- 1 && src
&& src
[len
]; len
++)
756 _mesa_GetInfoLogARB(GLhandleARB obj
, GLsizei maxLength
, GLsizei
* length
,
759 GET_CURRENT_CONTEXT(ctx
);
760 GET_GENERIC(gen
, obj
, "glGetInfoLogARB");
766 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetInfoLogARB");
768 GLsizei actualsize
= (**gen
).GetInfoLogLength(gen
);
769 if (actualsize
> maxLength
)
770 actualsize
= maxLength
;
771 (**gen
).GetInfoLog(gen
, actualsize
, infoLog
);
773 *length
= (actualsize
> 0) ? actualsize
- 1 : 0;
775 RELEASE_GENERIC(gen
);
779 _mesa_GetAttachedObjectsARB(GLhandleARB containerObj
, GLsizei maxCount
,
780 GLsizei
* count
, GLhandleARB
* obj
)
782 GET_CURRENT_CONTEXT(ctx
);
783 GET_CONTAINER(con
, containerObj
, "glGetAttachedObjectsARB");
789 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetAttachedObjectsARB");
793 cnt
= (**con
).GetAttachedCount(con
);
799 for (i
= 0; i
< cnt
; i
++) {
800 struct gl2_generic_intf
**x
= (**con
).GetAttached(con
, i
);
801 obj
[i
] = (**x
).GetName(x
);
805 RELEASE_CONTAINER(con
);
809 _mesa_GetUniformLocationARB(GLhandleARB programObj
, const GLcharARB
* name
)
811 GET_CURRENT_CONTEXT(ctx
);
813 GET_LINKED_PROGRAM(pro
, programObj
, "glGetUniformLocationARB");
819 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetUniformLocationARB");
821 if (!IS_NAME_WITH_GL_PREFIX(name
))
822 loc
= (**pro
).GetUniformLocation(pro
, name
);
824 RELEASE_PROGRAM(pro
);
829 _mesa_GetActiveUniformARB(GLhandleARB programObj
, GLuint index
,
830 GLsizei maxLength
, GLsizei
* length
, GLint
* size
,
831 GLenum
* type
, GLcharARB
* name
)
833 GET_CURRENT_CONTEXT(ctx
);
834 GET_PROGRAM(pro
, programObj
, "glGetActiveUniformARB");
839 if (size
== NULL
|| type
== NULL
|| name
== NULL
)
840 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetActiveUniformARB");
842 if (index
< (**pro
).GetActiveUniformCount(pro
))
843 (**pro
).GetActiveUniform(pro
, index
, maxLength
, length
, size
, type
,
846 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetActiveUniformARB");
848 RELEASE_PROGRAM(pro
);
852 _mesa_GetUniformfvARB(GLhandleARB programObj
, GLint location
, GLfloat
* params
)
854 GET_CURRENT_CONTEXT(ctx
);
855 GET_LINKED_PROGRAM(pro
, programObj
, "glGetUniformfvARB");
860 if (!(**pro
).ReadUniform(pro
, location
, 1, params
, GL_FLOAT
))
861 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glGetUniformfvARB");
863 RELEASE_PROGRAM(pro
);
867 _mesa_GetUniformivARB(GLhandleARB programObj
, GLint location
, GLint
* params
)
869 GET_CURRENT_CONTEXT(ctx
);
870 GET_LINKED_PROGRAM(pro
, programObj
, "glGetUniformivARB");
875 if (!(**pro
).ReadUniform(pro
, location
, 1, params
, GL_INT
))
876 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glGetUniformivARB");
877 RELEASE_PROGRAM(pro
);
881 _mesa_GetShaderSourceARB(GLhandleARB obj
, GLsizei maxLength
, GLsizei
* length
,
884 GET_CURRENT_CONTEXT(ctx
);
885 GET_SHADER(sha
, obj
, "glGetShaderSourceARB");
891 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetShaderSourceARB");
893 copy_string((**sha
).GetSource(sha
), maxLength
, length
, source
);
897 /* GL_ARB_vertex_shader */
900 _mesa_BindAttribLocationARB(GLhandleARB programObj
, GLuint index
,
901 const GLcharARB
* name
)
903 GET_CURRENT_CONTEXT(ctx
);
904 GET_PROGRAM(pro
, programObj
, "glBindAttribLocationARB");
909 if (name
== NULL
|| index
>= MAX_VERTEX_ATTRIBS
)
910 _mesa_error(ctx
, GL_INVALID_VALUE
, "glBindAttribLocationARB");
911 else if (IS_NAME_WITH_GL_PREFIX(name
))
912 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glBindAttribLocationARB");
914 (**pro
).OverrideAttribBinding(pro
, index
, name
);
915 RELEASE_PROGRAM(pro
);
919 _mesa_GetActiveAttribARB(GLhandleARB programObj
, GLuint index
,
920 GLsizei maxLength
, GLsizei
* length
, GLint
* size
,
921 GLenum
* type
, GLcharARB
* name
)
923 GET_CURRENT_CONTEXT(ctx
);
924 GET_PROGRAM(pro
, programObj
, "glGetActiveAttribARB");
929 if (name
== NULL
|| index
>= (**pro
).GetActiveAttribCount(pro
))
930 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetActiveAttribARB");
932 (**pro
).GetActiveAttrib(pro
, index
, maxLength
, length
, size
, type
,
934 RELEASE_PROGRAM(pro
);
938 _mesa_GetAttribLocationARB(GLhandleARB programObj
, const GLcharARB
* name
)
940 GET_CURRENT_CONTEXT(ctx
);
942 GET_LINKED_PROGRAM(pro
, programObj
, "glGetAttribLocationARB");
948 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetAttribLocationARB");
949 else if (!IS_NAME_WITH_GL_PREFIX(name
))
950 loc
= (**pro
).GetAttribLocation(pro
, name
);
951 RELEASE_PROGRAM(pro
);
957 ** OpenGL 2.0 functions which basically wrap the ARB_shader functions
961 _mesa_AttachShader(GLuint program
, GLuint shader
)
963 _mesa_AttachObjectARB(program
, shader
);
968 _mesa_CreateShader(GLenum type
)
970 return (GLuint
) _mesa_CreateShaderObjectARB(type
);
974 _mesa_CreateProgram(void)
976 return (GLuint
) _mesa_CreateProgramObjectARB();
980 _mesa_DeleteProgram(GLuint program
)
982 _mesa_DeleteObjectARB(program
);
987 _mesa_DeleteShader(GLuint shader
)
989 _mesa_DeleteObjectARB(shader
);
993 _mesa_DetachShader(GLuint program
, GLuint shader
)
995 _mesa_DetachObjectARB(program
, shader
);
999 _mesa_GetAttachedShaders(GLuint program
, GLsizei maxCount
,
1000 GLsizei
*count
, GLuint
*obj
)
1002 _mesa_GetAttachedObjectsARB(program
, maxCount
, count
, obj
);
1006 _mesa_GetProgramiv(GLuint program
, GLenum pname
, GLint
*params
)
1008 GET_CURRENT_CONTEXT(ctx
);
1009 GET_PROGRAM(pro
, program
, "glGetProgramiv");
1015 case GL_DELETE_STATUS
:
1016 *params
= (**pro
)._container
._generic
.GetDeleteStatus((struct gl2_generic_inf
**) pro
);
1018 case GL_LINK_STATUS
:
1019 *params
= (**pro
).GetLinkStatus(pro
);
1021 case GL_VALIDATE_STATUS
:
1022 *params
= (**pro
).GetValidateStatus(pro
);
1024 case GL_INFO_LOG_LENGTH
:
1025 *params
= (**pro
)._container
._generic
.GetInfoLogLength( (struct gl2_unknown_inf
**) pro
);
1027 case GL_ATTACHED_SHADERS
:
1028 *params
= (**pro
)._container
.GetAttachedCount( (struct gl2_unknown_inf
**) pro
);
1030 case GL_ACTIVE_ATTRIBUTES
:
1031 *params
= (**pro
).GetActiveAttribCount(pro
);
1033 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH
:
1034 *params
= (**pro
).GetActiveAttribMaxLength(pro
);
1036 case GL_ACTIVE_UNIFORMS
:
1037 *params
= (**pro
).GetActiveUniformCount(pro
);
1039 case GL_ACTIVE_UNIFORM_MAX_LENGTH
:
1040 *params
= (**pro
).GetActiveUniformMaxLength(pro
);
1043 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramiv(pname)");
1049 _mesa_GetProgramInfoLog(GLuint program
, GLsizei bufSize
,
1050 GLsizei
*length
, GLchar
*infoLog
)
1052 _mesa_GetInfoLogARB(program
, bufSize
, length
, infoLog
);
1056 _mesa_GetShaderiv(GLuint shader
, GLenum pname
, GLint
*params
)
1058 GET_CURRENT_CONTEXT(ctx
);
1059 GET_SHADER(sh
, shader
, "glGetShaderiv");
1065 case GL_SHADER_TYPE
:
1066 *params
= (**sh
).GetSubType(sh
);
1068 case GL_DELETE_STATUS
:
1069 *params
= (**sh
)._generic
.GetDeleteStatus((struct gl2_generic_inf
**) sh
);
1071 case GL_COMPILE_STATUS
:
1072 *params
= (**sh
).GetCompileStatus(sh
);
1074 case GL_INFO_LOG_LENGTH
:
1075 *params
= (**sh
)._generic
.GetInfoLogLength((struct gl2_generic_inf
**)sh
);
1077 case GL_SHADER_SOURCE_LENGTH
:
1079 const GLchar
*src
= (**sh
).GetSource(sh
);
1080 *params
= src
? (_mesa_strlen(src
) + 1) : 0;
1084 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetShaderiv(pname)");
1090 _mesa_GetShaderInfoLog(GLuint shader
, GLsizei bufSize
,
1091 GLsizei
*length
, GLchar
*infoLog
)
1093 _mesa_GetInfoLogARB(shader
, bufSize
, length
, infoLog
);
1096 GLboolean GLAPIENTRY
1097 _mesa_IsProgram(GLuint program
)
1099 GET_CURRENT_CONTEXT(ctx
);
1100 GET_PROGRAM(pro
, program
, "glIsProgram");
1102 RELEASE_PROGRAM(pro
);
1110 GLboolean GLAPIENTRY
1111 _mesa_IsShader(GLuint shader
)
1113 GET_CURRENT_CONTEXT(ctx
);
1114 GET_SHADER(sh
, shader
, "glIsProgram");
1130 _mesa_UniformMatrix2x3fv(GLint location
, GLsizei count
, GLboolean transpose
,
1131 const GLfloat
*value
)
1133 uniform_matrix(2, 3, "glUniformMatrix2x3fv", GL_FLOAT_MAT2x3
,
1134 location
, count
, transpose
, value
);
1138 _mesa_UniformMatrix3x2fv(GLint location
, GLsizei count
, GLboolean transpose
,
1139 const GLfloat
*value
)
1141 uniform_matrix(3, 2, "glUniformMatrix3x2fv", GL_FLOAT_MAT3x2
,
1142 location
, count
, transpose
, value
);
1146 _mesa_UniformMatrix2x4fv(GLint location
, GLsizei count
, GLboolean transpose
,
1147 const GLfloat
*value
)
1149 uniform_matrix(2, 4, "glUniformMatrix2x4fv", GL_FLOAT_MAT2x4
,
1150 location
, count
, transpose
, value
);
1154 _mesa_UniformMatrix4x2fv(GLint location
, GLsizei count
, GLboolean transpose
,
1155 const GLfloat
*value
)
1157 uniform_matrix(4, 2, "glUniformMatrix4x2fv", GL_FLOAT_MAT4x2
,
1158 location
, count
, transpose
, value
);
1162 _mesa_UniformMatrix3x4fv(GLint location
, GLsizei count
, GLboolean transpose
,
1163 const GLfloat
*value
)
1165 uniform_matrix(3, 4, "glUniformMatrix3x4fv", GL_FLOAT_MAT3x4
,
1166 location
, count
, transpose
, value
);
1170 _mesa_UniformMatrix4x3fv(GLint location
, GLsizei count
, GLboolean transpose
,
1171 const GLfloat
*value
)
1173 uniform_matrix(4, 3, "glUniformMatrix4x3fv", GL_FLOAT_MAT4x3
,
1174 location
, count
, transpose
, value
);
1184 _mesa_init_shaderobjects(GLcontext
* ctx
)
1186 ctx
->ShaderObjects
.CurrentProgram
= NULL
;
1187 ctx
->ShaderObjects
._FragmentShaderPresent
= GL_FALSE
;
1188 ctx
->ShaderObjects
._VertexShaderPresent
= GL_FALSE
;
1190 _mesa_init_shaderobjects_3dlabs(ctx
);