[Mesa-dev] [PATCH v2] glsl: builtin: always return clones of the builtins

Timothy Arceri tarceri at itsqueeze.com
Thu Jul 27 07:52:55 UTC 2017


On 09/03/17 18:01, Kenneth Graunke wrote:
> 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.

I know this landed a while back but I'm looking into the compiler perf 
and these function clones popped up.

The thing I don't understand is that the only place that uses bits of 
the builtin is generate_inline() and all of those bits are cloned already.

Do you recall what bits of builtins we being stolen by reparenting the IR?

>> 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
>>
> 
> 
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
> 


More information about the mesa-dev mailing list