diff --git a/src/gallium/drivers/tegra/tegra_resource.h b/src/gallium/drivers/tegra/tegra_resource.h index 67507d64590..892afaf5e0f 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 2b108b07908..3c4c36e0c94 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); }