From 108e6eaa83eed3eb356f3cce835c5f5e3a836b8e Mon Sep 17 00:00:00 2001 From: Thierry Reding Date: Wed, 6 Oct 2021 22:47:17 +0200 Subject: [PATCH] tegra: Use private reference count for resources With the recent addition of the shortcuts aiming to avoid atomic operations, the reference count on resources can become unbalanced in the Tegra driver since they are wrapped and then proxied to the Nouveau driver. Fix this by keeping a private reference count. Fixes: 7688b8ae9802 ("st/mesa: eliminate all atomic ops when setting vertex buffers") Reviewed-by: Karol Herbst Tested-by: Karol Herbst --- src/gallium/drivers/tegra/tegra_resource.h | 1 + src/gallium/drivers/tegra/tegra_screen.c | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/src/gallium/drivers/tegra/tegra_resource.h b/src/gallium/drivers/tegra/tegra_resource.h index 67507d6..892afaf 100644 --- a/src/gallium/drivers/tegra/tegra_resource.h +++ b/src/gallium/drivers/tegra/tegra_resource.h @@ -31,6 +31,7 @@ struct winsys_handle; struct tegra_resource { struct pipe_resource base; struct pipe_resource *gpu; + unsigned int refcount; uint64_t modifier; uint32_t stride; diff --git a/src/gallium/drivers/tegra/tegra_screen.c b/src/gallium/drivers/tegra/tegra_screen.c index 2b108b0..3c4c36e 100644 --- a/src/gallium/drivers/tegra/tegra_screen.c +++ b/src/gallium/drivers/tegra/tegra_screen.c @@ -245,6 +245,10 @@ tegra_screen_resource_create(struct pipe_screen *pscreen, pipe_reference_init(&resource->base.reference, 1); resource->base.screen = &screen->base; + /* use private reference count for wrapped resources */ + resource->gpu->reference.count += 100000000; + resource->refcount = 100000000; + return &resource->base; destroy: @@ -352,6 +356,8 @@ tegra_screen_resource_destroy(struct pipe_screen *pscreen, { struct tegra_resource *resource = to_tegra_resource(presource); + /* adjust private reference count */ + p_atomic_add(&resource->gpu->reference.count, -resource->refcount); pipe_resource_reference(&resource->gpu, NULL); free(resource); } -- 2.7.4