Mesa (main): zink: handle map failures more effectively

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Aug 17 21:13:58 UTC 2021


Module: Mesa
Branch: main
Commit: 403acd299f80c36f48f38bfffe079d21b2c61417
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=403acd299f80c36f48f38bfffe079d21b2c61417

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date:   Fri Jul 30 10:28:32 2021 -0400

zink: handle map failures more effectively

the transfer object needs to be destroyed

Reviewed-by: Dave Airlie <airlied at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12422>

---

 src/gallium/drivers/zink/zink_resource.c | 23 ++++++++++++++++-------
 1 file changed, 16 insertions(+), 7 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_resource.c b/src/gallium/drivers/zink/zink_resource.c
index 23fd797126f..13dc331069c 100644
--- a/src/gallium/drivers/zink/zink_resource.c
+++ b/src/gallium/drivers/zink/zink_resource.c
@@ -1156,7 +1156,7 @@ zink_buffer_map(struct pipe_context *pctx,
          trans->offset = box->x % screen->info.props.limits.minMemoryMapAlignment;
          trans->staging_res = pipe_buffer_create(&screen->base, PIPE_BIND_LINEAR, PIPE_USAGE_STAGING, box->width + trans->offset);
          if (!trans->staging_res)
-            return NULL;
+            goto fail;
          struct zink_resource *staging_res = zink_resource(trans->staging_res);
          zink_copy_buffer(ctx, NULL, staging_res, res, trans->offset, box->x, box->width);
          res = staging_res;
@@ -1184,7 +1184,7 @@ zink_buffer_map(struct pipe_context *pctx,
       }
       ptr = map_resource(screen, res);
       if (!ptr)
-         return NULL;
+         goto fail;
       ptr = ((uint8_t *)ptr) + box->x;
    }
 
@@ -1203,7 +1203,7 @@ zink_buffer_map(struct pipe_context *pctx,
       VkMappedMemoryRange range = zink_resource_init_mem_range(screen, res->obj, offset, size);
       if (vkInvalidateMappedMemoryRanges(screen->dev, 1, &range) != VK_SUCCESS) {
          zink_bo_unmap(screen, res->obj->bo);
-         return NULL;
+         goto fail;
       }
    }
    trans->base.b.usage = usage;
@@ -1215,6 +1215,10 @@ zink_buffer_map(struct pipe_context *pctx,
 success:
    *transfer = &trans->base.b;
    return ptr;
+
+fail:
+   destroy_transfer(ctx, trans);
+   return NULL;
 }
 
 static void *
@@ -1265,7 +1269,7 @@ zink_image_map(struct pipe_context *pctx,
 
       trans->staging_res = zink_resource_create(pctx->screen, &templ);
       if (!trans->staging_res)
-         return NULL;
+         goto fail;
 
       struct zink_resource *staging_res = zink_resource(trans->staging_res);
 
@@ -1279,13 +1283,11 @@ zink_image_map(struct pipe_context *pctx,
       }
 
       ptr = map_resource(screen, staging_res);
-      if (!ptr)
-         return NULL;
    } else {
       assert(!res->optimal_tiling);
       ptr = map_resource(screen, res);
       if (!ptr)
-         return NULL;
+         goto fail;
       if (zink_resource_has_usage(res)) {
          if (usage & PIPE_MAP_WRITE)
             zink_fence_wait(pctx);
@@ -1318,6 +1320,9 @@ zink_image_map(struct pipe_context *pctx,
       }
       ptr = ((uint8_t *)ptr) + offset;
    }
+   if (!ptr)
+      goto fail;
+
    if (sizeof(void*) == 4)
       trans->base.b.usage |= ZINK_MAP_TEMPORARY;
    if ((usage & PIPE_MAP_PERSISTENT) && !(usage & PIPE_MAP_COHERENT))
@@ -1325,6 +1330,10 @@ zink_image_map(struct pipe_context *pctx,
 
    *transfer = &trans->base.b;
    return ptr;
+
+fail:
+   destroy_transfer(ctx, trans);
+   return NULL;
 }
 
 static void



More information about the mesa-commit mailing list