[Mesa-dev] [PATCH v2] glsl: builtin: always return clones of the builtins
Kenneth Graunke
kenneth at whitecape.org
Thu Mar 9 07:01:03 UTC 2017
On Wednesday, March 8, 2017 1:15:04 PM PST Lionel Landwerlin wrote:
> Builtins are created once and allocated using their own private ralloc
> context. When reparenting IR that includes builtins, we might be steal
> bits of builtins. This is problematic because these builtins might now
> be freed when the shader that includes then last is disposed. This
> might also lead to inconsistent ralloc trees/lists if shaders are
> created on multiple threads.
>
> Rather than including builtins directly into a shader's IR, we should
> include clones of them in the ralloc context of the shader that
> requires them. This fixes double free issues we've been seeing when
> running shader-db on a big multicore (72 threads) server.
>
> v2: Also rename _mesa_glsl_find_builtin_function_by_name() to better
> reflect how this function is used. (Ken)
>
> Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
> ---
> src/compiler/glsl/ast_to_hir.cpp | 2 +-
> src/compiler/glsl/builtin_functions.cpp | 22 +++++++++++++++++-----
> src/compiler/glsl/builtin_functions.h | 4 ++--
> 3 files changed, 20 insertions(+), 8 deletions(-)
>
> diff --git a/src/compiler/glsl/ast_to_hir.cpp b/src/compiler/glsl/ast_to_hir.cpp
> index 59d03c9c96..27dc21fffe 100644
> --- a/src/compiler/glsl/ast_to_hir.cpp
> +++ b/src/compiler/glsl/ast_to_hir.cpp
> @@ -5653,7 +5653,7 @@ ast_function::hir(exec_list *instructions,
> if (state->es_shader && state->language_version >= 300) {
> /* Local shader has no exact candidates; check the built-ins. */
> _mesa_glsl_initialize_builtin_functions();
> - if (_mesa_glsl_find_builtin_function_by_name(name)) {
> + if (_mesa_glsl_has_builtin_function(name)) {
> YYLTYPE loc = this->get_location();
> _mesa_glsl_error(& loc, state,
> "A shader cannot redefine or overload built-in "
> diff --git a/src/compiler/glsl/builtin_functions.cpp b/src/compiler/glsl/builtin_functions.cpp
> index e03a50c843..8278c51992 100644
> --- a/src/compiler/glsl/builtin_functions.cpp
> +++ b/src/compiler/glsl/builtin_functions.cpp
> @@ -62,6 +62,7 @@
> #include "program/prog_instruction.h"
> #include <math.h>
> #include "builtin_functions.h"
> +#include "util/hash_table.h"
>
> #define M_PIf ((float) M_PI)
> #define M_PI_2f ((float) M_PI_2)
> @@ -6002,21 +6003,32 @@ ir_function_signature *
> _mesa_glsl_find_builtin_function(_mesa_glsl_parse_state *state,
> const char *name, exec_list *actual_parameters)
> {
> - ir_function_signature * s;
> + ir_function_signature *s;
> mtx_lock(&builtins_lock);
> s = builtins.find(state, name, actual_parameters);
> mtx_unlock(&builtins_lock);
> - return s;
> +
> + if (s == NULL)
> + return NULL;
> +
> + struct hash_table *ht =
> + _mesa_hash_table_create(NULL, _mesa_hash_pointer, _mesa_key_pointer_equal);
> + void *ctx = state;
Let's call this mem_ctx or just pass in state directly. We originally
used "ctx" when developing the compiler out of tree, but now that we're
in Mesa where "ctx" refers to gl_context, we've tried to switch over.
Really awesome work finding this! Thanks!
Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>
> + ir_function *f = s->function()->clone(ctx, ht);
> + _mesa_hash_table_destroy(ht, NULL);
> +
> + return f->matching_signature(state, actual_parameters, true);
> }
>
> -ir_function *
> -_mesa_glsl_find_builtin_function_by_name(const char *name)
> +bool
> +_mesa_glsl_has_builtin_function(const char *name)
> {
> ir_function *f;
> mtx_lock(&builtins_lock);
> f = builtins.shader->symbols->get_function(name);
> mtx_unlock(&builtins_lock);
> - return f;
> +
> + return f != NULL;
> }
>
> gl_shader *
> diff --git a/src/compiler/glsl/builtin_functions.h b/src/compiler/glsl/builtin_functions.h
> index 7ae211b48a..14a52b9402 100644
> --- a/src/compiler/glsl/builtin_functions.h
> +++ b/src/compiler/glsl/builtin_functions.h
> @@ -31,8 +31,8 @@ extern ir_function_signature *
> _mesa_glsl_find_builtin_function(_mesa_glsl_parse_state *state,
> const char *name, exec_list *actual_parameters);
>
> -extern ir_function *
> -_mesa_glsl_find_builtin_function_by_name(const char *name);
> +extern bool
> +_mesa_glsl_has_builtin_function(const char *name);
>
> extern gl_shader *
> _mesa_glsl_get_builtin_function_shader(void);
> --
> 2.11.0
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: This is a digitally signed message part.
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20170308/7be509da/attachment.sig>
More information about the mesa-dev
mailing list