From f339f1e7ad344ed33d44a7f6bde58fdc96d5b338 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Thu, 9 May 2024 11:31:33 -0400 Subject: [PATCH] zink: stop leaking sparse semaphores when a single API commit yields multiple internal commits, the intermediate semaphores were getting leaked Part-of: --- src/gallium/drivers/zink/zink_bo.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/gallium/drivers/zink/zink_bo.c b/src/gallium/drivers/zink/zink_bo.c index cc7fb496ffd..dde22193978 100644 --- a/src/gallium/drivers/zink/zink_bo.c +++ b/src/gallium/drivers/zink/zink_bo.c @@ -831,6 +831,8 @@ buffer_bo_commit(struct zink_context *ctx, struct zink_resource *res, uint32_t o ok = false; goto out; } + if (cur_sem) + util_dynarray_append(&ctx->bs->tracked_semaphores, VkSemaphore, cur_sem); cur_sem = buffer_commit_single(screen, res, backing->bo, backing_start, (uint64_t)span_va_page * ZINK_SPARSE_BUFFER_PAGE_SIZE, (uint64_t)backing_size * ZINK_SPARSE_BUFFER_PAGE_SIZE, true, cur_sem); @@ -866,6 +868,8 @@ buffer_bo_commit(struct zink_context *ctx, struct zink_resource *res, uint32_t o } if (!done) { + if (cur_sem) + util_dynarray_append(&ctx->bs->tracked_semaphores, VkSemaphore, cur_sem); cur_sem = buffer_commit_single(screen, res, NULL, 0, (uint64_t)base_page * ZINK_SPARSE_BUFFER_PAGE_SIZE, (uint64_t)(end_va_page - base_page) * ZINK_SPARSE_BUFFER_PAGE_SIZE, false, cur_sem); @@ -1072,6 +1076,8 @@ zink_bo_commit(struct zink_context *ctx, struct zink_resource *res, unsigned lev } if (level >= res->sparse.imageMipTailFirstLod) { uint32_t offset = res->sparse.imageMipTailOffset; + if (cur_sem) + util_dynarray_append(&ctx->bs->tracked_semaphores, VkSemaphore, cur_sem); cur_sem = texture_commit_miptail(screen, res, backing[i]->bo, backing_start[i], offset, commit, cur_sem); if (cur_sem) res->obj->miptail_commits++; @@ -1126,6 +1132,8 @@ zink_bo_commit(struct zink_context *ctx, struct zink_resource *res, unsigned lev assert(res->obj->miptail_commits); res->obj->miptail_commits--; if (!res->obj->miptail_commits) { + if (cur_sem) + util_dynarray_append(&ctx->bs->tracked_semaphores, VkSemaphore, cur_sem); cur_sem = texture_commit_miptail(screen, res, NULL, 0, offset, commit, cur_sem); if (!cur_sem) ok = false; @@ -1138,6 +1146,8 @@ zink_bo_commit(struct zink_context *ctx, struct zink_resource *res, unsigned lev } } if (i == ARRAY_SIZE(ibind)) { + if (cur_sem) + util_dynarray_append(&ctx->bs->tracked_semaphores, VkSemaphore, cur_sem); cur_sem = texture_commit_single(screen, res, ibind, ARRAY_SIZE(ibind), commit, cur_sem); if (!cur_sem) { for (unsigned s = 0; s < i; s++) { @@ -1157,6 +1167,8 @@ zink_bo_commit(struct zink_context *ctx, struct zink_resource *res, unsigned lev } } if (commits_pending) { + if (cur_sem) + util_dynarray_append(&ctx->bs->tracked_semaphores, VkSemaphore, cur_sem); cur_sem = texture_commit_single(screen, res, ibind, i, commit, cur_sem); if (!cur_sem) { for (unsigned s = 0; s < i; s++) {