[PATCH vkd3d 2/2] vkd3d: Handle depth/stencil planes in GetCopyableFootprints().

Conor McCarthy cmccarthy at codeweavers.com
Mon Dec 9 02:50:35 CST 2019


Signed-off-by: Conor McCarthy <cmccarthy at codeweavers.com>
---
 libs/vkd3d/device.c | 11 ++++++-----
 tests/d3d12.c       |  6 ++----
 2 files changed, 8 insertions(+), 9 deletions(-)

diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c
index 757d4ac..51c4553 100644
--- a/libs/vkd3d/device.c
+++ b/libs/vkd3d/device.c
@@ -3175,7 +3175,7 @@ static void STDMETHODCALLTYPE d3d12_device_GetCopyableFootprints(ID3D12Device *i
             = {DXGI_FORMAT_UNKNOWN, VK_FORMAT_UNDEFINED, 1, 1, 1, 1, 0};
 
     unsigned int i, sub_resource_idx, miplevel_idx, row_count, row_size, row_pitch;
-    unsigned int width, height, depth, array_size;
+    unsigned int width, height, depth, plane_count, sub_resources_per_plane;
     const struct vkd3d_format *format;
     uint64_t offset, size, total;
 
@@ -3209,10 +3209,11 @@ static void STDMETHODCALLTYPE d3d12_device_GetCopyableFootprints(ID3D12Device *i
         return;
     }
 
-    array_size = d3d12_resource_desc_get_layer_count(desc);
+    plane_count = (format->vk_aspect_mask & VK_IMAGE_ASPECT_STENCIL_BIT) ? 2 : 1;
+    sub_resources_per_plane = d3d12_resource_desc_get_sub_resource_count(desc);
 
-    if (first_sub_resource >= desc->MipLevels * array_size
-            || sub_resource_count > desc->MipLevels * array_size - first_sub_resource)
+    if (first_sub_resource >= sub_resources_per_plane * plane_count
+            || sub_resource_count > sub_resources_per_plane * plane_count - first_sub_resource)
     {
         WARN("Invalid sub-resource range %u-%u for resource.\n", first_sub_resource, sub_resource_count);
         return;
@@ -3222,7 +3223,7 @@ static void STDMETHODCALLTYPE d3d12_device_GetCopyableFootprints(ID3D12Device *i
     total = 0;
     for (i = 0; i < sub_resource_count; ++i)
     {
-        sub_resource_idx = first_sub_resource + i;
+        sub_resource_idx = (first_sub_resource + i) % sub_resources_per_plane;
         miplevel_idx = sub_resource_idx % desc->MipLevels;
         width = align(d3d12_resource_desc_get_width(desc, miplevel_idx), format->block_width);
         height = align(d3d12_resource_desc_get_height(desc, miplevel_idx), format->block_height);
diff --git a/tests/d3d12.c b/tests/d3d12.c
index 1e0e25f..c3521b7 100644
--- a/tests/d3d12.c
+++ b/tests/d3d12.c
@@ -18906,11 +18906,9 @@ static void test_get_copyable_footprints(void)
                 sub_resource_count *= resource_desc.DepthOrArraySize;
             if (resource_desc.Format == DXGI_FORMAT_D24_UNORM_S8_UINT)
             {
+                /* FIXME: we require D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL here for DS formats but windows doesn't. */
                 if (!vkd3d_test_platform_is_windows())
-                {
-                    skip("Depth/stencil planes are not supported.\n");
-                    continue;
-                }
+                    resource_desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL;
                 sub_resource_count *= 2;
             }
             assert(sub_resource_count <= ARRAY_SIZE(layouts));
-- 
2.24.0




More information about the wine-devel mailing list