diff --git a/src/gallium/drivers/zink/zink_resource.c b/src/gallium/drivers/zink/zink_resource.c index ead20b3f1de..8436f07c2a9 100644 --- a/src/gallium/drivers/zink/zink_resource.c +++ b/src/gallium/drivers/zink/zink_resource.c @@ -1058,11 +1058,14 @@ map_resource(struct zink_screen *screen, struct zink_resource *res) static void unmap_resource(struct zink_screen *screen, struct zink_resource *res) { - res->obj->map = NULL; if (!res->obj->dedicated) zink_bo_unmap(screen, res->obj->bo); - else + else { + if (!p_atomic_dec_zero(&res->obj->map_count)) + return; vkUnmapMemory(screen->dev, res->obj->mem); + } + res->obj->map = NULL; } static void * @@ -1323,6 +1326,8 @@ zink_transfer_map(struct pipe_context *pctx, } if (sizeof(void*) == 4) trans->base.b.usage |= ZINK_MAP_TEMPORARY; + if (res->obj->dedicated) + p_atomic_inc(&res->obj->map_count); } if ((usage & PIPE_MAP_PERSISTENT) && !(usage & PIPE_MAP_COHERENT)) res->obj->persistent_maps++; diff --git a/src/gallium/drivers/zink/zink_resource.h b/src/gallium/drivers/zink/zink_resource.h index 2a80db2d47e..ceed23ea5e8 100644 --- a/src/gallium/drivers/zink/zink_resource.h +++ b/src/gallium/drivers/zink/zink_resource.h @@ -61,6 +61,7 @@ struct zink_resource_object { struct zink_batch_usage *reads; struct zink_batch_usage *writes; void *map; + unsigned map_count; struct util_dynarray tmp;