From e5af048e71d67cfba76d664430010fcf5207b140 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Thu, 17 Mar 2022 11:26:34 -0400 Subject: [PATCH] zink: force-add usage when adding last-ref tracking this fixes desync+crash when: 1. usage is added for bs A 2. tracking is added for bs B 3. tracking is removed for bs B 4. context is destroyed 5. usage A is now dangling and will crash if accessed as seen in glmark2 cc: mesa-stable Reviewed-by: Dave Airlie Part-of: (cherry picked from commit 7da211e24fe14d8b107461bdfcb3b8d67212f88a) --- src/gallium/drivers/zink/zink_context.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index 636729563eb..b776dd65852 100644 --- a/src/gallium/drivers/zink/zink_context.c +++ b/src/gallium/drivers/zink/zink_context.c @@ -73,8 +73,18 @@ debug_describe_zink_buffer_view(char *buf, const struct zink_buffer_view *ptr) ALWAYS_INLINE static void check_resource_for_batch_ref(struct zink_context *ctx, struct zink_resource *res) { - if (!zink_resource_has_binds(res)) - zink_batch_reference_resource(&ctx->batch, res); + if (!zink_resource_has_binds(res)) { + /* avoid desync between usage and tracking: + * - if usage exists, it must be removed before the context is destroyed + * - having usage does not imply having tracking + * - if tracking will be added here, also reapply usage to avoid dangling usage once tracking is removed + * TODO: somehow fix this for perf because it's an extra hash lookup + */ + if (res->obj->bo->reads || res->obj->bo->writes) + zink_batch_reference_resource_rw(&ctx->batch, res, !!res->obj->bo->writes); + else + zink_batch_reference_resource(&ctx->batch, res); + } } static void