Conor McCarthy : vkd3d: Normalise layer counts in vkd3d_create_texture_uav().

Alexandre Julliard julliard at winehq.org
Tue Oct 12 16:05:31 CDT 2021


Module: vkd3d
Branch: master
Commit: bec4f0a85ecd3ee6e1f7bbae5dd8545170507f20
URL:    https://source.winehq.org/git/vkd3d.git/?a=commit;h=bec4f0a85ecd3ee6e1f7bbae5dd8545170507f20

Author: Conor McCarthy <cmccarthy at codeweavers.com>
Date:   Tue Oct 12 18:31:10 2021 +0200

vkd3d: Normalise layer counts in vkd3d_create_texture_uav().

Passing UINT_MAX as layer count to Direct3D behaves similar to passing
VK_REMAINING_ARRAY_LAYERS to Vulkan. Since these have the same value,
everything usually works out even without normalisation. However, there are
some exceptions; for example, we calculate workgroup counts for UAV clears
from layer counts using vkd3d_compute_workgroup_count(), which doesn't handle
UINT_MAX. Normalising layer counts during view creation avoids having to
handle this issue in the rest of the code.

Signed-off-by: Conor McCarthy <cmccarthy at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 libs/vkd3d/resource.c | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/libs/vkd3d/resource.c b/libs/vkd3d/resource.c
index a51f579..854e73a 100644
--- a/libs/vkd3d/resource.c
+++ b/libs/vkd3d/resource.c
@@ -2477,6 +2477,27 @@ static bool init_default_texture_view_desc(struct vkd3d_texture_view_desc *desc,
     return true;
 }
 
+static void vkd3d_texture_view_desc_normalise(struct vkd3d_texture_view_desc *desc,
+        const D3D12_RESOURCE_DESC *resource_desc)
+{
+    unsigned int max_layer_count = resource_desc->DepthOrArraySize;
+
+    if (desc->layer_idx >= max_layer_count)
+    {
+        WARN("Layer index %u exceeds maximum available layer %u.\n", desc->layer_idx, max_layer_count - 1);
+        desc->layer_count = 1;
+        return;
+    }
+
+    max_layer_count -= desc->layer_idx;
+    if (desc->layer_count <= max_layer_count)
+        return;
+
+    if (desc->layer_count != UINT_MAX)
+        WARN("Layer count %u exceeds maximum %u.\n", desc->layer_count, max_layer_count);
+    desc->layer_count = max_layer_count;
+}
+
 bool vkd3d_create_texture_view(struct d3d12_device *device, VkImage vk_image,
         const struct vkd3d_texture_view_desc *desc, struct vkd3d_view **view)
 {
@@ -2920,6 +2941,7 @@ static void vkd3d_create_texture_uav(struct d3d12_desc *descriptor,
                 vkd3d_desc.layer_count = desc->u.Texture2DArray.ArraySize;
                 if (desc->u.Texture2DArray.PlaneSlice)
                     FIXME("Ignoring plane slice %u.\n", desc->u.Texture2DArray.PlaneSlice);
+                vkd3d_texture_view_desc_normalise(&vkd3d_desc, &resource->desc);
                 break;
             case D3D12_UAV_DIMENSION_TEXTURE3D:
                 vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_3D;




More information about the wine-cvs mailing list