Module: Mesa Branch: main Commit: 9dbf1ba21daa551a4c8dd8384858c9553e38ac35 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=9dbf1ba21daa551a4c8dd8384858c9553e38ac35
Author: Mike Blumenkrantz <[email protected]> Date: Wed Sep 15 15:10:07 2021 -0400 zink: add ZINK_BIND_TRANSIENT this is used to create lazily allocated images for use as transient renderpass attachments Reviewed-by: Adam Jackson <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12934> --- src/gallium/drivers/zink/zink_resource.c | 32 ++++++++++++++++++++------------ src/gallium/drivers/zink/zink_resource.h | 1 + 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/src/gallium/drivers/zink/zink_resource.c b/src/gallium/drivers/zink/zink_resource.c index eff6315a29d..ff9420f22ff 100644 --- a/src/gallium/drivers/zink/zink_resource.c +++ b/src/gallium/drivers/zink/zink_resource.c @@ -209,18 +209,22 @@ static VkImageUsageFlags get_image_usage_for_feats(struct zink_screen *screen, VkFormatFeatureFlags feats, const struct pipe_resource *templ, unsigned bind) { VkImageUsageFlags usage = 0; - /* sadly, gallium doesn't let us know if it'll ever need this, so we have to assume */ - if (feats & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) - usage |= VK_IMAGE_USAGE_TRANSFER_SRC_BIT; - if (feats & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) - usage |= VK_IMAGE_USAGE_TRANSFER_DST_BIT; - if (feats & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT && (bind & (PIPE_BIND_LINEAR | PIPE_BIND_SHARED)) != (PIPE_BIND_LINEAR | PIPE_BIND_SHARED)) - usage |= VK_IMAGE_USAGE_SAMPLED_BIT; - - if ((templ->nr_samples <= 1 || screen->info.feats.features.shaderStorageImageMultisample) && - (bind & PIPE_BIND_SHADER_IMAGE)) { - if (feats & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) - usage |= VK_IMAGE_USAGE_STORAGE_BIT; + if (bind & ZINK_BIND_TRANSIENT) + usage |= VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT; + else { + /* sadly, gallium doesn't let us know if it'll ever need this, so we have to assume */ + if (feats & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) + usage |= VK_IMAGE_USAGE_TRANSFER_SRC_BIT; + if (feats & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) + usage |= VK_IMAGE_USAGE_TRANSFER_DST_BIT; + if (feats & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT && (bind & (PIPE_BIND_LINEAR | PIPE_BIND_SHARED)) != (PIPE_BIND_LINEAR | PIPE_BIND_SHARED)) + usage |= VK_IMAGE_USAGE_SAMPLED_BIT; + + if ((templ->nr_samples <= 1 || screen->info.feats.features.shaderStorageImageMultisample) && + (bind & PIPE_BIND_SHADER_IMAGE)) { + if (feats & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) + usage |= VK_IMAGE_USAGE_STORAGE_BIT; + } } if (bind & PIPE_BIND_RENDER_TARGET) { @@ -250,6 +254,7 @@ get_image_usage_for_feats(struct zink_screen *screen, VkFormatFeatureFlags feats if (bind & PIPE_BIND_STREAM_OUTPUT) usage |= VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT; + return usage; } @@ -598,6 +603,9 @@ resource_object_create(struct zink_screen *screen, const struct pipe_resource *t templ->usage == PIPE_USAGE_STAGING) flags |= VK_MEMORY_PROPERTY_HOST_CACHED_BIT; + if (templ->bind & ZINK_BIND_TRANSIENT) + flags |= VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT; + VkMemoryAllocateInfo mai; enum zink_alloc_flag aflags = templ->flags & PIPE_RESOURCE_FLAG_SPARSE ? ZINK_ALLOC_SPARSE : 0; mai.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; diff --git a/src/gallium/drivers/zink/zink_resource.h b/src/gallium/drivers/zink/zink_resource.h index 98520404fb0..3b7181b47d6 100644 --- a/src/gallium/drivers/zink/zink_resource.h +++ b/src/gallium/drivers/zink/zink_resource.h @@ -43,6 +43,7 @@ struct zink_bo; #include <vulkan/vulkan.h> #define ZINK_MAP_TEMPORARY (PIPE_MAP_DRV_PRV << 0) +#define ZINK_BIND_TRANSIENT (1 << 30) //transient fb attachment struct mem_key { unsigned seen_count;
