diff options
author | Lionel Landwerlin <[email protected]> | 2017-03-07 18:37:58 +0000 |
---|---|---|
committer | Lionel Landwerlin <[email protected]> | 2017-03-09 08:30:36 +0000 |
commit | f81ede469910d80ef000f313e3388d65a6bd0afd (patch) | |
tree | 6934ba3bba1f42f80bd9656c33be44c8f9269d6d /src/compiler/glsl/builtin_functions.cpp | |
parent | 071d80bde2a78f464a7f54c3e6c6e42845ef52e4 (diff) |
glsl: builtin: always return clones of the builtins
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)
v3: Rename ctx to mem_ctx (Ken)
Signed-off-by: Lionel Landwerlin <[email protected]>
Reviewed-by: Kenneth Graunke <[email protected]>
Diffstat (limited to 'src/compiler/glsl/builtin_functions.cpp')
-rw-r--r-- | src/compiler/glsl/builtin_functions.cpp | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/src/compiler/glsl/builtin_functions.cpp b/src/compiler/glsl/builtin_functions.cpp index e03a50c8438..e30509a4acd 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 *mem_ctx = state; + ir_function *f = s->function()->clone(mem_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 * |