zink: add ZINK_BIND_TRANSIENT
this is used to create lazily allocated images for use as transient renderpass attachments Reviewed-by: Adam Jackson <ajax@redhat.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12934>
This commit is contained in:
parent
de3931cda7
commit
9dbf1ba21d
|
@ -209,18 +209,22 @@ static VkImageUsageFlags
|
||||||
get_image_usage_for_feats(struct zink_screen *screen, VkFormatFeatureFlags feats, const struct pipe_resource *templ, unsigned bind)
|
get_image_usage_for_feats(struct zink_screen *screen, VkFormatFeatureFlags feats, const struct pipe_resource *templ, unsigned bind)
|
||||||
{
|
{
|
||||||
VkImageUsageFlags usage = 0;
|
VkImageUsageFlags usage = 0;
|
||||||
/* sadly, gallium doesn't let us know if it'll ever need this, so we have to assume */
|
if (bind & ZINK_BIND_TRANSIENT)
|
||||||
if (feats & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT)
|
usage |= VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT;
|
||||||
usage |= VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
|
else {
|
||||||
if (feats & VK_FORMAT_FEATURE_TRANSFER_DST_BIT)
|
/* sadly, gallium doesn't let us know if it'll ever need this, so we have to assume */
|
||||||
usage |= VK_IMAGE_USAGE_TRANSFER_DST_BIT;
|
if (feats & VK_FORMAT_FEATURE_TRANSFER_SRC_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_TRANSFER_SRC_BIT;
|
||||||
usage |= VK_IMAGE_USAGE_SAMPLED_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) &&
|
if ((templ->nr_samples <= 1 || screen->info.feats.features.shaderStorageImageMultisample) &&
|
||||||
(bind & PIPE_BIND_SHADER_IMAGE)) {
|
(bind & PIPE_BIND_SHADER_IMAGE)) {
|
||||||
if (feats & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT)
|
if (feats & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT)
|
||||||
usage |= VK_IMAGE_USAGE_STORAGE_BIT;
|
usage |= VK_IMAGE_USAGE_STORAGE_BIT;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bind & PIPE_BIND_RENDER_TARGET) {
|
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)
|
if (bind & PIPE_BIND_STREAM_OUTPUT)
|
||||||
usage |= VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT;
|
usage |= VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT;
|
||||||
|
|
||||||
return usage;
|
return usage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -598,6 +603,9 @@ resource_object_create(struct zink_screen *screen, const struct pipe_resource *t
|
||||||
templ->usage == PIPE_USAGE_STAGING)
|
templ->usage == PIPE_USAGE_STAGING)
|
||||||
flags |= VK_MEMORY_PROPERTY_HOST_CACHED_BIT;
|
flags |= VK_MEMORY_PROPERTY_HOST_CACHED_BIT;
|
||||||
|
|
||||||
|
if (templ->bind & ZINK_BIND_TRANSIENT)
|
||||||
|
flags |= VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT;
|
||||||
|
|
||||||
VkMemoryAllocateInfo mai;
|
VkMemoryAllocateInfo mai;
|
||||||
enum zink_alloc_flag aflags = templ->flags & PIPE_RESOURCE_FLAG_SPARSE ? ZINK_ALLOC_SPARSE : 0;
|
enum zink_alloc_flag aflags = templ->flags & PIPE_RESOURCE_FLAG_SPARSE ? ZINK_ALLOC_SPARSE : 0;
|
||||||
mai.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
|
mai.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
|
||||||
|
|
|
@ -43,6 +43,7 @@ struct zink_bo;
|
||||||
#include <vulkan/vulkan.h>
|
#include <vulkan/vulkan.h>
|
||||||
|
|
||||||
#define ZINK_MAP_TEMPORARY (PIPE_MAP_DRV_PRV << 0)
|
#define ZINK_MAP_TEMPORARY (PIPE_MAP_DRV_PRV << 0)
|
||||||
|
#define ZINK_BIND_TRANSIENT (1 << 30) //transient fb attachment
|
||||||
|
|
||||||
struct mem_key {
|
struct mem_key {
|
||||||
unsigned seen_count;
|
unsigned seen_count;
|
||||||
|
|
Loading…
Reference in New Issue