[Mesa-dev] [PATCH 07/16] radeonsi: add reference count to si_compute
Marek Olšák
maraeo at gmail.com
Sun Aug 20 13:48:37 UTC 2017
The patch seems OK to me.
Marek
On Wed, Aug 16, 2017 at 1:50 PM, Gert Wollny <gw.fossdev at gmail.com> wrote:
> Hello Nicolai,
>
> I've spotted a little problem in you code (see below).
>
> Best,
> Gert
>
>
> Am Mittwoch, den 16.08.2017, 13:05 +0200 schrieb Nicolai Hähnle:
>> From: Nicolai Hähnle <nicolai.haehnle at amd.com>
>>
>> To allow keep-alive for deferred logging.
>> ---
>> src/gallium/drivers/radeonsi/si_compute.c | 24 ++++++++++++++-------
>> ---
>> src/gallium/drivers/radeonsi/si_compute.h | 14 ++++++++++++++
>> 2 files changed, 28 insertions(+), 10 deletions(-)
>>
>> diff --git a/src/gallium/drivers/radeonsi/si_compute.c
>> b/src/gallium/drivers/radeonsi/si_compute.c
>> index 5efdd3919d2..8c016ba65ab 100644
>> --- a/src/gallium/drivers/radeonsi/si_compute.c
>> +++ b/src/gallium/drivers/radeonsi/si_compute.c
>> @@ -151,6 +151,7 @@ static void *si_create_compute_state(
>> struct si_screen *sscreen = (struct si_screen *)ctx->screen;
>> struct si_compute *program = CALLOC_STRUCT(si_compute);
>>
>> + pipe_reference_init(&program->reference, 1);
>> program->screen = (struct si_screen *)ctx->screen;
>> program->ir_type = cso->ir_type;
>> program->local_size = cso->req_local_mem;
>> @@ -855,20 +856,24 @@ static void si_launch_grid(
>> sctx->b.flags |= SI_CONTEXT_CS_PARTIAL_FLUSH;
>> }
>>
>> +void si_destroy_compute(struct si_compute *program)
>> +{
>> + if (program->ir_type == PIPE_SHADER_IR_TGSI) {
>> + util_queue_drop_job(&program->screen-
>> >shader_compiler_queue,
>> + &program->ready);
>> + util_queue_fence_destroy(&program->ready);
>> + }
>> +
>> + si_shader_destroy(&program->shader);
>> + FREE(program);
>> +}
>>
>> static void si_delete_compute_state(struct pipe_context *ctx, void*
>> state){
>> struct si_compute *program = (struct si_compute *)state;
>> struct si_context *sctx = (struct si_context*)ctx;
>>
>> - if (!state) {
>> + if (!state)
>> return;
>> - }
>> -
>> - if (program->ir_type == PIPE_SHADER_IR_TGSI) {
>> - util_queue_drop_job(&sctx->screen-
>> >shader_compiler_queue,
>> - &program->ready);
>> - util_queue_fence_destroy(&program->ready);
>> - }
>>
>> if (program == sctx->cs_shader_state.program)
>> sctx->cs_shader_state.program = NULL;
>> @@ -876,8 +881,7 @@ static void si_delete_compute_state(struct
>> pipe_context *ctx, void* state){
>> if (program == sctx->cs_shader_state.emitted_program)
>> sctx->cs_shader_state.emitted_program = NULL;
>>
>> - si_shader_destroy(&program->shader);
>> - FREE(program);
>> + si_compute_reference(&program, NULL);
>> }
> Here you call "si_compute_reference" with parameter src=NULL and de-
> reference it in that function.
> Likewise you call FREE on "program" and also dereference it there.
> (see below).
>
>>
>> static void si_set_compute_resources(struct pipe_context * ctx_,
>> diff --git a/src/gallium/drivers/radeonsi/si_compute.h
>> b/src/gallium/drivers/radeonsi/si_compute.h
>> index 268817b23a6..c19b701fc71 100644
>> --- a/src/gallium/drivers/radeonsi/si_compute.h
>> +++ b/src/gallium/drivers/radeonsi/si_compute.h
>> @@ -24,11 +24,14 @@
>> #ifndef SI_COMPUTE_H
>> #define SI_COMPUTE_H
>>
>> +#include "util/u_inlines.h"
>> +
>> #include "si_shader.h"
>>
>> #define MAX_GLOBAL_BUFFERS 22
>>
>> struct si_compute {
>> + struct pipe_reference reference;
>> struct si_screen *screen;
>> struct tgsi_token *tokens;
>> struct util_queue_fence ready;
>> @@ -53,4 +56,15 @@ struct si_compute {
>> unsigned uses_bindless_images:1;
>> };
>>
>> +void si_destroy_compute(struct si_compute *program);
>> +
>> +static inline void
>> +si_compute_reference(struct si_compute **dst, struct si_compute
>> *src)
>> +{
>> + if (pipe_reference(&(*dst)->reference, &src->reference))
> + si_destroy_compute(*dst);
>
> When called from si_delete_compute_state *dst has been FREEed and src
> is NULL.
>
>> +
>> + *dst = src;
>> +}
>> +
>> #endif /* SI_COMPUTE_H */
> _______________________________________________
> 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