[PATCH vkd3d] vkd3d: Use vkCmdResolveImage() to resolve typeless resources if possible.

Józef Kucia joseph.kucia at gmail.com
Wed Feb 27 11:03:20 CST 2019


From: Józef Kucia <jkucia at codeweavers.com>

Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
 libs/vkd3d/command.c | 23 +++++++++++++++--------
 1 file changed, 15 insertions(+), 8 deletions(-)

diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c
index 5b11c3c43d44..4999280a2afc 100644
--- a/libs/vkd3d/command.c
+++ b/libs/vkd3d/command.c
@@ -2855,8 +2855,8 @@ static void STDMETHODCALLTYPE d3d12_command_list_ResolveSubresource(ID3D12Graphi
         ID3D12Resource *src, UINT src_sub_resource_idx, DXGI_FORMAT format)
 {
     struct d3d12_command_list *list = impl_from_ID3D12GraphicsCommandList(iface);
+    const struct vkd3d_format *src_format, *dst_format, *vk_format;
     struct d3d12_resource *dst_resource, *src_resource;
-    const struct vkd3d_format *src_format, *dst_format;
     const struct vkd3d_vk_device_procs *vk_procs;
     VkImageResolve vk_image_resolve;
 
@@ -2876,13 +2876,6 @@ static void STDMETHODCALLTYPE d3d12_command_list_ResolveSubresource(ID3D12Graphi
 
     d3d12_command_list_end_current_render_pass(list);
 
-    if (dxgi_format_is_typeless(dst_resource->desc.Format)
-            || dxgi_format_is_typeless(src_resource->desc.Format))
-    {
-        FIXME("Not implemented for typeless resources.\n");
-        return;
-    }
-
     if (!(dst_format = vkd3d_format_from_d3d12_resource_desc(&dst_resource->desc, DXGI_FORMAT_UNKNOWN)))
     {
         WARN("Invalid format %#x.\n", dst_resource->desc.Format);
@@ -2894,6 +2887,20 @@ static void STDMETHODCALLTYPE d3d12_command_list_ResolveSubresource(ID3D12Graphi
         return;
     }
 
+    if (dxgi_format_is_typeless(dst_resource->desc.Format) || dxgi_format_is_typeless(src_resource->desc.Format))
+    {
+        if (!(vk_format = vkd3d_format_from_d3d12_resource_desc(&dst_resource->desc, format)))
+        {
+            WARN("Invalid format %#x.\n", format);
+            return;
+        }
+        if (dst_format->vk_format != src_format->vk_format || dst_format->vk_format != vk_format->vk_format)
+        {
+            FIXME("Not implemented for typeless resources.\n");
+            return;
+        }
+    }
+
     /* Resolve of depth/stencil images is not supported in Vulkan. */
     if ((dst_format->vk_aspect_mask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT))
             || (src_format->vk_aspect_mask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)))
-- 
2.19.2




More information about the wine-devel mailing list