[PATCH vkd3d 2/2] vkd3d: Handle plane slice for texture views.

Conor McCarthy cmccarthy at codeweavers.com
Thu Jan 13 22:56:59 CST 2022


vk_image_aspect_flags_from_d3d12_plane_slice() is based on a
vkd3d-proton implementation by Philip Rebohle.

Signed-off-by: Conor McCarthy <cmccarthy at codeweavers.com>
---
 libs/vkd3d/resource.c      | 42 +++++++++++++++++++++++++++++++-------
 libs/vkd3d/vkd3d_private.h |  1 +
 2 files changed, 36 insertions(+), 7 deletions(-)

diff --git a/libs/vkd3d/resource.c b/libs/vkd3d/resource.c
index 2ac7ad95..5bf46896 100644
--- a/libs/vkd3d/resource.c
+++ b/libs/vkd3d/resource.c
@@ -2441,6 +2441,7 @@ static bool init_default_texture_view_desc(struct vkd3d_texture_view_desc *desc,
     desc->miplevel_count = 1;
     desc->layer_idx = 0;
     desc->layer_count = d3d12_resource_desc_get_layer_count(&resource->desc);
+    desc->vk_image_aspect = desc->format->vk_aspect_mask;
 
     switch (resource->desc.Dimension)
     {
@@ -2524,7 +2525,7 @@ bool vkd3d_create_texture_view(struct d3d12_device *device, VkImage vk_image,
     vkd3d_set_view_swizzle_for_format(&view_desc.components, format, desc->allowed_swizzle);
     if (desc->allowed_swizzle)
         vk_component_mapping_compose(&view_desc.components, &desc->components);
-    view_desc.subresourceRange.aspectMask = format->vk_aspect_mask;
+    view_desc.subresourceRange.aspectMask = desc->vk_image_aspect;
     view_desc.subresourceRange.baseMipLevel = desc->miplevel_idx;
     view_desc.subresourceRange.levelCount = desc->miplevel_count;
     view_desc.subresourceRange.baseArrayLayer = desc->layer_idx;
@@ -2692,6 +2693,27 @@ static void vkd3d_create_buffer_srv(struct d3d12_desc *descriptor,
     descriptor->u.view = view;
 }
 
+static VkImageAspectFlags vk_image_aspect_flags_from_d3d12_plane_slice(const struct vkd3d_format *format,
+        unsigned int plane_slice)
+{
+    VkImageAspectFlags aspect_flags = format->vk_aspect_mask;
+    unsigned int i;
+
+    /* For all formats we currently handle, the n-th aspect bit in Vulkan
+     * corresponds to the n-th plane in D3D12, so isolate the respective
+     * bit in the aspect flags. */
+    for (i = 0; i < plane_slice; i++)
+        aspect_flags &= aspect_flags - 1;
+
+    if (!aspect_flags)
+    {
+        WARN("Invalid plane slice %u for format %#x.\n", plane_slice, format->vk_format);
+        aspect_flags = format->vk_aspect_mask;
+    }
+
+    return aspect_flags & -aspect_flags;
+}
+
 void d3d12_desc_create_srv(struct d3d12_desc *descriptor,
         struct d3d12_device *device, struct d3d12_resource *resource,
         const D3D12_SHADER_RESOURCE_VIEW_DESC *desc)
@@ -2734,7 +2756,8 @@ void d3d12_desc_create_srv(struct d3d12_desc *descriptor,
                 vkd3d_desc.miplevel_idx = desc->u.Texture2D.MostDetailedMip;
                 vkd3d_desc.miplevel_count = desc->u.Texture2D.MipLevels;
                 if (desc->u.Texture2D.PlaneSlice)
-                    FIXME("Ignoring plane slice %u.\n", desc->u.Texture2D.PlaneSlice);
+                    vkd3d_desc.vk_image_aspect = vk_image_aspect_flags_from_d3d12_plane_slice(resource->format,
+                            desc->u.Texture2D.PlaneSlice);
                 if (desc->u.Texture2D.ResourceMinLODClamp)
                     FIXME("Unhandled min LOD clamp %.8e.\n", desc->u.Texture2D.ResourceMinLODClamp);
                 break;
@@ -2745,7 +2768,8 @@ void d3d12_desc_create_srv(struct d3d12_desc *descriptor,
                 vkd3d_desc.layer_idx = desc->u.Texture2DArray.FirstArraySlice;
                 vkd3d_desc.layer_count = desc->u.Texture2DArray.ArraySize;
                 if (desc->u.Texture2DArray.PlaneSlice)
-                    FIXME("Ignoring plane slice %u.\n", desc->u.Texture2DArray.PlaneSlice);
+                    vkd3d_desc.vk_image_aspect = vk_image_aspect_flags_from_d3d12_plane_slice(resource->format,
+                            desc->u.Texture2D.PlaneSlice);
                 if (desc->u.Texture2DArray.ResourceMinLODClamp)
                     FIXME("Unhandled min LOD clamp %.8e.\n", desc->u.Texture2DArray.ResourceMinLODClamp);
                 vkd3d_texture_view_desc_normalise(&vkd3d_desc, &resource->desc);
@@ -2942,7 +2966,8 @@ static void vkd3d_create_texture_uav(struct d3d12_desc *descriptor,
             case D3D12_UAV_DIMENSION_TEXTURE2D:
                 vkd3d_desc.miplevel_idx = desc->u.Texture2D.MipSlice;
                 if (desc->u.Texture2D.PlaneSlice)
-                    FIXME("Ignoring plane slice %u.\n", desc->u.Texture2D.PlaneSlice);
+                    vkd3d_desc.vk_image_aspect = vk_image_aspect_flags_from_d3d12_plane_slice(resource->format,
+                            desc->u.Texture2D.PlaneSlice);
                 break;
             case D3D12_UAV_DIMENSION_TEXTURE2DARRAY:
                 vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
@@ -2950,7 +2975,8 @@ static void vkd3d_create_texture_uav(struct d3d12_desc *descriptor,
                 vkd3d_desc.layer_idx = desc->u.Texture2DArray.FirstArraySlice;
                 vkd3d_desc.layer_count = desc->u.Texture2DArray.ArraySize;
                 if (desc->u.Texture2DArray.PlaneSlice)
-                    FIXME("Ignoring plane slice %u.\n", desc->u.Texture2DArray.PlaneSlice);
+                    vkd3d_desc.vk_image_aspect = vk_image_aspect_flags_from_d3d12_plane_slice(resource->format,
+                            desc->u.Texture2D.PlaneSlice);
                 vkd3d_texture_view_desc_normalise(&vkd3d_desc, &resource->desc);
                 break;
             case D3D12_UAV_DIMENSION_TEXTURE3D:
@@ -3193,7 +3219,8 @@ void d3d12_rtv_desc_create_rtv(struct d3d12_rtv_desc *rtv_desc, struct d3d12_dev
             case D3D12_RTV_DIMENSION_TEXTURE2D:
                 vkd3d_desc.miplevel_idx = desc->u.Texture2D.MipSlice;
                 if (desc->u.Texture2D.PlaneSlice)
-                    FIXME("Ignoring plane slice %u.\n", desc->u.Texture2D.PlaneSlice);
+                    vkd3d_desc.vk_image_aspect = vk_image_aspect_flags_from_d3d12_plane_slice(resource->format,
+                            desc->u.Texture2D.PlaneSlice);
                 break;
             case D3D12_RTV_DIMENSION_TEXTURE2DARRAY:
                 vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
@@ -3201,7 +3228,8 @@ void d3d12_rtv_desc_create_rtv(struct d3d12_rtv_desc *rtv_desc, struct d3d12_dev
                 vkd3d_desc.layer_idx = desc->u.Texture2DArray.FirstArraySlice;
                 vkd3d_desc.layer_count = desc->u.Texture2DArray.ArraySize;
                 if (desc->u.Texture2DArray.PlaneSlice)
-                    FIXME("Ignoring plane slice %u.\n", desc->u.Texture2DArray.PlaneSlice);
+                    vkd3d_desc.vk_image_aspect = vk_image_aspect_flags_from_d3d12_plane_slice(resource->format,
+                            desc->u.Texture2D.PlaneSlice);
                 vkd3d_texture_view_desc_normalise(&vkd3d_desc, &resource->desc);
                 break;
             case D3D12_RTV_DIMENSION_TEXTURE2DMS:
diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h
index b1291804..612cc56e 100644
--- a/libs/vkd3d/vkd3d_private.h
+++ b/libs/vkd3d/vkd3d_private.h
@@ -532,6 +532,7 @@ struct vkd3d_texture_view_desc
     unsigned int miplevel_count;
     unsigned int layer_idx;
     unsigned int layer_count;
+    VkImageAspectFlags vk_image_aspect;
     VkComponentMapping components;
     bool allowed_swizzle;
 };
-- 
2.34.1




More information about the wine-devel mailing list