diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c index ba35dcda..9b85e1a9 100644 --- a/libs/vkd3d/command.c +++ b/libs/vkd3d/command.c @@ -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)) diff --git a/libs/vkd3d/resource.c b/libs/vkd3d/resource.c index 249e2702..e8145755 100644 --- a/libs/vkd3d/resource.c +++ b/libs/vkd3d/resource.c @@ -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) { diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h index b0616c5e..5564e3c9 100644 --- a/libs/vkd3d/vkd3d_private.h +++ b/libs/vkd3d/vkd3d_private.h @@ -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;