glsl: Move link_get_main_function_signature to a common location

Also rename to _mesa_get_main_function_signature.

We will call it near the end of compilation to insert some code into
main for initializing some compute shader global variables.

Signed-off-by: Jordan Justen <jordan.l.justen@intel.com>
Reviewed-by: Tapani Pälli <tapani.palli@intel.com>
Reviewed-by: Eduardo Lima Mitev <elima@igalia.com>
This commit is contained in:
Jordan Justen 2015-08-17 12:22:34 -07:00
parent 34e187ec38
commit c4d049f646
5 changed files with 34 additions and 33 deletions

View file

@ -5121,4 +5121,32 @@ _mesa_glsl_get_builtin_function_shader()
return builtins.shader; return builtins.shader;
} }
/**
* Get the function signature for main from a shader
*/
ir_function_signature *
_mesa_get_main_function_signature(gl_shader *sh)
{
ir_function *const f = sh->symbols->get_function("main");
if (f != NULL) {
exec_list void_parameters;
/* Look for the 'void main()' signature and ensure that it's defined.
* This keeps the linker from accidentally pick a shader that just
* contains a prototype for main.
*
* We don't have to check for multiple definitions of main (in multiple
* shaders) because that would have already been caught above.
*/
ir_function_signature *sig =
f->matching_signature(NULL, &void_parameters, false);
if ((sig != NULL) && sig->is_defined) {
return sig;
}
}
return NULL;
}
/** @} */ /** @} */

View file

@ -2529,6 +2529,9 @@ _mesa_glsl_find_builtin_function_by_name(const char *name);
extern gl_shader * extern gl_shader *
_mesa_glsl_get_builtin_function_shader(void); _mesa_glsl_get_builtin_function_shader(void);
extern ir_function_signature *
_mesa_get_main_function_signature(gl_shader *sh);
extern void extern void
_mesa_glsl_release_functions(void); _mesa_glsl_release_functions(void);

View file

@ -1341,33 +1341,6 @@ move_non_declarations(exec_list *instructions, exec_node *last,
return last; return last;
} }
/**
* Get the function signature for main from a shader
*/
ir_function_signature *
link_get_main_function_signature(gl_shader *sh)
{
ir_function *const f = sh->symbols->get_function("main");
if (f != NULL) {
exec_list void_parameters;
/* Look for the 'void main()' signature and ensure that it's defined.
* This keeps the linker from accidentally pick a shader that just
* contains a prototype for main.
*
* We don't have to check for multiple definitions of main (in multiple
* shaders) because that would have already been caught above.
*/
ir_function_signature *sig =
f->matching_signature(NULL, &void_parameters, false);
if ((sig != NULL) && sig->is_defined) {
return sig;
}
}
return NULL;
}
/** /**
* This class is only used in link_intrastage_shaders() below but declaring * This class is only used in link_intrastage_shaders() below but declaring
@ -2040,7 +2013,7 @@ link_intrastage_shaders(void *mem_ctx,
*/ */
gl_shader *main = NULL; gl_shader *main = NULL;
for (unsigned i = 0; i < num_shaders; i++) { for (unsigned i = 0; i < num_shaders; i++) {
if (link_get_main_function_signature(shader_list[i]) != NULL) { if (_mesa_get_main_function_signature(shader_list[i]) != NULL) {
main = shader_list[i]; main = shader_list[i];
break; break;
} }
@ -2072,7 +2045,7 @@ link_intrastage_shaders(void *mem_ctx,
* copy of the original shader that contained the main function). * copy of the original shader that contained the main function).
*/ */
ir_function_signature *const main_sig = ir_function_signature *const main_sig =
link_get_main_function_signature(linked); _mesa_get_main_function_signature(linked);
/* Move any instructions other than variable declarations or function /* Move any instructions other than variable declarations or function
* declarations into main. * declarations into main.

View file

@ -26,9 +26,6 @@
#ifndef GLSL_LINKER_H #ifndef GLSL_LINKER_H
#define GLSL_LINKER_H #define GLSL_LINKER_H
ir_function_signature *
link_get_main_function_signature(gl_shader *sh);
extern bool extern bool
link_function_calls(gl_shader_program *prog, gl_shader *main, link_function_calls(gl_shader_program *prog, gl_shader *main,
gl_shader **shader_list, unsigned num_shaders); gl_shader **shader_list, unsigned num_shaders);

View file

@ -130,7 +130,7 @@ lower_vertex_id(gl_shader *shader)
return false; return false;
ir_function_signature *const main_sig = ir_function_signature *const main_sig =
link_get_main_function_signature(shader); _mesa_get_main_function_signature(shader);
if (main_sig == NULL) { if (main_sig == NULL) {
assert(main_sig != NULL); assert(main_sig != NULL);
return false; return false;