[Mesa-dev] [PATCH] xa: don't leak fences

Rob Clark robdclark at gmail.com
Fri Jul 10 05:46:17 PDT 2015


well, freedreno and vmware ddx still use XA.. they both could probably
be ported to use glamor instead, but that hasn't been done yet..

At least for freedreno with upstream drm/kms driver, one can just use
-modesetting ddx instead.  But that doesn't work w/ android fbdev
driver.  I need to check again w/ a more recent -modesetting+glamor,
but when I tried it a few months ago, there were some cases of
rendering corruption (but I didn't have time to debug and see whether
that was a freedreno issue or a glamor issue).

I wouldn't recommend new users of XA at this point, but I don't think
we are quite at the point where we can remove it.

BR,
-R

On Fri, Jul 10, 2015 at 7:12 AM, Marek Olšák <maraeo at gmail.com> wrote:
> I wonder... do we still need XA considering that everybody can just
> use glamor instead?
>
> Marek
>
>
> On Wed, Jul 8, 2015 at 7:39 PM, Rob Clark <robdclark at gmail.com> wrote:
>> From: Rob Clark <robclark at freedesktop.org>
>>
>> XA was never unref'ing last_fence in the various call paths to
>> pipe->flush().  Add this to xa_context_flush() and update the other
>> open-coded calls to pipe->flush() to use xa_context_flush() instead.
>>
>> This fixes a memory leak reported with xf86-video-freedreno.
>>
>> Reported-by: Nicolas Dechesne <nicolas.dechesne at linaro.org>
>> Cc: "10.5 10.6" <mesa-stable at lists.freedesktop.org>
>> Signed-off-by: Rob Clark <robclark at freedesktop.org>
>> ---
>>  src/gallium/state_trackers/xa/xa_context.c | 6 +++++-
>>  src/gallium/state_trackers/xa/xa_tracker.c | 2 +-
>>  src/gallium/state_trackers/xa/xa_yuv.c     | 2 +-
>>  3 files changed, 7 insertions(+), 3 deletions(-)
>>
>> diff --git a/src/gallium/state_trackers/xa/xa_context.c b/src/gallium/state_trackers/xa/xa_context.c
>> index fd49c82..ebfb290 100644
>> --- a/src/gallium/state_trackers/xa/xa_context.c
>> +++ b/src/gallium/state_trackers/xa/xa_context.c
>> @@ -37,7 +37,11 @@
>>  XA_EXPORT void
>>  xa_context_flush(struct xa_context *ctx)
>>  {
>> -       ctx->pipe->flush(ctx->pipe, &ctx->last_fence, 0);
>> +    if (ctx->last_fence) {
>> +        struct pipe_screen *screen = ctx->xa->screen;
>> +        screen->fence_reference(screen, &ctx->last_fence, NULL);
>> +    }
>> +    ctx->pipe->flush(ctx->pipe, &ctx->last_fence, 0);
>>  }
>>
>>  XA_EXPORT struct xa_context *
>> diff --git a/src/gallium/state_trackers/xa/xa_tracker.c b/src/gallium/state_trackers/xa/xa_tracker.c
>> index a384c1c..1df1da7 100644
>> --- a/src/gallium/state_trackers/xa/xa_tracker.c
>> +++ b/src/gallium/state_trackers/xa/xa_tracker.c
>> @@ -464,7 +464,7 @@ xa_surface_redefine(struct xa_surface *srf,
>>                         xa_min(save_height, template->height0), &src_box);
>>         pipe->resource_copy_region(pipe, texture,
>>                                    0, 0, 0, 0, srf->tex, 0, &src_box);
>> -       pipe->flush(pipe, &xa->default_ctx->last_fence, 0);
>> +       xa_context_flush(xa->default_ctx);
>>      }
>>
>>      pipe_resource_reference(&srf->tex, texture);
>> diff --git a/src/gallium/state_trackers/xa/xa_yuv.c b/src/gallium/state_trackers/xa/xa_yuv.c
>> index 1519639..97a1833 100644
>> --- a/src/gallium/state_trackers/xa/xa_yuv.c
>> +++ b/src/gallium/state_trackers/xa/xa_yuv.c
>> @@ -154,7 +154,7 @@ xa_yuv_planar_blit(struct xa_context *r,
>>         box++;
>>      }
>>
>> -    r->pipe->flush(r->pipe, &r->last_fence, 0);
>> +    xa_context_flush(r);
>>
>>      xa_ctx_sampler_views_destroy(r);
>>      xa_ctx_srf_destroy(r);
>> --
>> 2.4.3
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list