diff --git a/libs/vkd3d/resource.c b/libs/vkd3d/resource.c index 8f71fa58..dfa1db29 100644 --- a/libs/vkd3d/resource.c +++ b/libs/vkd3d/resource.c @@ -565,6 +565,9 @@ static HRESULT vkd3d_create_image(struct d3d12_device *device, } else resource->common_layout = vk_common_image_layout_from_d3d12_desc(desc); + + if (desc->Flags & D3D12_RESOURCE_FLAG_ALLOW_SIMULTANEOUS_ACCESS) + resource->flags |= VKD3D_RESOURCE_SIMULTANEOUS_ACCESS; } if ((vr = VK_CALL(vkCreateImage(device->vk_device, &image_info, NULL, vk_image))) < 0) diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h index 4f4a0612..159b59d6 100644 --- a/libs/vkd3d/vkd3d_private.h +++ b/libs/vkd3d/vkd3d_private.h @@ -734,6 +734,7 @@ enum vkd3d_resource_flag VKD3D_RESOURCE_LINEAR_TILING = (1u << 4), VKD3D_RESOURCE_EXTERNAL = (1u << 5), VKD3D_RESOURCE_ACCELERATION_STRUCTURE = (1u << 6), + VKD3D_RESOURCE_SIMULTANEOUS_ACCESS = (1u << 7), }; struct d3d12_sparse_image_region @@ -836,7 +837,8 @@ static inline bool d3d12_resource_is_texture(const struct d3d12_resource *resour static inline VkImageLayout d3d12_resource_pick_layout(const struct d3d12_resource *resource, VkImageLayout layout) { - return resource->flags & VKD3D_RESOURCE_LINEAR_TILING ? VK_IMAGE_LAYOUT_GENERAL : layout; + return resource->flags & (VKD3D_RESOURCE_LINEAR_TILING | VKD3D_RESOURCE_SIMULTANEOUS_ACCESS) ? + resource->common_layout : layout; } LONG64 vkd3d_allocate_cookie();