vkd3d: Use VkImageViewCreateInfo correctly.

For EXTENDED_USAGE, we still need to restrict image usage when creating
concrete views.
Use VkImageViewUsageCreateInfo to restrict usage flags to the kind of
view we're creating.

Signed-off-by: Hans-Kristian Arntzen <post@arntzen-software.no>
This commit is contained in:
Hans-Kristian Arntzen 2022-03-24 14:37:51 +01:00
parent cf65a78570
commit 1b5f7e8fc3
3 changed files with 19 additions and 0 deletions

View File

@ -5986,6 +5986,8 @@ static void d3d12_command_list_copy_image(struct d3d12_command_list *list,
dst_view_desc.layer_count = region->dstSubresource.layerCount;
/* A render pass must cover all depth-stencil aspects. */
dst_view_desc.aspect_mask = dst_resource->format->vk_aspect_mask;
dst_view_desc.image_usage = (pipeline_key.dst_aspect_mask & VK_IMAGE_ASPECT_COLOR_BIT) ?
VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT : VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
dst_view_desc.allowed_swizzle = false;
memset(&src_view_desc, 0, sizeof(src_view_desc));
@ -5997,6 +5999,7 @@ static void d3d12_command_list_copy_image(struct d3d12_command_list *list,
src_view_desc.layer_idx = region->srcSubresource.baseArrayLayer;
src_view_desc.layer_count = region->srcSubresource.layerCount;
src_view_desc.aspect_mask = region->srcSubresource.aspectMask;
src_view_desc.image_usage = VK_IMAGE_USAGE_SAMPLED_BIT;
src_view_desc.allowed_swizzle = false;
if (!vkd3d_create_texture_view(list->device, &dst_view_desc, &dst_view) ||
@ -8523,6 +8526,7 @@ static void STDMETHODCALLTYPE d3d12_command_list_ClearUnorderedAccessViewUint(d3
view_desc.layer_idx = base_view->info.texture.layer_idx;
view_desc.layer_count = base_view->info.texture.layer_count;
view_desc.aspect_mask = view_desc.format->vk_aspect_mask;
view_desc.image_usage = VK_IMAGE_USAGE_STORAGE_BIT;
view_desc.allowed_swizzle = false;
if (!vkd3d_create_texture_view(list->device, &view_desc, &args.u.view))

View File

@ -841,6 +841,7 @@ static uint32_t vkd3d_view_entry_hash(const void *key)
hash = hash_combine(hash, k->u.texture.components.g);
hash = hash_combine(hash, k->u.texture.components.b);
hash = hash_combine(hash, k->u.texture.components.a);
hash = hash_combine(hash, k->u.texture.image_usage);
hash = hash_combine(hash, k->u.texture.allowed_swizzle);
break;
@ -901,6 +902,7 @@ static bool vkd3d_view_entry_compare(const void *key, const struct hash_map_entr
k->u.texture.components.g == e->key.u.texture.components.g &&
k->u.texture.components.b == e->key.u.texture.components.b &&
k->u.texture.components.a == e->key.u.texture.components.a &&
k->u.texture.image_usage == e->key.u.texture.image_usage &&
k->u.texture.allowed_swizzle == e->key.u.texture.allowed_swizzle;
case VKD3D_VIEW_TYPE_SAMPLER:
@ -3649,6 +3651,7 @@ static bool init_default_texture_view_desc(struct vkd3d_texture_view_desc *desc,
desc->miplevel_clamp = 0.0f;
desc->layer_idx = 0;
desc->layer_count = d3d12_resource_desc_get_layer_count(&resource->desc);
desc->image_usage = 0;
switch (resource->desc.Dimension)
{
@ -3683,6 +3686,7 @@ static bool init_default_texture_view_desc(struct vkd3d_texture_view_desc *desc,
bool vkd3d_create_texture_view(struct d3d12_device *device, const struct vkd3d_texture_view_desc *desc, struct vkd3d_view **view)
{
const struct vkd3d_vk_device_procs *vk_procs = &device->vk_procs;
VkImageViewUsageCreateInfo image_usage_create_info;
const struct vkd3d_format *format = desc->format;
VkImageViewMinLodCreateInfoEXT min_lod_desc;
VkImageView vk_view = VK_NULL_HANDLE;
@ -3733,6 +3737,11 @@ bool vkd3d_create_texture_view(struct d3d12_device *device, const struct vkd3d_t
}
}
image_usage_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO;
image_usage_create_info.pNext = NULL;
image_usage_create_info.usage = desc->image_usage;
vk_prepend_struct(&view_desc, &image_usage_create_info);
if ((vr = VK_CALL(vkCreateImageView(device->vk_device, &view_desc, NULL, &vk_view))) < 0)
{
WARN("Failed to create Vulkan image view, vr %d.\n", vr);
@ -4230,6 +4239,7 @@ static void vkd3d_create_texture_srv(vkd3d_cpu_descriptor_va_t desc_va,
key.view_type = VKD3D_VIEW_TYPE_IMAGE;
key.u.texture.miplevel_count = VK_REMAINING_MIP_LEVELS;
key.u.texture.allowed_swizzle = true;
key.u.texture.image_usage = VK_IMAGE_USAGE_SAMPLED_BIT;
if (desc)
{
@ -4624,6 +4634,8 @@ static void vkd3d_create_texture_uav(vkd3d_cpu_descriptor_va_t desc_va,
if (!init_default_texture_view_desc(&key.u.texture, resource, desc ? desc->Format : 0))
return;
key.u.texture.image_usage = VK_IMAGE_USAGE_STORAGE_BIT;
if (vkd3d_format_is_compressed(key.u.texture.format))
{
WARN("UAVs cannot be created for compressed formats.\n");
@ -5046,6 +5058,7 @@ void d3d12_rtv_desc_create_rtv(struct d3d12_rtv_desc *rtv_desc, struct d3d12_dev
}
key.view_type = VKD3D_VIEW_TYPE_IMAGE;
key.u.texture.image_usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
if (desc)
{
@ -5151,6 +5164,7 @@ void d3d12_rtv_desc_create_dsv(struct d3d12_rtv_desc *dsv_desc, struct d3d12_dev
}
key.view_type = VKD3D_VIEW_TYPE_IMAGE;
key.u.texture.image_usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
if (desc)
{

View File

@ -986,6 +986,7 @@ struct vkd3d_texture_view_desc
VkImage image;
VkImageViewType view_type;
VkImageAspectFlags aspect_mask;
VkImageUsageFlags image_usage;
const struct vkd3d_format *format;
unsigned int miplevel_idx;
unsigned int miplevel_count;