Mesa (main): lavapipe: VK_KHR_depth_stencil_resolve support

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Aug 31 23:53:57 UTC 2021


Module: Mesa
Branch: main
Commit: 07956bbcae4cbc396d2e6b8dcf2bab5acbfd6507
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=07956bbcae4cbc396d2e6b8dcf2bab5acbfd6507

Author: Dave Airlie <airlied at redhat.com>
Date:   Thu Dec 24 14:09:58 2020 +1000

lavapipe: VK_KHR_depth_stencil_resolve support

This adds support for depth stencil resolves to lavapipe.

Reviewed-by: Roland Scheidegger <sroland at vmware.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12504>

---

 docs/features.txt                            |  2 +-
 docs/relnotes/new_features.txt               |  1 +
 src/gallium/frontends/lavapipe/lvp_device.c  | 10 ++++++
 src/gallium/frontends/lavapipe/lvp_execute.c | 54 ++++++++++++++++++++++++++++
 src/gallium/frontends/lavapipe/lvp_pass.c    | 21 ++++++++++-
 src/gallium/frontends/lavapipe/lvp_private.h |  2 ++
 6 files changed, 88 insertions(+), 2 deletions(-)

diff --git a/docs/features.txt b/docs/features.txt
index dbc0e4b4329..30508497527 100644
--- a/docs/features.txt
+++ b/docs/features.txt
@@ -448,7 +448,7 @@ Vulkan 1.2 -- all DONE: anv, vn
   VK_KHR_8bit_storage                                   DONE (anv/gen8+, lvp, radv, vn)
   VK_KHR_buffer_device_address                          DONE (anv/gen8+, lvp, radv, vn)
   VK_KHR_create_renderpass2                             DONE (anv, lvp, radv, tu, vn)
-  VK_KHR_depth_stencil_resolve                          DONE (anv, radv, tu, vn)
+  VK_KHR_depth_stencil_resolve                          DONE (anv, lvp, radv, tu, vn)
   VK_KHR_draw_indirect_count                            DONE (anv, lvp, radv, tu, vn)
   VK_KHR_driver_properties                              DONE (anv, lvp, radv, vn)
   VK_KHR_image_format_list                              DONE (anv, lvp, radv, tu, v3dv, vn)
diff --git a/docs/relnotes/new_features.txt b/docs/relnotes/new_features.txt
index b33a3e1b067..a1dd9164e9a 100644
--- a/docs/relnotes/new_features.txt
+++ b/docs/relnotes/new_features.txt
@@ -8,3 +8,4 @@ GL_AMD_pinned_memory on llvmpipe
 GL 4.5 compatibility on llvmpipe
 VK_EXT_primitive_topology_list_restart on RADV.
 ES 3.2 on zink
+VK_KHR_depth_stencil_resolve on lavapipe
diff --git a/src/gallium/frontends/lavapipe/lvp_device.c b/src/gallium/frontends/lavapipe/lvp_device.c
index 36c7facfb6f..4c7b7d31e34 100644
--- a/src/gallium/frontends/lavapipe/lvp_device.c
+++ b/src/gallium/frontends/lavapipe/lvp_device.c
@@ -95,6 +95,7 @@ static const struct vk_device_extension_table lvp_device_extensions_supported =
    .KHR_create_renderpass2                = true,
    .KHR_copy_commands2                    = true,
    .KHR_dedicated_allocation              = true,
+   .KHR_depth_stencil_resolve             = true,
    .KHR_descriptor_update_template        = true,
    .KHR_device_group                      = true,
    .KHR_draw_indirect_count               = true,
@@ -1022,6 +1023,15 @@ VKAPI_ATTR void VKAPI_CALL lvp_GetPhysicalDeviceProperties2(
          props->maxMultiDrawCount = 2048;
          break;
       }
+      case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES: {
+         VkPhysicalDeviceDepthStencilResolveProperties *properties =
+            (VkPhysicalDeviceDepthStencilResolveProperties *)ext;
+         properties->supportedDepthResolveModes = VK_RESOLVE_MODE_SAMPLE_ZERO_BIT | VK_RESOLVE_MODE_AVERAGE_BIT;
+         properties->supportedStencilResolveModes = VK_RESOLVE_MODE_SAMPLE_ZERO_BIT;
+         properties->independentResolveNone = false;
+         properties->independentResolve = false;
+         break;
+      }
       default:
          break;
       }
