dzn: Support separate depth/stencil resolves via blits
authorJesse Natalie <jenatali@microsoft.com>
Wed, 3 May 2023 19:46:17 +0000 (12:46 -0700)
committerMarge Bot <emma+marge@anholt.net>
Thu, 4 May 2023 03:10:56 +0000 (03:10 +0000)
In theory, ResolveSubresourceRegion should be able to resolve just
the depth or just the stencil. In practice, WARP had bugs, which
means that was never tested, so just do it via blits.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22836>

src/microsoft/vulkan/dzn_cmd_buffer.c
src/microsoft/vulkan/dzn_device.c

index d5e8934..1366193 100644 (file)
@@ -4563,7 +4563,8 @@ dzn_cmd_buffer_resolve_rendering_attachment_via_blit(struct dzn_cmd_buffer *cmdb
 static void
 dzn_cmd_buffer_resolve_rendering_attachment(struct dzn_cmd_buffer *cmdbuf,
                                             const struct dzn_rendering_attachment *att,
-                                            VkImageAspectFlagBits aspect)
+                                            VkImageAspectFlagBits aspect,
+                                            bool force_blit_resolve)
 {
    struct dzn_image_view *src = att->iview;
    struct dzn_image_view *dst = att->resolve.iview;
@@ -4602,7 +4603,8 @@ dzn_cmd_buffer_resolve_rendering_attachment(struct dzn_cmd_buffer *cmdbuf,
       dst_range.layerCount = 1;
    }
 
-   if (att->resolve.mode == VK_RESOLVE_MODE_SAMPLE_ZERO_BIT ||
+   if (force_blit_resolve ||
+       att->resolve.mode == VK_RESOLVE_MODE_SAMPLE_ZERO_BIT ||
        /* D3D resolve API can't go from (e.g.) D32S8X24 to D32 */
        src->vk.view_format != dst->vk.view_format ||
        (att->resolve.mode != VK_RESOLVE_MODE_AVERAGE_BIT &&
@@ -4923,15 +4925,20 @@ dzn_CmdEndRendering(VkCommandBuffer commandBuffer)
       for (uint32_t i = 0; i < cmdbuf->state.render.attachments.color_count; i++) {
          dzn_cmd_buffer_resolve_rendering_attachment(cmdbuf,
                                                      &cmdbuf->state.render.attachments.colors[i],
-                                                     VK_IMAGE_ASPECT_COLOR_BIT);
+                                                     VK_IMAGE_ASPECT_COLOR_BIT, false);
       }
 
+      bool separate_stencil_resolve =
+         cmdbuf->state.render.attachments.depth.resolve.mode !=
+         cmdbuf->state.render.attachments.stencil.resolve.mode;
       dzn_cmd_buffer_resolve_rendering_attachment(cmdbuf,
                                                   &cmdbuf->state.render.attachments.depth,
-                                                  VK_IMAGE_ASPECT_DEPTH_BIT);
+                                                  VK_IMAGE_ASPECT_DEPTH_BIT,
+                                                  separate_stencil_resolve);
       dzn_cmd_buffer_resolve_rendering_attachment(cmdbuf,
                                                   &cmdbuf->state.render.attachments.stencil,
-                                                  VK_IMAGE_ASPECT_STENCIL_BIT);
+                                                  VK_IMAGE_ASPECT_STENCIL_BIT,
+                                                  separate_stencil_resolve);
    }
 
    memset(&cmdbuf->state.render, 0, sizeof(cmdbuf->state.render));
index 7eaa544..7e0d4b5 100644 (file)
@@ -1869,8 +1869,8 @@ dzn_GetPhysicalDeviceProperties2(VkPhysicalDevice physicalDevice,
       .supportedDepthResolveModes = VK_RESOLVE_MODE_SAMPLE_ZERO_BIT | VK_RESOLVE_MODE_AVERAGE_BIT |
          VK_RESOLVE_MODE_MIN_BIT | VK_RESOLVE_MODE_MAX_BIT,
       .supportedStencilResolveModes = VK_RESOLVE_MODE_SAMPLE_ZERO_BIT | VK_RESOLVE_MODE_MIN_BIT | VK_RESOLVE_MODE_MAX_BIT,
-      .independentResolveNone = false,
-      .independentResolve = false,
+      .independentResolveNone = true,
+      .independentResolve = true,
       .filterMinmaxSingleComponentFormats = false,
       .filterMinmaxImageComponentMapping = false,
       .maxTimelineSemaphoreValueDifference = UINT64_MAX,