[Mesa-dev] [PATCH 4/7] glsl: pass symbols to find_matching_signature() rather than shader
Iago Toral
itoral at igalia.com
Tue Jun 28 14:27:19 UTC 2016
On Tue, 2016-06-28 at 11:52 +1000, Timothy Arceri wrote:
> This will allow us to later split gl_shader into two structs.
> ---
> src/compiler/glsl/link_functions.cpp | 47 +++++++++++++++++-------------------
> 1 file changed, 22 insertions(+), 25 deletions(-)
>
> diff --git a/src/compiler/glsl/link_functions.cpp b/src/compiler/glsl/link_functions.cpp
> index 4e10287..c9dacc1 100644
> --- a/src/compiler/glsl/link_functions.cpp
> +++ b/src/compiler/glsl/link_functions.cpp
> @@ -31,8 +31,7 @@
>
> static ir_function_signature *
> find_matching_signature(const char *name, const exec_list *actual_parameters,
> - gl_shader **shader_list, unsigned num_shaders,
> - bool use_builtin);
> + glsl_symbol_table *symbols, bool use_builtin);
>
> namespace {
>
> @@ -78,8 +77,8 @@ public:
> * final linked shader. If it does, use it as the target of the call.
> */
> ir_function_signature *sig =
> - find_matching_signature(name, &callee->parameters, &linked, 1,
> - ir->use_builtin);
> + find_matching_signature(name, &callee->parameters, linked->symbols,
> + ir->use_builtin);
> if (sig != NULL) {
> ir->callee = sig;
> return visit_continue;
> @@ -88,8 +87,14 @@ public:
> /* Try to find the signature in one of the other shaders that is being
> * linked. If it's not found there, return an error.
> */
> - sig = find_matching_signature(name, &ir->actual_parameters, shader_list,
> - num_shaders, ir->use_builtin);
> + for (unsigned i = 0; i < num_shaders; i++) {
> + sig = find_matching_signature(name, &ir->actual_parameters,
> + shader_list[i]->symbols,
> + ir->use_builtin);
> + if (sig)
> + break;
> + }
> +
> if (sig == NULL) {
> /* FINISHME: Log the full signature of unresolved function.
> */
> @@ -307,30 +312,22 @@ private:
> */
> ir_function_signature *
> find_matching_signature(const char *name, const exec_list *actual_parameters,
> - gl_shader **shader_list, unsigned num_shaders,
> - bool use_builtin)
> + glsl_symbol_table *symbols, bool use_builtin)
> {
> - for (unsigned i = 0; i < num_shaders; i++) {
> - ir_function *const f = shader_list[i]->symbols->get_function(name);
> -
> - if (f == NULL)
> - continue;
> + ir_function *const f = symbols->get_function(name);
>
> + if (f) {
> ir_function_signature *sig =
> f->matching_signature(NULL, actual_parameters, use_builtin);
>
> - if ((sig == NULL) ||
> - (!sig->is_defined && !sig->is_intrinsic))
> - continue;
> -
> - /* If this function expects to bind to a built-in function and the
> - * signature that we found isn't a built-in, keep looking. Also keep
> - * looking if we expect a non-built-in but found a built-in.
> - */
> - if (use_builtin != sig->is_builtin())
> - continue;
> -
> - return sig;
> + if (sig && (sig->is_defined || sig->is_intrinsic)) {
> + /* If this function expects to bind to a built-in function and the
> + * signature that we found isn't a built-in, keep looking. Also keep
> + * looking if we expect a non-built-in but found a built-in.
> + */
> + if (use_builtin != sig->is_builtin())
> + return sig;
The code you changed would not return sig if this condition is true, so
I guess you meant:
if (use_builtin == sig->is_builtin())
return sig;
Iago
> + }
> }
>
> return NULL;
More information about the mesa-dev
mailing list