diff --git a/src/gallium/frontends/lavapipe/lvp_execute.c b/src/gallium/frontends/lavapipe/lvp_execute.c
index 425527b1192..50668178fc5 100644
--- a/src/gallium/frontends/lavapipe/lvp_execute.c
+++ b/src/gallium/frontends/lavapipe/lvp_execute.c
@@ -1545,6 +1545,60 @@ slow_clear:
 static void render_pass_resolve(struct rendering_state *state)
 {
    const struct lvp_subpass *subpass = &state->pass->subpasses[state->subpass];
+
+   if (subpass->depth_stencil_attachment && subpass->ds_resolve_attachment) {
+      struct lvp_subpass_attachment src_att = *subpass->depth_stencil_attachment;
+      struct lvp_subpass_attachment dst_att = *subpass->ds_resolve_attachment;
+      if (dst_att.attachment != VK_ATTACHMENT_UNUSED) {
+         int num_blits = 1;
+         if (subpass->depth_resolve_mode != subpass->stencil_resolve_mode)
+            num_blits = 2;
+
+         for (unsigned i = 0; i < num_blits; i++) {
+
+            if (i == 0 && subpass->depth_resolve_mode == VK_RESOLVE_MODE_NONE)
+               continue;
+
+            if (i == 1 && subpass->stencil_resolve_mode == VK_RESOLVE_MODE_NONE)
+               continue;
+
+            struct lvp_image_view *src_imgv = get_attachment(state, src_att.attachment);
+            struct lvp_image_view *dst_imgv = get_attachment(state, dst_att.attachment);
+
+            struct pipe_blit_info info;
+            memset(&info, 0, sizeof(info));
+
+            info.src.resource = src_imgv->image->bo;
+            info.dst.resource = dst_imgv->image->bo;
+            info.src.format = src_imgv->pformat;
+            info.dst.format = dst_imgv->pformat;
+            info.filter = PIPE_TEX_FILTER_NEAREST;
+
+            if (num_blits == 1)
+               info.mask = PIPE_MASK_ZS;
+            else if (i == 0)
+               info.mask = PIPE_MASK_Z;
+            else
+               info.mask = PIPE_MASK_S;
+
+            if (i == 0 && subpass->depth_resolve_mode == VK_RESOLVE_MODE_SAMPLE_ZERO_BIT)
+               info.sample0_only = true;
+            if (i == 1 && subpass->stencil_resolve_mode == VK_RESOLVE_MODE_SAMPLE_ZERO_BIT)
+               info.sample0_only = true;
+
+            info.src.box.x = state->render_area.offset.x;
+            info.src.box.y = state->render_area.offset.y;
+            info.src.box.width = state->render_area.extent.width;
+            info.src.box.height = state->render_area.extent.height;
+            info.src.box.depth = state->vk_framebuffer->layers;
+
+            info.dst.box = info.src.box;
+
+            state->pctx->blit(state->pctx, &info);
+         }
+      }
+   }
+
    if (!subpass->has_color_resolve)
       return;
    for (uint32_t i = 0; i < subpass->color_count; i++) {
diff --git a/src/gallium/frontends/lavapipe/lvp_pass.c b/src/gallium/frontends/lavapipe/lvp_pass.c
index ed279bc1296..babf825e6ee 100644
--- a/src/gallium/frontends/lavapipe/lvp_pass.c
+++ b/src/gallium/frontends/lavapipe/lvp_pass.c
@@ -138,10 +138,14 @@ lvp_render_pass_compile(struct lvp_render_pass *pass)
 static unsigned
 lvp_num_subpass_attachments2(const VkSubpassDescription2 *desc)
 {
+   const VkSubpassDescriptionDepthStencilResolve *ds_resolve =
+      vk_find_struct_const(desc->pNext,
+                           SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE);
    return desc->inputAttachmentCount +
       desc->colorAttachmentCount +
       (desc->pResolveAttachments ? desc->colorAttachmentCount : 0) +
-      (desc->pDepthStencilAttachment != NULL);
+      (desc->pDepthStencilAttachment != NULL) +
+      (ds_resolve && ds_resolve->pDepthStencilResolveAttachment);
 }
 
 VKAPI_ATTR VkResult VKAPI_CALL lvp_CreateRenderPass2(
@@ -262,6 +266,21 @@ VKAPI_ATTR VkResult VKAPI_CALL lvp_CreateRenderPass2(
             .layout = desc->pDepthStencilAttachment->layout,
          };
       }
+
+      const VkSubpassDescriptionDepthStencilResolve *ds_resolve =
+         vk_find_struct_const(desc->pNext, SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE);
+
+      if (ds_resolve && ds_resolve->pDepthStencilResolveAttachment) {
+         subpass->ds_resolve_attachment = p++;
+
+         *subpass->ds_resolve_attachment = (struct lvp_subpass_attachment){
+            .attachment = ds_resolve->pDepthStencilResolveAttachment->attachment,
+            .layout = ds_resolve->pDepthStencilResolveAttachment->layout,
+         };
+
+         subpass->depth_resolve_mode = ds_resolve->depthResolveMode;
+         subpass->stencil_resolve_mode = ds_resolve->stencilResolveMode;
+      }
    }
 
    lvp_render_pass_compile(pass);
diff --git a/src/gallium/frontends/lavapipe/lvp_private.h b/src/gallium/frontends/lavapipe/lvp_private.h
index 5ad0bc94916..cad34870bde 100644
--- a/src/gallium/frontends/lavapipe/lvp_private.h
+++ b/src/gallium/frontends/lavapipe/lvp_private.h
@@ -290,6 +290,8 @@ struct lvp_subpass {
    struct lvp_subpass_attachment *              resolve_attachments;
    struct lvp_subpass_attachment *              depth_stencil_attachment;
    struct lvp_subpass_attachment *              ds_resolve_attachment;
+   VkResolveModeFlagBits                        depth_resolve_mode;
+   VkResolveModeFlagBits                        stencil_resolve_mode;
 
    /** Subpass has at least one color resolve attachment */
    bool                                         has_color_resolve;



More information about the mesa-commit mailing list