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