2 * Mesa 3-D graphics library
4 * Copyright (C) 2004-2008 Brian Paul All Rights Reserved.
5 * Copyright (C) 2009-2010 VMware, Inc. 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 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
21 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
22 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23 * OTHER DEALINGS IN THE SOFTWARE.
30 * Implementation of GLSL-related API functions.
31 * The glUniform* functions are in uniforms.c
35 * 1. Check that the right error code is generated for all _mesa_error() calls.
36 * 2. Insert FLUSH_VERTICES calls in various places
41 #include "main/glheader.h"
42 #include "main/context.h"
43 #include "main/dispatch.h"
44 #include "main/enums.h"
45 #include "main/glspirv.h"
46 #include "main/hash.h"
47 #include "main/mtypes.h"
48 #include "main/pipelineobj.h"
49 #include "main/program_binary.h"
50 #include "main/shaderapi.h"
51 #include "main/shaderobj.h"
52 #include "main/transformfeedback.h"
53 #include "main/uniforms.h"
54 #include "compiler/glsl/glsl_parser_extras.h"
55 #include "compiler/glsl/ir.h"
56 #include "compiler/glsl/ir_uniform.h"
57 #include "compiler/glsl/program.h"
58 #include "program/program.h"
59 #include "program/prog_print.h"
60 #include "program/prog_parameter.h"
61 #include "util/ralloc.h"
62 #include "util/hash_table.h"
63 #include "util/mesa-sha1.h"
64 #include "util/crc32.h"
67 * Return mask of GLSL_x flags by examining the MESA_GLSL env var.
70 _mesa_get_shader_flags(void)
72 GLbitfield flags
= 0x0;
73 const char *env
= getenv("MESA_GLSL");
76 if (strstr(env
, "dump_on_error"))
77 flags
|= GLSL_DUMP_ON_ERROR
;
78 else if (strstr(env
, "dump"))
80 if (strstr(env
, "log"))
82 if (strstr(env
, "cache_fb"))
83 flags
|= GLSL_CACHE_FALLBACK
;
84 if (strstr(env
, "cache_info"))
85 flags
|= GLSL_CACHE_INFO
;
86 if (strstr(env
, "nopvert"))
87 flags
|= GLSL_NOP_VERT
;
88 if (strstr(env
, "nopfrag"))
89 flags
|= GLSL_NOP_FRAG
;
90 if (strstr(env
, "uniform"))
91 flags
|= GLSL_UNIFORMS
;
92 if (strstr(env
, "useprog"))
93 flags
|= GLSL_USE_PROG
;
94 if (strstr(env
, "errors"))
95 flags
|= GLSL_REPORT_ERRORS
;
102 * Memoized version of getenv("MESA_SHADER_CAPTURE_PATH").
105 _mesa_get_shader_capture_path(void)
107 static bool read_env_var
= false;
108 static const char *path
= NULL
;
111 path
= getenv("MESA_SHADER_CAPTURE_PATH");
119 * Initialize context's shader state.
122 _mesa_init_shader_state(struct gl_context
*ctx
)
124 /* Device drivers may override these to control what kind of instructions
125 * are generated by the GLSL compiler.
127 struct gl_shader_compiler_options options
;
131 memset(&options
, 0, sizeof(options
));
132 options
.MaxUnrollIterations
= 32;
133 options
.MaxIfDepth
= UINT_MAX
;
135 for (sh
= 0; sh
< MESA_SHADER_STAGES
; ++sh
)
136 memcpy(&ctx
->Const
.ShaderCompilerOptions
[sh
], &options
, sizeof(options
));
138 ctx
->Shader
.Flags
= _mesa_get_shader_flags();
140 if (ctx
->Shader
.Flags
!= 0)
141 ctx
->Const
.GenerateTemporaryNames
= true;
143 /* Extended for ARB_separate_shader_objects */
144 ctx
->Shader
.RefCount
= 1;
145 ctx
->TessCtrlProgram
.patch_vertices
= 3;
146 for (i
= 0; i
< 4; ++i
)
147 ctx
->TessCtrlProgram
.patch_default_outer_level
[i
] = 1.0;
148 for (i
= 0; i
< 2; ++i
)
149 ctx
->TessCtrlProgram
.patch_default_inner_level
[i
] = 1.0;
154 * Free the per-context shader-related state.
157 _mesa_free_shader_state(struct gl_context
*ctx
)
159 for (int i
= 0; i
< MESA_SHADER_STAGES
; i
++) {
160 _mesa_reference_program(ctx
, &ctx
->Shader
.CurrentProgram
[i
], NULL
);
162 _mesa_reference_shader_program(ctx
, &ctx
->Shader
.ActiveProgram
, NULL
);
164 /* Extended for ARB_separate_shader_objects */
165 _mesa_reference_pipeline_object(ctx
, &ctx
->_Shader
, NULL
);
167 assert(ctx
->Shader
.RefCount
== 1);
172 * Copy string from <src> to <dst>, up to maxLength characters, returning
173 * length of <dst> in <length>.
174 * \param src the strings source
175 * \param maxLength max chars to copy
176 * \param length returns number of chars copied
177 * \param dst the string destination
180 _mesa_copy_string(GLchar
*dst
, GLsizei maxLength
,
181 GLsizei
*length
, const GLchar
*src
)
184 for (len
= 0; len
< maxLength
- 1 && src
&& src
[len
]; len
++)
195 * Confirm that the a shader type is valid and supported by the implementation
197 * \param ctx Current GL context
198 * \param type Shader target
202 _mesa_validate_shader_target(const struct gl_context
*ctx
, GLenum type
)
204 /* Note: when building built-in GLSL functions, this function may be
205 * invoked with ctx == NULL. In that case, we can only validate that it's
206 * a shader target we recognize, not that it's supported in the current
207 * context. But that's fine--we don't need any further validation than
208 * that when building built-in GLSL functions.
212 case GL_FRAGMENT_SHADER
:
213 return ctx
== NULL
|| ctx
->Extensions
.ARB_fragment_shader
;
214 case GL_VERTEX_SHADER
:
215 return ctx
== NULL
|| ctx
->Extensions
.ARB_vertex_shader
;
216 case GL_GEOMETRY_SHADER_ARB
:
217 return ctx
== NULL
|| _mesa_has_geometry_shaders(ctx
);
218 case GL_TESS_CONTROL_SHADER
:
219 case GL_TESS_EVALUATION_SHADER
:
220 return ctx
== NULL
|| _mesa_has_tessellation(ctx
);
221 case GL_COMPUTE_SHADER
:
222 return ctx
== NULL
|| _mesa_has_compute_shaders(ctx
);
230 is_program(struct gl_context
*ctx
, GLuint name
)
232 struct gl_shader_program
*shProg
= _mesa_lookup_shader_program(ctx
, name
);
233 return shProg
? GL_TRUE
: GL_FALSE
;
238 is_shader(struct gl_context
*ctx
, GLuint name
)
240 struct gl_shader
*shader
= _mesa_lookup_shader(ctx
, name
);
241 return shader
? GL_TRUE
: GL_FALSE
;
246 * Attach shader to a shader program.
249 attach_shader(struct gl_context
*ctx
, struct gl_shader_program
*shProg
,
250 struct gl_shader
*sh
)
252 GLuint n
= shProg
->NumShaders
;
254 shProg
->Shaders
= realloc(shProg
->Shaders
,
255 (n
+ 1) * sizeof(struct gl_shader
*));
256 if (!shProg
->Shaders
) {
257 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "glAttachShader");
262 shProg
->Shaders
[n
] = NULL
; /* since realloc() didn't zero the new space */
263 _mesa_reference_shader(ctx
, &shProg
->Shaders
[n
], sh
);
264 shProg
->NumShaders
++;
268 attach_shader_err(struct gl_context
*ctx
, GLuint program
, GLuint shader
,
271 struct gl_shader_program
*shProg
;
272 struct gl_shader
*sh
;
275 const bool same_type_disallowed
= _mesa_is_gles(ctx
);
277 shProg
= _mesa_lookup_shader_program_err(ctx
, program
, caller
);
281 sh
= _mesa_lookup_shader_err(ctx
, shader
, caller
);
286 n
= shProg
->NumShaders
;
287 for (i
= 0; i
< n
; i
++) {
288 if (shProg
->Shaders
[i
] == sh
) {
289 /* The shader is already attched to this program. The
290 * GL_ARB_shader_objects spec says:
292 * "The error INVALID_OPERATION is generated by AttachObjectARB
293 * if <obj> is already attached to <containerObj>."
295 _mesa_error(ctx
, GL_INVALID_OPERATION
, "%s", caller
);
297 } else if (same_type_disallowed
&&
298 shProg
->Shaders
[i
]->Stage
== sh
->Stage
) {
299 /* Shader with the same type is already attached to this program,
300 * OpenGL ES 2.0 and 3.0 specs say:
302 * "Multiple shader objects of the same type may not be attached
303 * to a single program object. [...] The error INVALID_OPERATION
304 * is generated if [...] another shader object of the same type
305 * as shader is already attached to program."
307 _mesa_error(ctx
, GL_INVALID_OPERATION
, "%s", caller
);
312 attach_shader(ctx
, shProg
, sh
);
316 attach_shader_no_error(struct gl_context
*ctx
, GLuint program
, GLuint shader
)
318 struct gl_shader_program
*shProg
;
319 struct gl_shader
*sh
;
321 shProg
= _mesa_lookup_shader_program(ctx
, program
);
322 sh
= _mesa_lookup_shader(ctx
, shader
);
324 attach_shader(ctx
, shProg
, sh
);
328 create_shader(struct gl_context
*ctx
, GLenum type
)
330 struct gl_shader
*sh
;
333 _mesa_HashLockMutex(ctx
->Shared
->ShaderObjects
);
334 name
= _mesa_HashFindFreeKeyBlock(ctx
->Shared
->ShaderObjects
, 1);
335 sh
= _mesa_new_shader(name
, _mesa_shader_enum_to_shader_stage(type
));
337 _mesa_HashInsertLocked(ctx
->Shared
->ShaderObjects
, name
, sh
);
338 _mesa_HashUnlockMutex(ctx
->Shared
->ShaderObjects
);
345 create_shader_err(struct gl_context
*ctx
, GLenum type
, const char *caller
)
347 if (!_mesa_validate_shader_target(ctx
, type
)) {
348 _mesa_error(ctx
, GL_INVALID_ENUM
, "%s(%s)",
349 caller
, _mesa_enum_to_string(type
));
353 return create_shader(ctx
, type
);
358 create_shader_program(struct gl_context
*ctx
)
361 struct gl_shader_program
*shProg
;
363 _mesa_HashLockMutex(ctx
->Shared
->ShaderObjects
);
365 name
= _mesa_HashFindFreeKeyBlock(ctx
->Shared
->ShaderObjects
, 1);
367 shProg
= _mesa_new_shader_program(name
);
369 _mesa_HashInsertLocked(ctx
->Shared
->ShaderObjects
, name
, shProg
);
371 assert(shProg
->RefCount
== 1);
373 _mesa_HashUnlockMutex(ctx
->Shared
->ShaderObjects
);
380 * Delete a shader program. Actually, just decrement the program's
381 * reference count and mark it as DeletePending.
382 * Used to implement glDeleteProgram() and glDeleteObjectARB().
385 delete_shader_program(struct gl_context
*ctx
, GLuint name
)
388 * NOTE: deleting shaders/programs works a bit differently than
389 * texture objects (and buffer objects, etc). Shader/program
390 * handles/IDs exist in the hash table until the object is really
391 * deleted (refcount==0). With texture objects, the handle/ID is
392 * removed from the hash table in glDeleteTextures() while the tex
393 * object itself might linger until its refcount goes to zero.
395 struct gl_shader_program
*shProg
;
397 shProg
= _mesa_lookup_shader_program_err(ctx
, name
, "glDeleteProgram");
401 if (!shProg
->DeletePending
) {
402 shProg
->DeletePending
= GL_TRUE
;
404 /* effectively, decr shProg's refcount */
405 _mesa_reference_shader_program(ctx
, &shProg
, NULL
);
411 delete_shader(struct gl_context
*ctx
, GLuint shader
)
413 struct gl_shader
*sh
;
415 sh
= _mesa_lookup_shader_err(ctx
, shader
, "glDeleteShader");
419 if (!sh
->DeletePending
) {
420 sh
->DeletePending
= GL_TRUE
;
422 /* effectively, decr sh's refcount */
423 _mesa_reference_shader(ctx
, &sh
, NULL
);
428 static ALWAYS_INLINE
void
429 detach_shader(struct gl_context
*ctx
, GLuint program
, GLuint shader
,
432 struct gl_shader_program
*shProg
;
437 shProg
= _mesa_lookup_shader_program_err(ctx
, program
, "glDetachShader");
441 shProg
= _mesa_lookup_shader_program(ctx
, program
);
444 n
= shProg
->NumShaders
;
446 for (i
= 0; i
< n
; i
++) {
447 if (shProg
->Shaders
[i
]->Name
== shader
) {
449 struct gl_shader
**newList
;
452 _mesa_reference_shader(ctx
, &shProg
->Shaders
[i
], NULL
);
454 /* alloc new, smaller array */
455 newList
= malloc((n
- 1) * sizeof(struct gl_shader
*));
457 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "glDetachShader");
460 /* Copy old list entries to new list, skipping removed entry at [i] */
461 for (j
= 0; j
< i
; j
++) {
462 newList
[j
] = shProg
->Shaders
[j
];
465 newList
[j
++] = shProg
->Shaders
[i
];
468 /* Free old list and install new one */
469 free(shProg
->Shaders
);
470 shProg
->Shaders
= newList
;
471 shProg
->NumShaders
= n
- 1;
474 /* sanity check - make sure the new list's entries are sensible */
475 for (j
= 0; j
< shProg
->NumShaders
; j
++) {
476 assert(shProg
->Shaders
[j
]->Stage
== MESA_SHADER_VERTEX
||
477 shProg
->Shaders
[j
]->Stage
== MESA_SHADER_TESS_CTRL
||
478 shProg
->Shaders
[j
]->Stage
== MESA_SHADER_TESS_EVAL
||
479 shProg
->Shaders
[j
]->Stage
== MESA_SHADER_GEOMETRY
||
480 shProg
->Shaders
[j
]->Stage
== MESA_SHADER_FRAGMENT
);
481 assert(shProg
->Shaders
[j
]->RefCount
> 0);
492 if (is_shader(ctx
, shader
) || is_program(ctx
, shader
))
493 err
= GL_INVALID_OPERATION
;
495 err
= GL_INVALID_VALUE
;
496 _mesa_error(ctx
, err
, "glDetachShader(shader)");
503 detach_shader_error(struct gl_context
*ctx
, GLuint program
, GLuint shader
)
505 detach_shader(ctx
, program
, shader
, false);
510 detach_shader_no_error(struct gl_context
*ctx
, GLuint program
, GLuint shader
)
512 detach_shader(ctx
, program
, shader
, true);
517 * Return list of shaders attached to shader program.
518 * \param objOut returns GLuint ids
519 * \param handleOut returns GLhandleARB handles
522 get_attached_shaders(struct gl_context
*ctx
, GLuint program
, GLsizei maxCount
,
523 GLsizei
*countOut
, GLuint
*objOut
, GLhandleARB
*handleOut
)
525 struct gl_shader_program
*shProg
;
528 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetAttachedShaders(maxCount < 0)");
533 _mesa_lookup_shader_program_err(ctx
, program
, "glGetAttachedShaders");
537 for (i
= 0; i
< (GLuint
) maxCount
&& i
< shProg
->NumShaders
; i
++) {
539 objOut
[i
] = shProg
->Shaders
[i
]->Name
;
543 handleOut
[i
] = (GLhandleARB
) shProg
->Shaders
[i
]->Name
;
553 * glGetHandleARB() - return ID/name of currently bound shader program.
556 get_handle(struct gl_context
*ctx
, GLenum pname
)
558 if (pname
== GL_PROGRAM_OBJECT_ARB
) {
559 if (ctx
->_Shader
->ActiveProgram
)
560 return ctx
->_Shader
->ActiveProgram
->Name
;
565 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetHandleARB");
572 * Check if a geometry shader query is valid at this time. If not, report an
573 * error and return false.
575 * From GL 3.2 section 6.1.16 (Shader and Program Queries):
577 * "If GEOMETRY_VERTICES_OUT, GEOMETRY_INPUT_TYPE, or GEOMETRY_OUTPUT_TYPE
578 * are queried for a program which has not been linked successfully, or
579 * which does not contain objects to form a geometry shader, then an
580 * INVALID_OPERATION error is generated."
583 check_gs_query(struct gl_context
*ctx
, const struct gl_shader_program
*shProg
)
585 if (shProg
->data
->LinkStatus
&&
586 shProg
->_LinkedShaders
[MESA_SHADER_GEOMETRY
] != NULL
) {
590 _mesa_error(ctx
, GL_INVALID_OPERATION
,
591 "glGetProgramv(linked geometry shader required)");
597 * Check if a tessellation control shader query is valid at this time.
598 * If not, report an error and return false.
600 * From GL 4.0 section 6.1.12 (Shader and Program Queries):
602 * "If TESS_CONTROL_OUTPUT_VERTICES is queried for a program which has
603 * not been linked successfully, or which does not contain objects to
604 * form a tessellation control shader, then an INVALID_OPERATION error is
608 check_tcs_query(struct gl_context
*ctx
, const struct gl_shader_program
*shProg
)
610 if (shProg
->data
->LinkStatus
&&
611 shProg
->_LinkedShaders
[MESA_SHADER_TESS_CTRL
] != NULL
) {
615 _mesa_error(ctx
, GL_INVALID_OPERATION
,
616 "glGetProgramv(linked tessellation control shader required)");
622 * Check if a tessellation evaluation shader query is valid at this time.
623 * If not, report an error and return false.
625 * From GL 4.0 section 6.1.12 (Shader and Program Queries):
627 * "If any of the pname values in this paragraph are queried for a program
628 * which has not been linked successfully, or which does not contain
629 * objects to form a tessellation evaluation shader, then an
630 * INVALID_OPERATION error is generated."
634 check_tes_query(struct gl_context
*ctx
, const struct gl_shader_program
*shProg
)
636 if (shProg
->data
->LinkStatus
&&
637 shProg
->_LinkedShaders
[MESA_SHADER_TESS_EVAL
] != NULL
) {
641 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glGetProgramv(linked tessellation "
642 "evaluation shader required)");
648 * glGetProgramiv() - get shader program state.
649 * Note that this is for GLSL shader programs, not ARB vertex/fragment
650 * programs (see glGetProgramivARB).
653 get_programiv(struct gl_context
*ctx
, GLuint program
, GLenum pname
,
656 struct gl_shader_program
*shProg
657 = _mesa_lookup_shader_program_err(ctx
, program
, "glGetProgramiv(program)");
659 /* Is transform feedback available in this context?
662 (ctx
->API
== API_OPENGL_COMPAT
&& ctx
->Extensions
.EXT_transform_feedback
)
663 || ctx
->API
== API_OPENGL_CORE
664 || _mesa_is_gles3(ctx
);
666 /* True if geometry shaders (of the form that was adopted into GLSL 1.50
667 * and GL 3.2) are available in this context
669 const bool has_core_gs
= _mesa_has_geometry_shaders(ctx
);
670 const bool has_tess
= _mesa_has_tessellation(ctx
);
672 /* Are uniform buffer objects available in this context?
675 (ctx
->API
== API_OPENGL_COMPAT
&&
676 ctx
->Extensions
.ARB_uniform_buffer_object
)
677 || ctx
->API
== API_OPENGL_CORE
678 || _mesa_is_gles3(ctx
);
685 case GL_DELETE_STATUS
:
686 *params
= shProg
->DeletePending
;
689 *params
= shProg
->data
->LinkStatus
? GL_TRUE
: GL_FALSE
;
691 case GL_VALIDATE_STATUS
:
692 *params
= shProg
->data
->Validated
;
694 case GL_INFO_LOG_LENGTH
:
695 *params
= (shProg
->data
->InfoLog
&& shProg
->data
->InfoLog
[0] != '\0') ?
696 strlen(shProg
->data
->InfoLog
) + 1 : 0;
698 case GL_ATTACHED_SHADERS
:
699 *params
= shProg
->NumShaders
;
701 case GL_ACTIVE_ATTRIBUTES
:
702 *params
= _mesa_count_active_attribs(shProg
);
704 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH
:
705 *params
= _mesa_longest_attribute_name_length(shProg
);
707 case GL_ACTIVE_UNIFORMS
: {
709 const unsigned num_uniforms
=
710 shProg
->data
->NumUniformStorage
- shProg
->data
->NumHiddenUniforms
;
711 for (*params
= 0, i
= 0; i
< num_uniforms
; i
++) {
712 if (!shProg
->data
->UniformStorage
[i
].is_shader_storage
)
717 case GL_ACTIVE_UNIFORM_MAX_LENGTH
: {
720 const unsigned num_uniforms
=
721 shProg
->data
->NumUniformStorage
- shProg
->data
->NumHiddenUniforms
;
723 for (i
= 0; i
< num_uniforms
; i
++) {
724 if (shProg
->data
->UniformStorage
[i
].is_shader_storage
)
727 /* Add one for the terminating NUL character for a non-array, and
728 * 4 for the "[0]" and the NUL for an array.
730 const GLint len
= strlen(shProg
->data
->UniformStorage
[i
].name
) + 1 +
731 ((shProg
->data
->UniformStorage
[i
].array_elements
!= 0) ? 3 : 0);
740 case GL_TRANSFORM_FEEDBACK_VARYINGS
:
743 *params
= shProg
->TransformFeedback
.NumVarying
;
745 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH
: {
751 for (i
= 0; i
< shProg
->TransformFeedback
.NumVarying
; i
++) {
752 /* Add one for the terminating NUL character.
755 strlen(shProg
->TransformFeedback
.VaryingNames
[i
]) + 1;
764 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE
:
767 *params
= shProg
->TransformFeedback
.BufferMode
;
769 case GL_GEOMETRY_VERTICES_OUT
:
772 if (check_gs_query(ctx
, shProg
)) {
773 *params
= shProg
->_LinkedShaders
[MESA_SHADER_GEOMETRY
]->
774 Program
->info
.gs
.vertices_out
;
777 case GL_GEOMETRY_SHADER_INVOCATIONS
:
778 if (!has_core_gs
|| !ctx
->Extensions
.ARB_gpu_shader5
)
780 if (check_gs_query(ctx
, shProg
)) {
781 *params
= shProg
->_LinkedShaders
[MESA_SHADER_GEOMETRY
]->
782 Program
->info
.gs
.invocations
;
785 case GL_GEOMETRY_INPUT_TYPE
:
788 if (check_gs_query(ctx
, shProg
)) {
789 *params
= shProg
->_LinkedShaders
[MESA_SHADER_GEOMETRY
]->
790 Program
->info
.gs
.input_primitive
;
793 case GL_GEOMETRY_OUTPUT_TYPE
:
796 if (check_gs_query(ctx
, shProg
)) {
797 *params
= shProg
->_LinkedShaders
[MESA_SHADER_GEOMETRY
]->
798 Program
->info
.gs
.output_primitive
;
801 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH
: {
808 for (i
= 0; i
< shProg
->data
->NumUniformBlocks
; i
++) {
809 /* Add one for the terminating NUL character.
811 const GLint len
= strlen(shProg
->data
->UniformBlocks
[i
].Name
) + 1;
820 case GL_ACTIVE_UNIFORM_BLOCKS
:
824 *params
= shProg
->data
->NumUniformBlocks
;
826 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT
:
827 /* This enum isn't part of the OES extension for OpenGL ES 2.0. It is
828 * only available with desktop OpenGL 3.0+ with the
829 * GL_ARB_get_program_binary extension or OpenGL ES 3.0.
831 * On desktop, we ignore the 3.0+ requirement because it is silly.
833 if (!_mesa_is_desktop_gl(ctx
) && !_mesa_is_gles3(ctx
))
836 *params
= shProg
->BinaryRetreivableHint
;
838 case GL_PROGRAM_BINARY_LENGTH
:
839 if (ctx
->Const
.NumProgramBinaryFormats
== 0) {
842 _mesa_get_program_binary_length(ctx
, shProg
, params
);
845 case GL_ACTIVE_ATOMIC_COUNTER_BUFFERS
:
846 if (!ctx
->Extensions
.ARB_shader_atomic_counters
)
849 *params
= shProg
->data
->NumAtomicBuffers
;
851 case GL_COMPUTE_WORK_GROUP_SIZE
: {
853 if (!_mesa_has_compute_shaders(ctx
))
855 if (!shProg
->data
->LinkStatus
) {
856 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glGetProgramiv(program not "
860 if (shProg
->_LinkedShaders
[MESA_SHADER_COMPUTE
] == NULL
) {
861 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glGetProgramiv(no compute "
865 for (i
= 0; i
< 3; i
++)
866 params
[i
] = shProg
->_LinkedShaders
[MESA_SHADER_COMPUTE
]->
867 Program
->info
.cs
.local_size
[i
];
870 case GL_PROGRAM_SEPARABLE
:
871 /* If the program has not been linked, return initial value 0. */
872 *params
= (shProg
->data
->LinkStatus
== linking_failure
) ? 0 : shProg
->SeparateShader
;
875 /* ARB_tessellation_shader */
876 case GL_TESS_CONTROL_OUTPUT_VERTICES
:
879 if (check_tcs_query(ctx
, shProg
)) {
880 *params
= shProg
->_LinkedShaders
[MESA_SHADER_TESS_CTRL
]->
881 Program
->info
.tess
.tcs_vertices_out
;
884 case GL_TESS_GEN_MODE
:
887 if (check_tes_query(ctx
, shProg
)) {
888 *params
= shProg
->_LinkedShaders
[MESA_SHADER_TESS_EVAL
]->
889 Program
->info
.tess
.primitive_mode
;
892 case GL_TESS_GEN_SPACING
:
895 if (check_tes_query(ctx
, shProg
)) {
896 const struct gl_linked_shader
*tes
=
897 shProg
->_LinkedShaders
[MESA_SHADER_TESS_EVAL
];
898 switch (tes
->Program
->info
.tess
.spacing
) {
899 case TESS_SPACING_EQUAL
:
902 case TESS_SPACING_FRACTIONAL_ODD
:
903 *params
= GL_FRACTIONAL_ODD
;
905 case TESS_SPACING_FRACTIONAL_EVEN
:
906 *params
= GL_FRACTIONAL_EVEN
;
908 case TESS_SPACING_UNSPECIFIED
:
914 case GL_TESS_GEN_VERTEX_ORDER
:
917 if (check_tes_query(ctx
, shProg
)) {
918 *params
= shProg
->_LinkedShaders
[MESA_SHADER_TESS_EVAL
]->
919 Program
->info
.tess
.ccw
? GL_CCW
: GL_CW
;
922 case GL_TESS_GEN_POINT_MODE
:
925 if (check_tes_query(ctx
, shProg
)) {
926 *params
= shProg
->_LinkedShaders
[MESA_SHADER_TESS_EVAL
]->
927 Program
->info
.tess
.point_mode
? GL_TRUE
: GL_FALSE
;
934 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramiv(pname=%s)",
935 _mesa_enum_to_string(pname
));
940 * glGetShaderiv() - get GLSL shader state
943 get_shaderiv(struct gl_context
*ctx
, GLuint name
, GLenum pname
, GLint
*params
)
945 struct gl_shader
*shader
=
946 _mesa_lookup_shader_err(ctx
, name
, "glGetShaderiv");
954 *params
= shader
->Type
;
956 case GL_DELETE_STATUS
:
957 *params
= shader
->DeletePending
;
959 case GL_COMPILE_STATUS
:
960 *params
= shader
->CompileStatus
? GL_TRUE
: GL_FALSE
;
962 case GL_INFO_LOG_LENGTH
:
963 *params
= (shader
->InfoLog
&& shader
->InfoLog
[0] != '\0') ?
964 strlen(shader
->InfoLog
) + 1 : 0;
966 case GL_SHADER_SOURCE_LENGTH
:
967 *params
= shader
->Source
? strlen((char *) shader
->Source
) + 1 : 0;
970 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetShaderiv(pname)");
977 get_program_info_log(struct gl_context
*ctx
, GLuint program
, GLsizei bufSize
,
978 GLsizei
*length
, GLchar
*infoLog
)
980 struct gl_shader_program
*shProg
;
982 /* Section 2.5 GL Errors (page 18) of the OpenGL ES 3.0.4 spec and
983 * section 2.3.1 (Errors) of the OpenGL 4.5 spec say:
985 * "If a negative number is provided where an argument of type sizei or
986 * sizeiptr is specified, an INVALID_VALUE error is generated."
989 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetProgramInfoLog(bufSize < 0)");
993 shProg
= _mesa_lookup_shader_program_err(ctx
, program
,
994 "glGetProgramInfoLog(program)");
999 _mesa_copy_string(infoLog
, bufSize
, length
, shProg
->data
->InfoLog
);
1004 get_shader_info_log(struct gl_context
*ctx
, GLuint shader
, GLsizei bufSize
,
1005 GLsizei
*length
, GLchar
*infoLog
)
1007 struct gl_shader
*sh
;
1009 /* Section 2.5 GL Errors (page 18) of the OpenGL ES 3.0.4 spec and
1010 * section 2.3.1 (Errors) of the OpenGL 4.5 spec say:
1012 * "If a negative number is provided where an argument of type sizei or
1013 * sizeiptr is specified, an INVALID_VALUE error is generated."
1016 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetShaderInfoLog(bufSize < 0)");
1020 sh
= _mesa_lookup_shader_err(ctx
, shader
, "glGetShaderInfoLog(shader)");
1025 _mesa_copy_string(infoLog
, bufSize
, length
, sh
->InfoLog
);
1030 * Return shader source code.
1033 get_shader_source(struct gl_context
*ctx
, GLuint shader
, GLsizei maxLength
,
1034 GLsizei
*length
, GLchar
*sourceOut
)
1036 struct gl_shader
*sh
;
1038 if (maxLength
< 0) {
1039 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetShaderSource(bufSize < 0)");
1043 sh
= _mesa_lookup_shader_err(ctx
, shader
, "glGetShaderSource");
1047 _mesa_copy_string(sourceOut
, maxLength
, length
, sh
->Source
);
1052 * Set/replace shader source code. A helper function used by
1053 * glShaderSource[ARB].
1056 set_shader_source(struct gl_shader
*sh
, const GLchar
*source
)
1060 /* The GL_ARB_gl_spirv spec adds the following to the end of the description
1063 * "If <shader> was previously associated with a SPIR-V module (via the
1064 * ShaderBinary command), that association is broken. Upon successful
1065 * completion of this command the SPIR_V_BINARY_ARB state of <shader>
1068 _mesa_shader_spirv_data_reference(&sh
->spirv_data
, NULL
);
1070 if (sh
->CompileStatus
== compile_skipped
&& !sh
->FallbackSource
) {
1071 /* If shader was previously compiled back-up the source in case of cache
1074 sh
->FallbackSource
= sh
->Source
;
1075 sh
->Source
= source
;
1077 /* free old shader source string and install new one */
1078 free((void *)sh
->Source
);
1079 sh
->Source
= source
;
1083 sh
->SourceChecksum
= util_hash_crc32(sh
->Source
, strlen(sh
->Source
));
1092 _mesa_compile_shader(struct gl_context
*ctx
, struct gl_shader
*sh
)
1098 /* If the user called glCompileShader without first calling
1099 * glShaderSource, we should fail to compile, but not raise a GL_ERROR.
1101 sh
->CompileStatus
= compile_failure
;
1103 if (ctx
->_Shader
->Flags
& GLSL_DUMP
) {
1104 _mesa_log("GLSL source for %s shader %d:\n",
1105 _mesa_shader_stage_to_string(sh
->Stage
), sh
->Name
);
1106 _mesa_log("%s\n", sh
->Source
);
1109 /* this call will set the shader->CompileStatus field to indicate if
1110 * compilation was successful.
1112 _mesa_glsl_compile_shader(ctx
, sh
, false, false, false);
1114 if (ctx
->_Shader
->Flags
& GLSL_LOG
) {
1115 _mesa_write_shader_to_file(sh
);
1118 if (ctx
->_Shader
->Flags
& GLSL_DUMP
) {
1119 if (sh
->CompileStatus
) {
1121 _mesa_log("GLSL IR for shader %d:\n", sh
->Name
);
1122 _mesa_print_ir(_mesa_get_log_file(), sh
->ir
, NULL
);
1124 _mesa_log("No GLSL IR for shader %d (shader may be from "
1125 "cache)\n", sh
->Name
);
1129 _mesa_log("GLSL shader %d failed to compile.\n", sh
->Name
);
1131 if (sh
->InfoLog
&& sh
->InfoLog
[0] != 0) {
1132 _mesa_log("GLSL shader %d info log:\n", sh
->Name
);
1133 _mesa_log("%s\n", sh
->InfoLog
);
1138 if (!sh
->CompileStatus
) {
1139 if (ctx
->_Shader
->Flags
& GLSL_DUMP_ON_ERROR
) {
1140 _mesa_log("GLSL source for %s shader %d:\n",
1141 _mesa_shader_stage_to_string(sh
->Stage
), sh
->Name
);
1142 _mesa_log("%s\n", sh
->Source
);
1143 _mesa_log("Info Log:\n%s\n", sh
->InfoLog
);
1146 if (ctx
->_Shader
->Flags
& GLSL_REPORT_ERRORS
) {
1147 _mesa_debug(ctx
, "Error compiling shader %u:\n%s\n",
1148 sh
->Name
, sh
->InfoLog
);
1155 * Link a program's shaders.
1157 static ALWAYS_INLINE
void
1158 link_program(struct gl_context
*ctx
, struct gl_shader_program
*shProg
,
1165 /* From the ARB_transform_feedback2 specification:
1166 * "The error INVALID_OPERATION is generated by LinkProgram if <program>
1167 * is the name of a program being used by one or more transform feedback
1168 * objects, even if the objects are not currently bound or are paused."
1170 if (_mesa_transform_feedback_is_using_program(ctx
, shProg
)) {
1171 _mesa_error(ctx
, GL_INVALID_OPERATION
,
1172 "glLinkProgram(transform feedback is using the program)");
1177 unsigned programs_in_use
= 0;
1179 for (unsigned stage
= 0; stage
< MESA_SHADER_STAGES
; stage
++) {
1180 if (ctx
->_Shader
->CurrentProgram
[stage
] &&
1181 ctx
->_Shader
->CurrentProgram
[stage
]->Id
== shProg
->Name
) {
1182 programs_in_use
|= 1 << stage
;
1186 FLUSH_VERTICES(ctx
, 0);
1187 _mesa_glsl_link_shader(ctx
, shProg
);
1189 /* From section 7.3 (Program Objects) of the OpenGL 4.5 spec:
1191 * "If LinkProgram or ProgramBinary successfully re-links a program
1192 * object that is active for any shader stage, then the newly generated
1193 * executable code will be installed as part of the current rendering
1194 * state for all shader stages where the program is active.
1195 * Additionally, the newly generated executable code is made part of
1196 * the state of any program pipeline for all stages where the program
1199 if (shProg
->data
->LinkStatus
&& programs_in_use
) {
1200 while (programs_in_use
) {
1201 const int stage
= u_bit_scan(&programs_in_use
);
1203 struct gl_program
*prog
= NULL
;
1204 if (shProg
->_LinkedShaders
[stage
])
1205 prog
= shProg
->_LinkedShaders
[stage
]->Program
;
1207 _mesa_use_program(ctx
, stage
, shProg
, prog
, ctx
->_Shader
);
1211 /* Capture .shader_test files. */
1212 const char *capture_path
= _mesa_get_shader_capture_path();
1213 if (shProg
->Name
!= 0 && shProg
->Name
!= ~0 && capture_path
!= NULL
) {
1215 char *filename
= ralloc_asprintf(NULL
, "%s/%u.shader_test",
1216 capture_path
, shProg
->Name
);
1217 file
= fopen(filename
, "w");
1219 fprintf(file
, "[require]\nGLSL%s >= %u.%02u\n",
1220 shProg
->IsES
? " ES" : "",
1221 shProg
->data
->Version
/ 100, shProg
->data
->Version
% 100);
1222 if (shProg
->SeparateShader
)
1223 fprintf(file
, "GL_ARB_separate_shader_objects\nSSO ENABLED\n");
1224 fprintf(file
, "\n");
1226 for (unsigned i
= 0; i
< shProg
->NumShaders
; i
++) {
1227 fprintf(file
, "[%s shader]\n%s\n",
1228 _mesa_shader_stage_to_string(shProg
->Shaders
[i
]->Stage
),
1229 shProg
->Shaders
[i
]->Source
);
1233 _mesa_warning(ctx
, "Failed to open %s", filename
);
1236 ralloc_free(filename
);
1239 if (shProg
->data
->LinkStatus
== linking_failure
&&
1240 (ctx
->_Shader
->Flags
& GLSL_REPORT_ERRORS
)) {
1241 _mesa_debug(ctx
, "Error linking program %u:\n%s\n",
1242 shProg
->Name
, shProg
->data
->InfoLog
);
1249 printf("Link %u shaders in program %u: %s\n",
1250 shProg
->NumShaders
, shProg
->Name
,
1251 shProg
->data
->LinkStatus
? "Success" : "Failed");
1253 for (i
= 0; i
< shProg
->NumShaders
; i
++) {
1254 printf(" shader %u, stage %u\n",
1255 shProg
->Shaders
[i
]->Name
,
1256 shProg
->Shaders
[i
]->Stage
);
1263 link_program_error(struct gl_context
*ctx
, struct gl_shader_program
*shProg
)
1265 link_program(ctx
, shProg
, false);
1270 link_program_no_error(struct gl_context
*ctx
, struct gl_shader_program
*shProg
)
1272 link_program(ctx
, shProg
, true);
1277 _mesa_link_program(struct gl_context
*ctx
, struct gl_shader_program
*shProg
)
1279 link_program_error(ctx
, shProg
);
1284 * Print basic shader info (for debug).
1287 print_shader_info(const struct gl_shader_program
*shProg
)
1291 printf("Mesa: glUseProgram(%u)\n", shProg
->Name
);
1292 for (i
= 0; i
< shProg
->NumShaders
; i
++) {
1294 printf(" %s shader %u, checksum %u\n",
1295 _mesa_shader_stage_to_string(shProg
->Shaders
[i
]->Stage
),
1296 shProg
->Shaders
[i
]->Name
,
1297 shProg
->Shaders
[i
]->SourceChecksum
);
1299 printf(" %s shader %u\n",
1300 _mesa_shader_stage_to_string(shProg
->Shaders
[i
]->Stage
),
1301 shProg
->Shaders
[i
]->Name
);
1304 if (shProg
->_LinkedShaders
[MESA_SHADER_VERTEX
])
1305 printf(" vert prog %u\n",
1306 shProg
->_LinkedShaders
[MESA_SHADER_VERTEX
]->Program
->Id
);
1307 if (shProg
->_LinkedShaders
[MESA_SHADER_FRAGMENT
])
1308 printf(" frag prog %u\n",
1309 shProg
->_LinkedShaders
[MESA_SHADER_FRAGMENT
]->Program
->Id
);
1310 if (shProg
->_LinkedShaders
[MESA_SHADER_GEOMETRY
])
1311 printf(" geom prog %u\n",
1312 shProg
->_LinkedShaders
[MESA_SHADER_GEOMETRY
]->Program
->Id
);
1313 if (shProg
->_LinkedShaders
[MESA_SHADER_TESS_CTRL
])
1314 printf(" tesc prog %u\n",
1315 shProg
->_LinkedShaders
[MESA_SHADER_TESS_CTRL
]->Program
->Id
);
1316 if (shProg
->_LinkedShaders
[MESA_SHADER_TESS_EVAL
])
1317 printf(" tese prog %u\n",
1318 shProg
->_LinkedShaders
[MESA_SHADER_TESS_EVAL
]->Program
->Id
);
1323 * Use the named shader program for subsequent glUniform calls
1326 _mesa_active_program(struct gl_context
*ctx
, struct gl_shader_program
*shProg
,
1329 if ((shProg
!= NULL
) && !shProg
->data
->LinkStatus
) {
1330 _mesa_error(ctx
, GL_INVALID_OPERATION
,
1331 "%s(program %u not linked)", caller
, shProg
->Name
);
1335 if (ctx
->Shader
.ActiveProgram
!= shProg
) {
1336 _mesa_reference_shader_program(ctx
, &ctx
->Shader
.ActiveProgram
, shProg
);
1342 * Use the named shader program for subsequent rendering.
1345 _mesa_use_shader_program(struct gl_context
*ctx
,
1346 struct gl_shader_program
*shProg
)
1348 for (int i
= 0; i
< MESA_SHADER_STAGES
; i
++) {
1349 struct gl_program
*new_prog
= NULL
;
1350 if (shProg
&& shProg
->_LinkedShaders
[i
])
1351 new_prog
= shProg
->_LinkedShaders
[i
]->Program
;
1352 _mesa_use_program(ctx
, i
, shProg
, new_prog
, &ctx
->Shader
);
1354 _mesa_active_program(ctx
, shProg
, "glUseProgram");
1359 * Do validation of the given shader program.
1360 * \param errMsg returns error message if validation fails.
1361 * \return GL_TRUE if valid, GL_FALSE if invalid (and set errMsg)
1364 validate_shader_program(const struct gl_shader_program
*shProg
,
1367 if (!shProg
->data
->LinkStatus
) {
1371 /* From the GL spec, a program is invalid if any of these are true:
1373 any two active samplers in the current program object are of
1374 different types, but refer to the same texture image unit,
1376 any active sampler in the current program object refers to a texture
1377 image unit where fixed-function fragment processing accesses a
1378 texture target that does not match the sampler type, or
1380 the sum of the number of active samplers in the program and the
1381 number of texture image units enabled for fixed-function fragment
1382 processing exceeds the combined limit on the total number of texture
1383 image units allowed.
1387 * Check: any two active samplers in the current program object are of
1388 * different types, but refer to the same texture image unit,
1390 if (!_mesa_sampler_uniforms_are_valid(shProg
, errMsg
, 100))
1398 * Called via glValidateProgram()
1401 validate_program(struct gl_context
*ctx
, GLuint program
)
1403 struct gl_shader_program
*shProg
;
1404 char errMsg
[100] = "";
1406 shProg
= _mesa_lookup_shader_program_err(ctx
, program
, "glValidateProgram");
1411 shProg
->data
->Validated
= validate_shader_program(shProg
, errMsg
);
1412 if (!shProg
->data
->Validated
) {
1413 /* update info log */
1414 if (shProg
->data
->InfoLog
) {
1415 ralloc_free(shProg
->data
->InfoLog
);
1417 shProg
->data
->InfoLog
= ralloc_strdup(shProg
->data
, errMsg
);
1423 _mesa_AttachObjectARB_no_error(GLhandleARB program
, GLhandleARB shader
)
1425 GET_CURRENT_CONTEXT(ctx
);
1426 attach_shader_no_error(ctx
, program
, shader
);
1431 _mesa_AttachObjectARB(GLhandleARB program
, GLhandleARB shader
)
1433 GET_CURRENT_CONTEXT(ctx
);
1434 attach_shader_err(ctx
, program
, shader
, "glAttachObjectARB");
1439 _mesa_AttachShader_no_error(GLuint program
, GLuint shader
)
1441 GET_CURRENT_CONTEXT(ctx
);
1442 attach_shader_no_error(ctx
, program
, shader
);
1447 _mesa_AttachShader(GLuint program
, GLuint shader
)
1449 GET_CURRENT_CONTEXT(ctx
);
1450 attach_shader_err(ctx
, program
, shader
, "glAttachShader");
1455 _mesa_CompileShader(GLuint shaderObj
)
1457 GET_CURRENT_CONTEXT(ctx
);
1458 if (MESA_VERBOSE
& VERBOSE_API
)
1459 _mesa_debug(ctx
, "glCompileShader %u\n", shaderObj
);
1460 _mesa_compile_shader(ctx
, _mesa_lookup_shader_err(ctx
, shaderObj
,
1461 "glCompileShader"));
1466 _mesa_CreateShader_no_error(GLenum type
)
1468 GET_CURRENT_CONTEXT(ctx
);
1469 return create_shader(ctx
, type
);
1474 _mesa_CreateShader(GLenum type
)
1476 GET_CURRENT_CONTEXT(ctx
);
1478 if (MESA_VERBOSE
& VERBOSE_API
)
1479 _mesa_debug(ctx
, "glCreateShader %s\n", _mesa_enum_to_string(type
));
1481 return create_shader_err(ctx
, type
, "glCreateShader");
1485 GLhandleARB GLAPIENTRY
1486 _mesa_CreateShaderObjectARB_no_error(GLenum type
)
1488 GET_CURRENT_CONTEXT(ctx
);
1489 return create_shader(ctx
, type
);
1493 GLhandleARB GLAPIENTRY
1494 _mesa_CreateShaderObjectARB(GLenum type
)
1496 GET_CURRENT_CONTEXT(ctx
);
1497 return create_shader_err(ctx
, type
, "glCreateShaderObjectARB");
1502 _mesa_CreateProgram(void)
1504 GET_CURRENT_CONTEXT(ctx
);
1505 if (MESA_VERBOSE
& VERBOSE_API
)
1506 _mesa_debug(ctx
, "glCreateProgram\n");
1507 return create_shader_program(ctx
);
1511 GLhandleARB GLAPIENTRY
1512 _mesa_CreateProgramObjectARB(void)
1514 GET_CURRENT_CONTEXT(ctx
);
1515 return create_shader_program(ctx
);
1520 _mesa_DeleteObjectARB(GLhandleARB obj
)
1522 if (MESA_VERBOSE
& VERBOSE_API
) {
1523 GET_CURRENT_CONTEXT(ctx
);
1524 _mesa_debug(ctx
, "glDeleteObjectARB(%lu)\n", (unsigned long)obj
);
1528 GET_CURRENT_CONTEXT(ctx
);
1529 FLUSH_VERTICES(ctx
, 0);
1530 if (is_program(ctx
, obj
)) {
1531 delete_shader_program(ctx
, obj
);
1533 else if (is_shader(ctx
, obj
)) {
1534 delete_shader(ctx
, obj
);
1544 _mesa_DeleteProgram(GLuint name
)
1547 GET_CURRENT_CONTEXT(ctx
);
1548 FLUSH_VERTICES(ctx
, 0);
1549 delete_shader_program(ctx
, name
);
1555 _mesa_DeleteShader(GLuint name
)
1558 GET_CURRENT_CONTEXT(ctx
);
1559 FLUSH_VERTICES(ctx
, 0);
1560 delete_shader(ctx
, name
);
1566 _mesa_DetachObjectARB_no_error(GLhandleARB program
, GLhandleARB shader
)
1568 GET_CURRENT_CONTEXT(ctx
);
1569 detach_shader_no_error(ctx
, program
, shader
);
1574 _mesa_DetachObjectARB(GLhandleARB program
, GLhandleARB shader
)
1576 GET_CURRENT_CONTEXT(ctx
);
1577 detach_shader_error(ctx
, program
, shader
);
1582 _mesa_DetachShader_no_error(GLuint program
, GLuint shader
)
1584 GET_CURRENT_CONTEXT(ctx
);
1585 detach_shader_no_error(ctx
, program
, shader
);
1590 _mesa_DetachShader(GLuint program
, GLuint shader
)
1592 GET_CURRENT_CONTEXT(ctx
);
1593 detach_shader_error(ctx
, program
, shader
);
1598 _mesa_GetAttachedObjectsARB(GLhandleARB container
, GLsizei maxCount
,
1599 GLsizei
* count
, GLhandleARB
* obj
)
1601 GET_CURRENT_CONTEXT(ctx
);
1602 get_attached_shaders(ctx
, (GLuint
)container
, maxCount
, count
, NULL
, obj
);
1607 _mesa_GetAttachedShaders(GLuint program
, GLsizei maxCount
,
1608 GLsizei
*count
, GLuint
*obj
)
1610 GET_CURRENT_CONTEXT(ctx
);
1611 get_attached_shaders(ctx
, program
, maxCount
, count
, obj
, NULL
);
1616 _mesa_GetInfoLogARB(GLhandleARB object
, GLsizei maxLength
, GLsizei
* length
,
1617 GLcharARB
* infoLog
)
1619 GET_CURRENT_CONTEXT(ctx
);
1620 if (is_program(ctx
, object
)) {
1621 get_program_info_log(ctx
, object
, maxLength
, length
, infoLog
);
1623 else if (is_shader(ctx
, object
)) {
1624 get_shader_info_log(ctx
, object
, maxLength
, length
, infoLog
);
1627 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glGetInfoLogARB");
1633 _mesa_GetObjectParameterivARB(GLhandleARB object
, GLenum pname
, GLint
*params
)
1635 GET_CURRENT_CONTEXT(ctx
);
1636 /* Implement in terms of GetProgramiv, GetShaderiv */
1637 if (is_program(ctx
, object
)) {
1638 if (pname
== GL_OBJECT_TYPE_ARB
) {
1639 *params
= GL_PROGRAM_OBJECT_ARB
;
1642 get_programiv(ctx
, object
, pname
, params
);
1645 else if (is_shader(ctx
, object
)) {
1646 if (pname
== GL_OBJECT_TYPE_ARB
) {
1647 *params
= GL_SHADER_OBJECT_ARB
;
1650 get_shaderiv(ctx
, object
, pname
, params
);
1654 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetObjectParameterivARB");
1660 _mesa_GetObjectParameterfvARB(GLhandleARB object
, GLenum pname
,
1663 GLint iparams
[1] = {0}; /* XXX is one element enough? */
1664 _mesa_GetObjectParameterivARB(object
, pname
, iparams
);
1665 params
[0] = (GLfloat
) iparams
[0];
1670 _mesa_GetProgramiv(GLuint program
, GLenum pname
, GLint
*params
)
1672 GET_CURRENT_CONTEXT(ctx
);
1673 get_programiv(ctx
, program
, pname
, params
);
1678 _mesa_GetShaderiv(GLuint shader
, GLenum pname
, GLint
*params
)
1680 GET_CURRENT_CONTEXT(ctx
);
1681 get_shaderiv(ctx
, shader
, pname
, params
);
1686 _mesa_GetProgramInfoLog(GLuint program
, GLsizei bufSize
,
1687 GLsizei
*length
, GLchar
*infoLog
)
1689 GET_CURRENT_CONTEXT(ctx
);
1690 get_program_info_log(ctx
, program
, bufSize
, length
, infoLog
);
1695 _mesa_GetShaderInfoLog(GLuint shader
, GLsizei bufSize
,
1696 GLsizei
*length
, GLchar
*infoLog
)
1698 GET_CURRENT_CONTEXT(ctx
);
1699 get_shader_info_log(ctx
, shader
, bufSize
, length
, infoLog
);
1704 _mesa_GetShaderSource(GLuint shader
, GLsizei maxLength
,
1705 GLsizei
*length
, GLchar
*sourceOut
)
1707 GET_CURRENT_CONTEXT(ctx
);
1708 get_shader_source(ctx
, shader
, maxLength
, length
, sourceOut
);
1712 GLhandleARB GLAPIENTRY
1713 _mesa_GetHandleARB(GLenum pname
)
1715 GET_CURRENT_CONTEXT(ctx
);
1716 return get_handle(ctx
, pname
);
1720 GLboolean GLAPIENTRY
1721 _mesa_IsProgram(GLuint name
)
1723 GET_CURRENT_CONTEXT(ctx
);
1724 return is_program(ctx
, name
);
1728 GLboolean GLAPIENTRY
1729 _mesa_IsShader(GLuint name
)
1731 GET_CURRENT_CONTEXT(ctx
);
1732 return is_shader(ctx
, name
);
1737 _mesa_LinkProgram_no_error(GLuint programObj
)
1739 GET_CURRENT_CONTEXT(ctx
);
1741 struct gl_shader_program
*shProg
=
1742 _mesa_lookup_shader_program(ctx
, programObj
);
1743 link_program_no_error(ctx
, shProg
);
1748 _mesa_LinkProgram(GLuint programObj
)
1750 GET_CURRENT_CONTEXT(ctx
);
1752 if (MESA_VERBOSE
& VERBOSE_API
)
1753 _mesa_debug(ctx
, "glLinkProgram %u\n", programObj
);
1755 struct gl_shader_program
*shProg
=
1756 _mesa_lookup_shader_program_err(ctx
, programObj
, "glLinkProgram");
1757 link_program_error(ctx
, shProg
);
1760 #ifdef ENABLE_SHADER_CACHE
1762 * Generate a SHA-1 hash value string for given source string.
1765 generate_sha1(const char *source
, char sha_str
[64])
1767 unsigned char sha
[20];
1768 _mesa_sha1_compute(source
, strlen(source
), sha
);
1769 _mesa_sha1_format(sha_str
, sha
);
1773 * Construct a full path for shader replacement functionality using
1776 * <path>/<stage prefix>_<CHECKSUM>.glsl
1779 construct_name(const gl_shader_stage stage
, const char *source
,
1783 static const char *types
[] = {
1784 "VS", "TC", "TE", "GS", "FS", "CS",
1787 generate_sha1(source
, sha
);
1788 return ralloc_asprintf(NULL
, "%s/%s_%s.glsl", path
, types
[stage
], sha
);
1792 * Write given shader source to a file in MESA_SHADER_DUMP_PATH.
1795 dump_shader(const gl_shader_stage stage
, const char *source
)
1797 static bool path_exists
= true;
1804 dump_path
= getenv("MESA_SHADER_DUMP_PATH");
1806 path_exists
= false;
1810 char *name
= construct_name(stage
, source
, dump_path
);
1812 f
= fopen(name
, "w");
1817 GET_CURRENT_CONTEXT(ctx
);
1818 _mesa_warning(ctx
, "could not open %s for dumping shader (%s)", name
,
1825 * Read shader source code from a file.
1826 * Useful for debugging to override an app's shader.
1829 read_shader(const gl_shader_stage stage
, const char *source
)
1832 static bool path_exists
= true;
1833 int len
, shader_size
= 0;
1840 read_path
= getenv("MESA_SHADER_READ_PATH");
1842 path_exists
= false;
1846 char *name
= construct_name(stage
, source
, read_path
);
1847 f
= fopen(name
, "r");
1852 /* allocate enough room for the entire shader */
1853 fseek(f
, 0, SEEK_END
);
1854 shader_size
= ftell(f
);
1856 assert(shader_size
);
1858 /* add one for terminating zero */
1861 buffer
= malloc(shader_size
);
1864 len
= fread(buffer
, 1, shader_size
, f
);
1872 #endif /* ENABLE_SHADER_CACHE */
1875 * Called via glShaderSource() and glShaderSourceARB() API functions.
1876 * Basically, concatenate the source code strings into one long string
1877 * and pass it to _mesa_shader_source().
1879 static ALWAYS_INLINE
void
1880 shader_source(struct gl_context
*ctx
, GLuint shaderObj
, GLsizei count
,
1881 const GLchar
*const *string
, const GLint
*length
, bool no_error
)
1884 GLsizei i
, totalLength
;
1886 struct gl_shader
*sh
;
1889 sh
= _mesa_lookup_shader_err(ctx
, shaderObj
, "glShaderSourceARB");
1893 if (string
== NULL
) {
1894 _mesa_error(ctx
, GL_INVALID_VALUE
, "glShaderSourceARB");
1898 sh
= _mesa_lookup_shader(ctx
, shaderObj
);
1902 * This array holds offsets of where the appropriate string ends, thus the
1903 * last element will be set to the total length of the source code.
1905 offsets
= malloc(count
* sizeof(GLint
));
1906 if (offsets
== NULL
) {
1907 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "glShaderSourceARB");
1911 for (i
= 0; i
< count
; i
++) {
1912 if (!no_error
&& string
[i
] == NULL
) {
1913 free((GLvoid
*) offsets
);
1914 _mesa_error(ctx
, GL_INVALID_OPERATION
,
1915 "glShaderSourceARB(null string)");
1918 if (length
== NULL
|| length
[i
] < 0)
1919 offsets
[i
] = strlen(string
[i
]);
1921 offsets
[i
] = length
[i
];
1922 /* accumulate string lengths */
1924 offsets
[i
] += offsets
[i
- 1];
1927 /* Total length of source string is sum off all strings plus two.
1928 * One extra byte for terminating zero, another extra byte to silence
1929 * valgrind warnings in the parser/grammer code.
1931 totalLength
= offsets
[count
- 1] + 2;
1932 source
= malloc(totalLength
* sizeof(GLcharARB
));
1933 if (source
== NULL
) {
1934 free((GLvoid
*) offsets
);
1935 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "glShaderSourceARB");
1939 for (i
= 0; i
< count
; i
++) {
1940 GLint start
= (i
> 0) ? offsets
[i
- 1] : 0;
1941 memcpy(source
+ start
, string
[i
],
1942 (offsets
[i
] - start
) * sizeof(GLcharARB
));
1944 source
[totalLength
- 1] = '\0';
1945 source
[totalLength
- 2] = '\0';
1947 #ifdef ENABLE_SHADER_CACHE
1948 GLcharARB
*replacement
;
1950 /* Dump original shader source to MESA_SHADER_DUMP_PATH and replace
1951 * if corresponding entry found from MESA_SHADER_READ_PATH.
1953 dump_shader(sh
->Stage
, source
);
1955 replacement
= read_shader(sh
->Stage
, source
);
1958 source
= replacement
;
1960 #endif /* ENABLE_SHADER_CACHE */
1962 set_shader_source(sh
, source
);
1969 _mesa_ShaderSource_no_error(GLuint shaderObj
, GLsizei count
,
1970 const GLchar
*const *string
, const GLint
*length
)
1972 GET_CURRENT_CONTEXT(ctx
);
1973 shader_source(ctx
, shaderObj
, count
, string
, length
, true);
1978 _mesa_ShaderSource(GLuint shaderObj
, GLsizei count
,
1979 const GLchar
*const *string
, const GLint
*length
)
1981 GET_CURRENT_CONTEXT(ctx
);
1982 shader_source(ctx
, shaderObj
, count
, string
, length
, false);
1986 static ALWAYS_INLINE
void
1987 use_program(GLuint program
, bool no_error
)
1989 GET_CURRENT_CONTEXT(ctx
);
1990 struct gl_shader_program
*shProg
= NULL
;
1992 if (MESA_VERBOSE
& VERBOSE_API
)
1993 _mesa_debug(ctx
, "glUseProgram %u\n", program
);
1997 shProg
= _mesa_lookup_shader_program(ctx
, program
);
2000 if (_mesa_is_xfb_active_and_unpaused(ctx
)) {
2001 _mesa_error(ctx
, GL_INVALID_OPERATION
,
2002 "glUseProgram(transform feedback active)");
2008 _mesa_lookup_shader_program_err(ctx
, program
, "glUseProgram");
2012 if (!shProg
->data
->LinkStatus
) {
2013 _mesa_error(ctx
, GL_INVALID_OPERATION
,
2014 "glUseProgram(program %u not linked)", program
);
2019 if (ctx
->_Shader
->Flags
& GLSL_USE_PROG
) {
2020 print_shader_info(shProg
);
2025 /* The ARB_separate_shader_object spec says:
2027 * "The executable code for an individual shader stage is taken from
2028 * the current program for that stage. If there is a current program
2029 * object established by UseProgram, that program is considered current
2030 * for all stages. Otherwise, if there is a bound program pipeline
2031 * object (section 2.14.PPO), the program bound to the appropriate
2032 * stage of the pipeline object is considered current."
2035 /* Attach shader state to the binding point */
2036 _mesa_reference_pipeline_object(ctx
, &ctx
->_Shader
, &ctx
->Shader
);
2037 /* Update the program */
2038 _mesa_use_shader_program(ctx
, shProg
);
2040 /* Must be done first: detach the progam */
2041 _mesa_use_shader_program(ctx
, shProg
);
2042 /* Unattach shader_state binding point */
2043 _mesa_reference_pipeline_object(ctx
, &ctx
->_Shader
,
2044 ctx
->Pipeline
.Default
);
2045 /* If a pipeline was bound, rebind it */
2046 if (ctx
->Pipeline
.Current
) {
2048 _mesa_BindProgramPipeline_no_error(ctx
->Pipeline
.Current
->Name
);
2050 _mesa_BindProgramPipeline(ctx
->Pipeline
.Current
->Name
);
2057 _mesa_UseProgram_no_error(GLuint program
)
2059 use_program(program
, true);
2064 _mesa_UseProgram(GLuint program
)
2066 use_program(program
, false);
2071 _mesa_ValidateProgram(GLuint program
)
2073 GET_CURRENT_CONTEXT(ctx
);
2074 validate_program(ctx
, program
);
2079 * For OpenGL ES 2.0, GL_ARB_ES2_compatibility
2082 _mesa_GetShaderPrecisionFormat(GLenum shadertype
, GLenum precisiontype
,
2083 GLint
* range
, GLint
* precision
)
2085 const struct gl_program_constants
*limits
;
2086 const struct gl_precision
*p
;
2087 GET_CURRENT_CONTEXT(ctx
);
2089 switch (shadertype
) {
2090 case GL_VERTEX_SHADER
:
2091 limits
= &ctx
->Const
.Program
[MESA_SHADER_VERTEX
];
2093 case GL_FRAGMENT_SHADER
:
2094 limits
= &ctx
->Const
.Program
[MESA_SHADER_FRAGMENT
];
2097 _mesa_error(ctx
, GL_INVALID_ENUM
,
2098 "glGetShaderPrecisionFormat(shadertype)");
2102 switch (precisiontype
) {
2104 p
= &limits
->LowFloat
;
2106 case GL_MEDIUM_FLOAT
:
2107 p
= &limits
->MediumFloat
;
2110 p
= &limits
->HighFloat
;
2113 p
= &limits
->LowInt
;
2116 p
= &limits
->MediumInt
;
2119 p
= &limits
->HighInt
;
2122 _mesa_error(ctx
, GL_INVALID_ENUM
,
2123 "glGetShaderPrecisionFormat(precisiontype)");
2127 range
[0] = p
->RangeMin
;
2128 range
[1] = p
->RangeMax
;
2129 precision
[0] = p
->Precision
;
2134 * For OpenGL ES 2.0, GL_ARB_ES2_compatibility
2137 _mesa_ReleaseShaderCompiler(void)
2139 _mesa_destroy_shader_compiler_caches();
2144 * For OpenGL ES 2.0, GL_ARB_ES2_compatibility
2147 _mesa_ShaderBinary(GLint n
, const GLuint
* shaders
, GLenum binaryformat
,
2148 const void* binary
, GLint length
)
2150 GET_CURRENT_CONTEXT(ctx
);
2151 struct gl_shader
**sh
;
2153 /* Page 68, section 7.2 'Shader Binaries" of the of the OpenGL ES 3.1, and
2154 * page 88 of the OpenGL 4.5 specs state:
2156 * "An INVALID_VALUE error is generated if count or length is negative.
2157 * An INVALID_ENUM error is generated if binaryformat is not a supported
2158 * format returned in SHADER_BINARY_FORMATS."
2160 if (n
< 0 || length
< 0) {
2161 _mesa_error(ctx
, GL_INVALID_VALUE
, "glShaderBinary(count or length < 0)");
2165 /* Get all shader objects at once so we can make the operation
2168 if (n
> SIZE_MAX
/ sizeof(*sh
)) {
2169 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "glShaderBinary(count)");
2173 sh
= alloca(sizeof(*sh
) * (size_t)n
);
2175 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "glShaderBinary");
2179 for (int i
= 0; i
< n
; ++i
) {
2180 sh
[i
] = _mesa_lookup_shader_err(ctx
, shaders
[i
], "glShaderBinary");
2185 if (binaryformat
== GL_SHADER_BINARY_FORMAT_SPIR_V_ARB
) {
2186 if (!ctx
->Extensions
.ARB_gl_spirv
) {
2187 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glShaderBinary(SPIR-V)");
2189 _mesa_spirv_shader_binary(ctx
, (unsigned) n
, sh
, binary
,
2196 _mesa_error(ctx
, GL_INVALID_ENUM
, "glShaderBinary(format)");
2201 _mesa_GetProgramBinary(GLuint program
, GLsizei bufSize
, GLsizei
*length
,
2202 GLenum
*binaryFormat
, GLvoid
*binary
)
2204 struct gl_shader_program
*shProg
;
2205 GLsizei length_dummy
;
2206 GET_CURRENT_CONTEXT(ctx
);
2209 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetProgramBinary(bufSize < 0)");
2213 shProg
= _mesa_lookup_shader_program_err(ctx
, program
, "glGetProgramBinary");
2217 /* The ARB_get_program_binary spec says:
2219 * "If <length> is NULL, then no length is returned."
2221 * Ensure that length always points to valid storage to avoid multiple NULL
2222 * pointer checks below.
2225 length
= &length_dummy
;
2228 /* The ARB_get_program_binary spec says:
2230 * "When a program object's LINK_STATUS is FALSE, its program binary
2231 * length is zero, and a call to GetProgramBinary will generate an
2232 * INVALID_OPERATION error.
2234 if (!shProg
->data
->LinkStatus
) {
2235 _mesa_error(ctx
, GL_INVALID_OPERATION
,
2236 "glGetProgramBinary(program %u not linked)",
2242 if (ctx
->Const
.NumProgramBinaryFormats
== 0) {
2244 _mesa_error(ctx
, GL_INVALID_OPERATION
,
2245 "glGetProgramBinary(driver supports zero binary formats)");
2247 _mesa_get_program_binary(ctx
, shProg
, bufSize
, length
, binaryFormat
,
2249 assert(*length
== 0 || *binaryFormat
== GL_PROGRAM_BINARY_FORMAT_MESA
);
2254 _mesa_ProgramBinary(GLuint program
, GLenum binaryFormat
,
2255 const GLvoid
*binary
, GLsizei length
)
2257 struct gl_shader_program
*shProg
;
2258 GET_CURRENT_CONTEXT(ctx
);
2260 shProg
= _mesa_lookup_shader_program_err(ctx
, program
, "glProgramBinary");
2264 _mesa_clear_shader_program_data(ctx
, shProg
);
2265 shProg
->data
= _mesa_create_shader_program_data();
2267 /* Section 2.3.1 (Errors) of the OpenGL 4.5 spec says:
2269 * "If a negative number is provided where an argument of type sizei or
2270 * sizeiptr is specified, an INVALID_VALUE error is generated."
2273 _mesa_error(ctx
, GL_INVALID_VALUE
, "glProgramBinary(length < 0)");
2277 if (ctx
->Const
.NumProgramBinaryFormats
== 0 ||
2278 binaryFormat
!= GL_PROGRAM_BINARY_FORMAT_MESA
) {
2279 /* The ARB_get_program_binary spec says:
2281 * "<binaryFormat> and <binary> must be those returned by a previous
2282 * call to GetProgramBinary, and <length> must be the length of the
2283 * program binary as returned by GetProgramBinary or GetProgramiv with
2284 * <pname> PROGRAM_BINARY_LENGTH. Loading the program binary will fail,
2285 * setting the LINK_STATUS of <program> to FALSE, if these conditions
2288 * Since any value of binaryFormat passed "is not one of those specified as
2289 * allowable for [this] command, an INVALID_ENUM error is generated."
2291 shProg
->data
->LinkStatus
= linking_failure
;
2292 _mesa_error(ctx
, GL_INVALID_ENUM
, "glProgramBinary");
2294 _mesa_program_binary(ctx
, shProg
, binaryFormat
, binary
, length
);
2299 static ALWAYS_INLINE
void
2300 program_parameteri(struct gl_context
*ctx
, struct gl_shader_program
*shProg
,
2301 GLuint pname
, GLint value
, bool no_error
)
2304 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT
:
2305 /* This enum isn't part of the OES extension for OpenGL ES 2.0, but it
2306 * is part of OpenGL ES 3.0. For the ES2 case, this function shouldn't
2307 * even be in the dispatch table, so we shouldn't need to expclicitly
2310 * On desktop, we ignore the 3.0+ requirement because it is silly.
2313 /* The ARB_get_program_binary extension spec says:
2315 * "An INVALID_VALUE error is generated if the <value> argument to
2316 * ProgramParameteri is not TRUE or FALSE."
2318 if (!no_error
&& value
!= GL_TRUE
&& value
!= GL_FALSE
) {
2322 /* No need to notify the driver. Any changes will actually take effect
2323 * the next time the shader is linked.
2325 * The ARB_get_program_binary extension spec says:
2327 * "To indicate that a program binary is likely to be retrieved,
2328 * ProgramParameteri should be called with <pname>
2329 * PROGRAM_BINARY_RETRIEVABLE_HINT and <value> TRUE. This setting
2330 * will not be in effect until the next time LinkProgram or
2331 * ProgramBinary has been called successfully."
2333 * The resloution of issue 9 in the extension spec also says:
2335 * "The application may use the PROGRAM_BINARY_RETRIEVABLE_HINT hint
2336 * to indicate to the GL implementation that this program will
2337 * likely be saved with GetProgramBinary at some point. This will
2338 * give the GL implementation the opportunity to track any state
2339 * changes made to the program before being saved such that when it
2340 * is loaded again a recompile can be avoided."
2342 shProg
->BinaryRetreivableHint
= value
;
2345 case GL_PROGRAM_SEPARABLE
:
2346 /* Spec imply that the behavior is the same as ARB_get_program_binary
2347 * Chapter 7.3 Program Objects
2349 if (!no_error
&& value
!= GL_TRUE
&& value
!= GL_FALSE
) {
2352 shProg
->SeparateShader
= value
;
2357 _mesa_error(ctx
, GL_INVALID_ENUM
, "glProgramParameteri(pname=%s)",
2358 _mesa_enum_to_string(pname
));
2364 _mesa_error(ctx
, GL_INVALID_VALUE
,
2365 "glProgramParameteri(pname=%s, value=%d): "
2366 "value must be 0 or 1.",
2367 _mesa_enum_to_string(pname
),
2373 _mesa_ProgramParameteri_no_error(GLuint program
, GLenum pname
, GLint value
)
2375 GET_CURRENT_CONTEXT(ctx
);
2377 struct gl_shader_program
*shProg
= _mesa_lookup_shader_program(ctx
, program
);
2378 program_parameteri(ctx
, shProg
, pname
, value
, true);
2383 _mesa_ProgramParameteri(GLuint program
, GLenum pname
, GLint value
)
2385 struct gl_shader_program
*shProg
;
2386 GET_CURRENT_CONTEXT(ctx
);
2388 shProg
= _mesa_lookup_shader_program_err(ctx
, program
,
2389 "glProgramParameteri");
2393 program_parameteri(ctx
, shProg
, pname
, value
, false);
2398 _mesa_use_program(struct gl_context
*ctx
, gl_shader_stage stage
,
2399 struct gl_shader_program
*shProg
, struct gl_program
*prog
,
2400 struct gl_pipeline_object
*shTarget
)
2402 struct gl_program
**target
;
2404 target
= &shTarget
->CurrentProgram
[stage
];
2406 _mesa_program_init_subroutine_defaults(ctx
, prog
);
2409 if (*target
!= prog
) {
2410 /* Program is current, flush it */
2411 if (shTarget
== ctx
->_Shader
) {
2412 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
| _NEW_PROGRAM_CONSTANTS
);
2415 _mesa_reference_shader_program(ctx
,
2416 &shTarget
->ReferencedPrograms
[stage
],
2418 _mesa_reference_program(ctx
, target
, prog
);
2426 * Copy program-specific data generated by linking from the gl_shader_program
2427 * object to the gl_program object referred to by the gl_linked_shader.
2429 * This function expects _mesa_reference_program() to have been previously
2430 * called setting the gl_linked_shaders program reference.
2433 _mesa_copy_linked_program_data(const struct gl_shader_program
*src
,
2434 struct gl_linked_shader
*dst_sh
)
2436 assert(dst_sh
->Program
);
2438 struct gl_program
*dst
= dst_sh
->Program
;
2440 dst
->info
.separate_shader
= src
->SeparateShader
;
2442 switch (dst_sh
->Stage
) {
2443 case MESA_SHADER_GEOMETRY
: {
2444 dst
->info
.gs
.vertices_in
= src
->Geom
.VerticesIn
;
2445 dst
->info
.gs
.uses_end_primitive
= src
->Geom
.UsesEndPrimitive
;
2446 dst
->info
.gs
.uses_streams
= src
->Geom
.UsesStreams
;
2449 case MESA_SHADER_FRAGMENT
: {
2450 dst
->info
.fs
.depth_layout
= src
->FragDepthLayout
;
2453 case MESA_SHADER_COMPUTE
: {
2454 dst
->info
.cs
.shared_size
= src
->Comp
.SharedSize
;
2463 * ARB_separate_shader_objects: Compile & Link Program
2466 _mesa_CreateShaderProgramv(GLenum type
, GLsizei count
,
2467 const GLchar
* const *strings
)
2469 GET_CURRENT_CONTEXT(ctx
);
2471 const GLuint shader
= create_shader_err(ctx
, type
, "glCreateShaderProgramv");
2475 * According to OpenGL 4.5 and OpenGL ES 3.1 standards, section 7.3:
2476 * GL_INVALID_VALUE should be generated if count < 0
2479 _mesa_error(ctx
, GL_INVALID_VALUE
, "glCreateShaderProgram (count < 0)");
2484 struct gl_shader
*sh
= _mesa_lookup_shader(ctx
, shader
);
2486 _mesa_ShaderSource(shader
, count
, strings
, NULL
);
2487 _mesa_compile_shader(ctx
, sh
);
2489 program
= create_shader_program(ctx
);
2491 struct gl_shader_program
*shProg
;
2492 GLint compiled
= GL_FALSE
;
2494 shProg
= _mesa_lookup_shader_program(ctx
, program
);
2496 shProg
->SeparateShader
= GL_TRUE
;
2498 get_shaderiv(ctx
, shader
, GL_COMPILE_STATUS
, &compiled
);
2500 attach_shader_err(ctx
, program
, shader
, "glCreateShaderProgramv");
2501 _mesa_link_program(ctx
, shProg
);
2502 detach_shader_error(ctx
, program
, shader
);
2506 if (active
-user
-defined
-varyings
-in
-linked
-program
) {
2507 append
-error
-to
-info
-log
;
2508 shProg
->data
->LinkStatus
= linking_failure
;
2513 ralloc_strcat(&shProg
->data
->InfoLog
, sh
->InfoLog
);
2516 delete_shader(ctx
, shader
);
2524 * For GL_ARB_tessellation_shader
2527 _mesa_PatchParameteri_no_error(GLenum pname
, GLint value
)
2529 GET_CURRENT_CONTEXT(ctx
);
2530 ctx
->TessCtrlProgram
.patch_vertices
= value
;
2534 extern void GLAPIENTRY
2535 _mesa_PatchParameteri(GLenum pname
, GLint value
)
2537 GET_CURRENT_CONTEXT(ctx
);
2539 if (!_mesa_has_tessellation(ctx
)) {
2540 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glPatchParameteri");
2544 if (pname
!= GL_PATCH_VERTICES
) {
2545 _mesa_error(ctx
, GL_INVALID_ENUM
, "glPatchParameteri");
2549 if (value
<= 0 || value
> ctx
->Const
.MaxPatchVertices
) {
2550 _mesa_error(ctx
, GL_INVALID_VALUE
, "glPatchParameteri");
2554 ctx
->TessCtrlProgram
.patch_vertices
= value
;
2558 extern void GLAPIENTRY
2559 _mesa_PatchParameterfv(GLenum pname
, const GLfloat
*values
)
2561 GET_CURRENT_CONTEXT(ctx
);
2563 if (!_mesa_has_tessellation(ctx
)) {
2564 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glPatchParameterfv");
2569 case GL_PATCH_DEFAULT_OUTER_LEVEL
:
2570 FLUSH_VERTICES(ctx
, 0);
2571 memcpy(ctx
->TessCtrlProgram
.patch_default_outer_level
, values
,
2572 4 * sizeof(GLfloat
));
2573 ctx
->NewDriverState
|= ctx
->DriverFlags
.NewDefaultTessLevels
;
2575 case GL_PATCH_DEFAULT_INNER_LEVEL
:
2576 FLUSH_VERTICES(ctx
, 0);
2577 memcpy(ctx
->TessCtrlProgram
.patch_default_inner_level
, values
,
2578 2 * sizeof(GLfloat
));
2579 ctx
->NewDriverState
|= ctx
->DriverFlags
.NewDefaultTessLevels
;
2582 _mesa_error(ctx
, GL_INVALID_ENUM
, "glPatchParameterfv");
2588 * ARB_shader_subroutine
2591 _mesa_GetSubroutineUniformLocation(GLuint program
, GLenum shadertype
,
2594 GET_CURRENT_CONTEXT(ctx
);
2595 const char *api_name
= "glGetSubroutineUniformLocation";
2596 struct gl_shader_program
*shProg
;
2597 GLenum resource_type
;
2598 gl_shader_stage stage
;
2600 if (!_mesa_validate_shader_target(ctx
, shadertype
)) {
2601 _mesa_error(ctx
, GL_INVALID_OPERATION
, "%s", api_name
);
2605 shProg
= _mesa_lookup_shader_program_err(ctx
, program
, api_name
);
2609 stage
= _mesa_shader_enum_to_shader_stage(shadertype
);
2610 if (!shProg
->_LinkedShaders
[stage
]) {
2611 _mesa_error(ctx
, GL_INVALID_OPERATION
, "%s", api_name
);
2615 resource_type
= _mesa_shader_stage_to_subroutine_uniform(stage
);
2616 return _mesa_program_resource_location(shProg
, resource_type
, name
);
2620 _mesa_GetSubroutineIndex(GLuint program
, GLenum shadertype
,
2623 GET_CURRENT_CONTEXT(ctx
);
2624 const char *api_name
= "glGetSubroutineIndex";
2625 struct gl_shader_program
*shProg
;
2626 struct gl_program_resource
*res
;
2627 GLenum resource_type
;
2628 gl_shader_stage stage
;
2630 if (!_mesa_validate_shader_target(ctx
, shadertype
)) {
2631 _mesa_error(ctx
, GL_INVALID_OPERATION
, "%s", api_name
);
2635 shProg
= _mesa_lookup_shader_program_err(ctx
, program
, api_name
);
2639 stage
= _mesa_shader_enum_to_shader_stage(shadertype
);
2640 if (!shProg
->_LinkedShaders
[stage
]) {
2641 _mesa_error(ctx
, GL_INVALID_OPERATION
, "%s", api_name
);
2645 resource_type
= _mesa_shader_stage_to_subroutine(stage
);
2646 res
= _mesa_program_resource_find_name(shProg
, resource_type
, name
, NULL
);
2651 return _mesa_program_resource_index(shProg
, res
);
2656 _mesa_GetActiveSubroutineUniformiv(GLuint program
, GLenum shadertype
,
2657 GLuint index
, GLenum pname
, GLint
*values
)
2659 GET_CURRENT_CONTEXT(ctx
);
2660 const char *api_name
= "glGetActiveSubroutineUniformiv";
2661 struct gl_shader_program
*shProg
;
2662 struct gl_linked_shader
*sh
;
2663 gl_shader_stage stage
;
2664 struct gl_program_resource
*res
;
2665 const struct gl_uniform_storage
*uni
;
2666 GLenum resource_type
;
2669 if (!_mesa_validate_shader_target(ctx
, shadertype
)) {
2670 _mesa_error(ctx
, GL_INVALID_OPERATION
, "%s", api_name
);
2674 shProg
= _mesa_lookup_shader_program_err(ctx
, program
, api_name
);
2678 stage
= _mesa_shader_enum_to_shader_stage(shadertype
);
2679 resource_type
= _mesa_shader_stage_to_subroutine_uniform(stage
);
2681 sh
= shProg
->_LinkedShaders
[stage
];
2683 _mesa_error(ctx
, GL_INVALID_OPERATION
, "%s", api_name
);
2687 struct gl_program
*p
= shProg
->_LinkedShaders
[stage
]->Program
;
2688 if (index
>= p
->sh
.NumSubroutineUniforms
) {
2689 _mesa_error(ctx
, GL_INVALID_VALUE
, "%s: invalid index greater than GL_ACTIVE_SUBROUTINE_UNIFORMS", api_name
);
2694 case GL_NUM_COMPATIBLE_SUBROUTINES
: {
2695 res
= _mesa_program_resource_find_index(shProg
, resource_type
, index
);
2698 values
[0] = uni
->num_compatible_subroutines
;
2702 case GL_COMPATIBLE_SUBROUTINES
: {
2703 res
= _mesa_program_resource_find_index(shProg
, resource_type
, index
);
2707 for (i
= 0; i
< p
->sh
.NumSubroutineFunctions
; i
++) {
2708 struct gl_subroutine_function
*fn
= &p
->sh
.SubroutineFunctions
[i
];
2709 for (j
= 0; j
< fn
->num_compat_types
; j
++) {
2710 if (fn
->types
[j
] == uni
->type
) {
2711 values
[count
++] = i
;
2719 case GL_UNIFORM_SIZE
:
2720 res
= _mesa_program_resource_find_index(shProg
, resource_type
, index
);
2723 values
[0] = uni
->array_elements
? uni
->array_elements
: 1;
2726 case GL_UNIFORM_NAME_LENGTH
:
2727 res
= _mesa_program_resource_find_index(shProg
, resource_type
, index
);
2729 values
[0] = strlen(_mesa_program_resource_name(res
)) + 1
2730 + ((_mesa_program_resource_array_size(res
) != 0) ? 3 : 0);
2734 _mesa_error(ctx
, GL_INVALID_OPERATION
, "%s", api_name
);
2741 _mesa_GetActiveSubroutineUniformName(GLuint program
, GLenum shadertype
,
2742 GLuint index
, GLsizei bufsize
,
2743 GLsizei
*length
, GLchar
*name
)
2745 GET_CURRENT_CONTEXT(ctx
);
2746 const char *api_name
= "glGetActiveSubroutineUniformName";
2747 struct gl_shader_program
*shProg
;
2748 GLenum resource_type
;
2749 gl_shader_stage stage
;
2751 if (!_mesa_validate_shader_target(ctx
, shadertype
)) {
2752 _mesa_error(ctx
, GL_INVALID_OPERATION
, "%s", api_name
);
2756 shProg
= _mesa_lookup_shader_program_err(ctx
, program
, api_name
);
2760 stage
= _mesa_shader_enum_to_shader_stage(shadertype
);
2761 if (!shProg
->_LinkedShaders
[stage
]) {
2762 _mesa_error(ctx
, GL_INVALID_OPERATION
, "%s", api_name
);
2766 resource_type
= _mesa_shader_stage_to_subroutine_uniform(stage
);
2767 /* get program resource name */
2768 _mesa_get_program_resource_name(shProg
, resource_type
,
2770 length
, name
, api_name
);
2775 _mesa_GetActiveSubroutineName(GLuint program
, GLenum shadertype
,
2776 GLuint index
, GLsizei bufsize
,
2777 GLsizei
*length
, GLchar
*name
)
2779 GET_CURRENT_CONTEXT(ctx
);
2780 const char *api_name
= "glGetActiveSubroutineName";
2781 struct gl_shader_program
*shProg
;
2782 GLenum resource_type
;
2783 gl_shader_stage stage
;
2785 if (!_mesa_validate_shader_target(ctx
, shadertype
)) {
2786 _mesa_error(ctx
, GL_INVALID_OPERATION
, "%s", api_name
);
2790 shProg
= _mesa_lookup_shader_program_err(ctx
, program
, api_name
);
2794 stage
= _mesa_shader_enum_to_shader_stage(shadertype
);
2795 if (!shProg
->_LinkedShaders
[stage
]) {
2796 _mesa_error(ctx
, GL_INVALID_OPERATION
, "%s", api_name
);
2799 resource_type
= _mesa_shader_stage_to_subroutine(stage
);
2800 _mesa_get_program_resource_name(shProg
, resource_type
,
2802 length
, name
, api_name
);
2806 _mesa_UniformSubroutinesuiv(GLenum shadertype
, GLsizei count
,
2807 const GLuint
*indices
)
2809 GET_CURRENT_CONTEXT(ctx
);
2810 const char *api_name
= "glUniformSubroutinesuiv";
2811 gl_shader_stage stage
;
2814 if (!_mesa_validate_shader_target(ctx
, shadertype
)) {
2815 _mesa_error(ctx
, GL_INVALID_OPERATION
, "%s", api_name
);
2819 stage
= _mesa_shader_enum_to_shader_stage(shadertype
);
2820 struct gl_program
*p
= ctx
->_Shader
->CurrentProgram
[stage
];
2822 _mesa_error(ctx
, GL_INVALID_OPERATION
, "%s", api_name
);
2826 if (count
!= p
->sh
.NumSubroutineUniformRemapTable
) {
2827 _mesa_error(ctx
, GL_INVALID_VALUE
, "%s", api_name
);
2832 bool flushed
= false;
2834 struct gl_uniform_storage
*uni
= p
->sh
.SubroutineUniformRemapTable
[i
];
2841 _mesa_flush_vertices_for_uniforms(ctx
, uni
);
2845 int uni_count
= uni
->array_elements
? uni
->array_elements
: 1;
2848 for (j
= i
; j
< i
+ uni_count
; j
++) {
2849 struct gl_subroutine_function
*subfn
= NULL
;
2850 if (indices
[j
] > p
->sh
.MaxSubroutineFunctionIndex
) {
2851 _mesa_error(ctx
, GL_INVALID_VALUE
, "%s", api_name
);
2855 for (f
= 0; f
< p
->sh
.NumSubroutineFunctions
; f
++) {
2856 if (p
->sh
.SubroutineFunctions
[f
].index
== indices
[j
])
2857 subfn
= &p
->sh
.SubroutineFunctions
[f
];
2864 for (k
= 0; k
< subfn
->num_compat_types
; k
++) {
2865 if (subfn
->types
[k
] == uni
->type
)
2868 if (k
== subfn
->num_compat_types
) {
2869 _mesa_error(ctx
, GL_INVALID_OPERATION
, "%s", api_name
);
2873 ctx
->SubroutineIndex
[p
->info
.stage
].IndexPtr
[j
] = indices
[j
];
2881 _mesa_GetUniformSubroutineuiv(GLenum shadertype
, GLint location
,
2884 GET_CURRENT_CONTEXT(ctx
);
2885 const char *api_name
= "glGetUniformSubroutineuiv";
2886 gl_shader_stage stage
;
2888 if (!_mesa_validate_shader_target(ctx
, shadertype
)) {
2889 _mesa_error(ctx
, GL_INVALID_OPERATION
, "%s", api_name
);
2893 stage
= _mesa_shader_enum_to_shader_stage(shadertype
);
2894 struct gl_program
*p
= ctx
->_Shader
->CurrentProgram
[stage
];
2896 _mesa_error(ctx
, GL_INVALID_OPERATION
, "%s", api_name
);
2900 if (location
>= p
->sh
.NumSubroutineUniformRemapTable
) {
2901 _mesa_error(ctx
, GL_INVALID_VALUE
, "%s", api_name
);
2905 *params
= ctx
->SubroutineIndex
[p
->info
.stage
].IndexPtr
[location
];
2910 _mesa_GetProgramStageiv(GLuint program
, GLenum shadertype
,
2911 GLenum pname
, GLint
*values
)
2913 GET_CURRENT_CONTEXT(ctx
);
2914 const char *api_name
= "glGetProgramStageiv";
2915 struct gl_shader_program
*shProg
;
2916 struct gl_linked_shader
*sh
;
2917 gl_shader_stage stage
;
2919 if (!_mesa_validate_shader_target(ctx
, shadertype
)) {
2920 _mesa_error(ctx
, GL_INVALID_OPERATION
, "%s", api_name
);
2924 shProg
= _mesa_lookup_shader_program_err(ctx
, program
, api_name
);
2928 stage
= _mesa_shader_enum_to_shader_stage(shadertype
);
2929 sh
= shProg
->_LinkedShaders
[stage
];
2931 /* ARB_shader_subroutine doesn't ask the program to be linked, or list any
2932 * INVALID_OPERATION in the case of not be linked.
2934 * And for some pnames, like GL_ACTIVE_SUBROUTINE_UNIFORMS, you can ask the
2935 * same info using other specs (ARB_program_interface_query), without the
2936 * need of the program to be linked, being the value for that case 0.
2938 * But at the same time, some other methods require the program to be
2939 * linked for pname related to locations, so it would be inconsistent to
2940 * not do the same here. So we are:
2941 * * Return GL_INVALID_OPERATION if not linked only for locations.
2942 * * Setting a default value of 0, to be returned if not linked.
2946 if (pname
== GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS
) {
2947 _mesa_error(ctx
, GL_INVALID_OPERATION
, "%s", api_name
);
2952 struct gl_program
*p
= sh
->Program
;
2954 case GL_ACTIVE_SUBROUTINES
:
2955 values
[0] = p
->sh
.NumSubroutineFunctions
;
2957 case GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS
:
2958 values
[0] = p
->sh
.NumSubroutineUniformRemapTable
;
2960 case GL_ACTIVE_SUBROUTINE_UNIFORMS
:
2961 values
[0] = p
->sh
.NumSubroutineUniforms
;
2963 case GL_ACTIVE_SUBROUTINE_MAX_LENGTH
:
2967 GLenum resource_type
;
2968 struct gl_program_resource
*res
;
2970 resource_type
= _mesa_shader_stage_to_subroutine(stage
);
2971 for (i
= 0; i
< p
->sh
.NumSubroutineFunctions
; i
++) {
2972 res
= _mesa_program_resource_find_index(shProg
, resource_type
, i
);
2974 const GLint len
= strlen(_mesa_program_resource_name(res
)) + 1;
2979 values
[0] = max_len
;
2982 case GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH
:
2986 GLenum resource_type
;
2987 struct gl_program_resource
*res
;
2989 resource_type
= _mesa_shader_stage_to_subroutine_uniform(stage
);
2990 for (i
= 0; i
< p
->sh
.NumSubroutineUniformRemapTable
; i
++) {
2991 res
= _mesa_program_resource_find_index(shProg
, resource_type
, i
);
2993 const GLint len
= strlen(_mesa_program_resource_name(res
)) + 1
2994 + ((_mesa_program_resource_array_size(res
) != 0) ? 3 : 0);
3000 values
[0] = max_len
;
3004 _mesa_error(ctx
, GL_INVALID_ENUM
, "%s", api_name
);
3011 find_compat_subroutine(struct gl_program
*p
, const struct glsl_type
*type
)
3015 for (i
= 0; i
< p
->sh
.NumSubroutineFunctions
; i
++) {
3016 struct gl_subroutine_function
*fn
= &p
->sh
.SubroutineFunctions
[i
];
3017 for (j
= 0; j
< fn
->num_compat_types
; j
++) {
3018 if (fn
->types
[j
] == type
)
3026 _mesa_shader_write_subroutine_index(struct gl_context
*ctx
,
3027 struct gl_program
*p
)
3031 if (p
->sh
.NumSubroutineUniformRemapTable
== 0)
3036 struct gl_uniform_storage
*uni
= p
->sh
.SubroutineUniformRemapTable
[i
];
3045 uni_count
= uni
->array_elements
? uni
->array_elements
: 1;
3046 for (j
= 0; j
< uni_count
; j
++) {
3047 val
= ctx
->SubroutineIndex
[p
->info
.stage
].IndexPtr
[i
+ j
];
3048 memcpy(&uni
->storage
[j
], &val
, sizeof(int));
3051 _mesa_propagate_uniforms_to_driver_storage(uni
, 0, uni_count
);
3053 } while(i
< p
->sh
.NumSubroutineUniformRemapTable
);
3057 _mesa_shader_write_subroutine_indices(struct gl_context
*ctx
,
3058 gl_shader_stage stage
)
3060 if (ctx
->_Shader
->CurrentProgram
[stage
])
3061 _mesa_shader_write_subroutine_index(ctx
,
3062 ctx
->_Shader
->CurrentProgram
[stage
]);
3066 _mesa_program_init_subroutine_defaults(struct gl_context
*ctx
,
3067 struct gl_program
*p
)
3071 struct gl_subroutine_index_binding
*binding
= &ctx
->SubroutineIndex
[p
->info
.stage
];
3072 if (binding
->NumIndex
!= p
->sh
.NumSubroutineUniformRemapTable
) {
3073 binding
->IndexPtr
= realloc(binding
->IndexPtr
,
3074 p
->sh
.NumSubroutineUniformRemapTable
* (sizeof(GLuint
)));
3075 binding
->NumIndex
= p
->sh
.NumSubroutineUniformRemapTable
;
3078 for (int i
= 0; i
< p
->sh
.NumSubroutineUniformRemapTable
; i
++) {
3079 struct gl_uniform_storage
*uni
= p
->sh
.SubroutineUniformRemapTable
[i
];
3084 binding
->IndexPtr
[i
] = find_compat_subroutine(p
, uni
->type
);