dzn: Swizzle SRV access to stencil
authorJesse Natalie <jenatali@microsoft.com>
Thu, 15 Dec 2022 22:05:13 +0000 (14:05 -0800)
committerMarge Bot <emma+marge@anholt.net>
Fri, 16 Dec 2022 18:40:47 +0000 (18:40 +0000)
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20346>

src/microsoft/vulkan/dzn_cmd_buffer.c
src/microsoft/vulkan/dzn_image.c

index 0aaf645..2ce7dc0 100644 (file)
@@ -1842,18 +1842,6 @@ dzn_cmd_buffer_blit_prepare_src_view(struct dzn_cmd_buffer *cmdbuf,
       },
    };
 
-   if (aspect == VK_IMAGE_ASPECT_STENCIL_BIT) {
-      iview_info.components.r = VK_COMPONENT_SWIZZLE_G;
-      iview_info.components.g = VK_COMPONENT_SWIZZLE_G;
-      iview_info.components.b = VK_COMPONENT_SWIZZLE_G;
-      iview_info.components.a = VK_COMPONENT_SWIZZLE_G;
-   } else if (aspect == VK_IMAGE_ASPECT_STENCIL_BIT) {
-      iview_info.components.r = VK_COMPONENT_SWIZZLE_R;
-      iview_info.components.g = VK_COMPONENT_SWIZZLE_R;
-      iview_info.components.b = VK_COMPONENT_SWIZZLE_R;
-      iview_info.components.a = VK_COMPONENT_SWIZZLE_R;
-   }
-
    switch (img->vk.image_type) {
    case VK_IMAGE_TYPE_1D:
       iview_info.viewType = img->vk.array_layers > 1 ?
index 289060a..6ca6ef7 100644 (file)
@@ -932,6 +932,14 @@ dzn_image_view_prepare_srv_desc(struct dzn_image_view *iview)
 
       for (uint32_t i = 0; i < ARRAY_SIZE(swz); i++)
          swz[i] = bgra4_remap[swz[i]];
+   } else if (iview->vk.aspects & VK_IMAGE_ASPECT_STENCIL_BIT) {
+      /* D3D puts stencil in G, not R. Requests for R should be routed to G and vice versa. */
+      for (uint32_t i = 0; i < ARRAY_SIZE(swz); i++) {
+         if (swz[i] == D3D12_SHADER_COMPONENT_MAPPING_FROM_MEMORY_COMPONENT_0)
+            swz[i] = D3D12_SHADER_COMPONENT_MAPPING_FROM_MEMORY_COMPONENT_1;
+         else if (swz[i] == D3D12_SHADER_COMPONENT_MAPPING_FROM_MEMORY_COMPONENT_1)
+            swz[i] = D3D12_SHADER_COMPONENT_MAPPING_FROM_MEMORY_COMPONENT_0;
+      }
    }
 
    iview->srv_desc.Shader4ComponentMapping =