From df6ab67e99269eff56f0f43f27b6cc31bdaac49f Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Wed, 3 Feb 2021 15:35:49 -0500 Subject: [PATCH] zink: populate images with u_blitter if transfer_dst isn't available this seems incredibly unlikely, but now it's handled Reviewed-by: Dave Airlie Part-of: --- src/gallium/drivers/zink/zink_resource.c | 14 ++++++++++++-- src/gallium/drivers/zink/zink_resource.h | 1 + 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/gallium/drivers/zink/zink_resource.c b/src/gallium/drivers/zink/zink_resource.c index 377393e9166..5a7b6c35032 100644 --- a/src/gallium/drivers/zink/zink_resource.c +++ b/src/gallium/drivers/zink/zink_resource.c @@ -32,6 +32,7 @@ #include "vulkan/wsi/wsi_common.h" #include "util/slab.h" +#include "util/u_blitter.h" #include "util/u_debug.h" #include "util/format/u_format.h" #include "util/u_transfer_helper.h" @@ -383,6 +384,7 @@ resource_object_create(struct zink_screen *screen, const struct pipe_resource *t else flags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT; obj->is_buffer = true; + obj->transfer_dst = true; } else { VkImageCreateInfo ici = create_ici(screen, templ, templ->bind); VkExternalMemoryImageCreateInfo emici = {}; @@ -425,6 +427,9 @@ resource_object_create(struct zink_screen *screen, const struct pipe_resource *t FREE(obj); return NULL; } + if (ici.usage & VK_IMAGE_USAGE_TRANSFER_DST_BIT) + obj->transfer_dst = true; + struct wsi_image_create_info image_wsi_info = { VK_STRUCTURE_TYPE_WSI_IMAGE_CREATE_INFO_MESA, @@ -748,8 +753,13 @@ zink_transfer_copy_bufimage(struct zink_context *ctx, if (buf2img) box.x = src->obj->offset + trans->offset; - zink_copy_image_buffer(ctx, NULL, dst, src, trans->base.b.level, buf2img ? x : dst->obj->offset, - box.y, box.z, trans->base.b.level, &box, trans->base.b.usage); + if (dst->obj->transfer_dst) + zink_copy_image_buffer(ctx, NULL, dst, src, trans->base.b.level, buf2img ? x : dst->obj->offset, + box.y, box.z, trans->base.b.level, &box, trans->base.b.usage); + else + util_blitter_copy_texture(ctx->blitter, &dst->base.b, trans->base.b.level, + x, box.y, box.z, &src->base.b, + 0, &box); } bool diff --git a/src/gallium/drivers/zink/zink_resource.h b/src/gallium/drivers/zink/zink_resource.h index d2caf0a2f3e..41dae5c431f 100644 --- a/src/gallium/drivers/zink/zink_resource.h +++ b/src/gallium/drivers/zink/zink_resource.h @@ -62,6 +62,7 @@ struct zink_resource_object { VkBuffer sbuffer; bool storage_init; //layout was set for image + bool transfer_dst; VkDeviceMemory mem; uint32_t mem_hash;