iris: refcount separate screen objects for resource tracking

this screen object can never, ever be accessed like this in a resource,
as it may have previously been replaced by a wrapper (e.g., driver trace)
which will then explode when it is accessed directly

instead, keep a separate screen ref on the resource which is known to be
the actual driver object and not a wrapper

Fixes: 0a497eb130 ("iris: make resources take a ref on the screen object")

Reviewed-by: Lionel Landwerlin lionel.g.landwerlin@intel.com
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10632>
This commit is contained in:
Mike Blumenkrantz 2021-05-04 15:08:07 -04:00 committed by Marge Bot
parent 9a5c9ff342
commit eb63c7dece
2 changed files with 8 additions and 2 deletions

View file

@ -456,7 +456,7 @@ iris_resource_destroy(struct pipe_screen *screen,
threaded_resource_deinit(p_res);
iris_bo_unreference(res->bo);
iris_pscreen_unref(res->base.b.screen);
iris_pscreen_unref(res->orig_screen);
free(res);
}
@ -470,7 +470,8 @@ iris_alloc_resource(struct pipe_screen *pscreen,
return NULL;
res->base.b = *templ;
res->base.b.screen = iris_pscreen_ref(pscreen);
res->base.b.screen = pscreen;
res->orig_screen = iris_pscreen_ref(pscreen);
pipe_reference_init(&res->base.b.reference, 1);
threaded_resource_init(&res->base.b);

View file

@ -168,6 +168,11 @@ struct iris_resource {
* be DRM_FORMAT_MOD_INVALID.
*/
const struct isl_drm_modifier_info *mod_info;
/**
* The screen the resource was originally created with, stored for refcounting.
*/
struct pipe_screen *orig_screen;
};
/**