Mesa (main): vulkan/render_pass: Use a special layout for self-dependencies

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Jun 24 23:08:44 UTC 2022


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

Author: Jason Ekstrand <jason.ekstrand at collabora.com>
Date:   Thu May 12 16:47:46 2022 -0500

vulkan/render_pass: Use a special layout for self-dependencies

Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Acked-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16953>

---

 src/intel/vulkan/genX_cmd_buffer.c  |  4 +-
 src/microsoft/vulkan/dzn_image.c    |  1 +
 src/vulkan/runtime/vk_image.c       | 17 +++++++++
 src/vulkan/runtime/vk_render_pass.c | 74 +++++++++++++++++++++++++------------
 src/vulkan/runtime/vk_render_pass.h |  2 +
 5 files changed, 73 insertions(+), 25 deletions(-)

diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c
index f3d3ee1cd71..2cafe874d3f 100644
--- a/src/intel/vulkan/genX_cmd_buffer.c
+++ b/src/intel/vulkan/genX_cmd_buffer.c
@@ -7169,6 +7169,7 @@ void genX(CmdEndRendering)(
     *  - VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL
     *  - VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL
     *  - VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL
+    *  - VK_IMAGE_LAYOUT_SUBPASS_SELF_DEPENDENCY_MESA
     *
     * For general, we have no nice opportunity to transition so we do the copy
     * to the shadow unconditionally at the end of the subpass. For transfer
@@ -7182,7 +7183,8 @@ void genX(CmdEndRendering)(
          anv_image_aspect_to_plane(image, VK_IMAGE_ASPECT_STENCIL_BIT);
 
       if (anv_surface_is_valid(&image->planes[plane].shadow_surface) &&
-          gfx->stencil_att.layout == VK_IMAGE_LAYOUT_GENERAL) {
+          (gfx->stencil_att.layout == VK_IMAGE_LAYOUT_GENERAL ||
+           gfx->stencil_att.layout == VK_IMAGE_LAYOUT_SUBPASS_SELF_DEPENDENCY_MESA)) {
          anv_image_copy_to_shadow(cmd_buffer, image,
                                   VK_IMAGE_ASPECT_STENCIL_BIT,
                                   iview->planes[plane].isl.base_level, 1,
diff --git a/src/microsoft/vulkan/dzn_image.c b/src/microsoft/vulkan/dzn_image.c
index 0f5e40fa095..f98e3153d02 100644
--- a/src/microsoft/vulkan/dzn_image.c
+++ b/src/microsoft/vulkan/dzn_image.c
@@ -521,6 +521,7 @@ dzn_image_layout_to_state(VkImageLayout layout, VkImageAspectFlagBits aspect)
    case VK_IMAGE_LAYOUT_PREINITIALIZED:
    case VK_IMAGE_LAYOUT_UNDEFINED:
    case VK_IMAGE_LAYOUT_GENERAL:
+   case VK_IMAGE_LAYOUT_SUBPASS_SELF_DEPENDENCY_MESA:
       /* YOLO! */
    case VK_IMAGE_LAYOUT_PRESENT_SRC_KHR:
       return D3D12_RESOURCE_STATE_COMMON;
diff --git a/src/vulkan/runtime/vk_image.c b/src/vulkan/runtime/vk_image.c
index f171e259f7f..c42ecaf2dc3 100644
--- a/src/vulkan/runtime/vk_image.c
+++ b/src/vulkan/runtime/vk_image.c
@@ -33,6 +33,7 @@
 #include "vk_common_entrypoints.h"
 #include "vk_device.h"
 #include "vk_format.h"
+#include "vk_render_pass.h"
 #include "vk_util.h"
 #include "vulkan/wsi/wsi_common.h"
 
@@ -555,6 +556,14 @@ vk_image_layout_is_read_only(VkImageLayout layout,
    case VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL:
    case VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL:
    case VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL_KHR:
+#ifdef __GNUC__
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wswitch"
+#endif
+   case VK_IMAGE_LAYOUT_SUBPASS_SELF_DEPENDENCY_MESA:
+#ifdef __GNUC__
+#pragma GCC diagnostic pop
+#endif
       return false;
 
    case VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL:
@@ -703,6 +712,14 @@ vk_image_layout_to_usage_flags(VkImageLayout layout,
       return 0u;
 
    case VK_IMAGE_LAYOUT_GENERAL:
+#ifdef __GNUC__
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wswitch"
+#endif
+   case VK_IMAGE_LAYOUT_SUBPASS_SELF_DEPENDENCY_MESA:
+#ifdef __GNUC__
+#pragma GCC diagnostic pop
+#endif
       return ~0u;
 
    case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL:
diff --git a/src/vulkan/runtime/vk_render_pass.c b/src/vulkan/runtime/vk_render_pass.c
index 91f2a055d1e..41fe532e1d1 100644
--- a/src/vulkan/runtime/vk_render_pass.c
+++ b/src/vulkan/runtime/vk_render_pass.c
@@ -488,11 +488,6 @@ vk_common_CreateRenderPass2(VkDevice _device,
       subpass->view_mask = desc->viewMask ? desc->viewMask : 1;
       pass->view_mask |= subpass->view_mask;
 
-      assert(desc->colorAttachmentCount <= 32);
-      uint32_t color_self_deps = 0;
-      bool has_depth_self_dep = false;
-      bool has_stencil_self_dep = false;
-
       subpass->input_count = desc->inputAttachmentCount;
       if (desc->inputAttachmentCount > 0) {
          subpass->input_attachments = next_subpass_attachment;
@@ -504,25 +499,6 @@ vk_common_CreateRenderPass2(VkDevice _device,
                                        &desc->pInputAttachments[a],
                                        pCreateInfo->pAttachments,
                                        VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT);
-
-            if (desc->pInputAttachments[a].attachment != VK_ATTACHMENT_UNUSED) {
-               for (uint32_t c = 0; c < desc->colorAttachmentCount; c++) {
-                  if (desc->pColorAttachments[c].attachment ==
-                      desc->pInputAttachments[a].attachment)
-                     color_self_deps |= (1u << c);
-               }
-
-               if (desc->pDepthStencilAttachment != NULL &&
-                   desc->pDepthStencilAttachment->attachment ==
-                      desc->pInputAttachments[a].attachment) {
-                  VkImageAspectFlags aspects =
-                     subpass->input_attachments[a].aspects;
-                  if (aspects & VK_IMAGE_ASPECT_DEPTH_BIT)
-                     has_depth_self_dep = true;
-                  if (aspects & VK_IMAGE_ASPECT_STENCIL_BIT)
-                     has_stencil_self_dep = true;
-               }
-            }
          }
       }
 
@@ -616,6 +592,48 @@ vk_common_CreateRenderPass2(VkDevice _device,
             fsr_att_info->shadingRateAttachmentTexelSize;
       }
 
+      /* Figure out any self-dependencies */
+      assert(desc->colorAttachmentCount <= 32);
+      uint32_t color_self_deps = 0;
+      bool has_depth_self_dep = false;
+      bool has_stencil_self_dep = false;
+      for (uint32_t a = 0; a < desc->inputAttachmentCount; a++) {
+         if (desc->pInputAttachments[a].attachment == VK_ATTACHMENT_UNUSED)
+            continue;
+
+         for (uint32_t c = 0; c < desc->colorAttachmentCount; c++) {
+            if (desc->pColorAttachments[c].attachment ==
+                desc->pInputAttachments[a].attachment) {
+               subpass->input_attachments[a].layout =
+                  VK_IMAGE_LAYOUT_SUBPASS_SELF_DEPENDENCY_MESA;
+               subpass->color_attachments[c].layout =
+                  VK_IMAGE_LAYOUT_SUBPASS_SELF_DEPENDENCY_MESA;
+               color_self_deps |= (1u << c);
+            }
+         }
+
+         if (desc->pDepthStencilAttachment != NULL &&
+             desc->pDepthStencilAttachment->attachment ==
+                desc->pInputAttachments[a].attachment) {
+            VkImageAspectFlags aspects =
+               subpass->input_attachments[a].aspects;
+            if (aspects & VK_IMAGE_ASPECT_DEPTH_BIT) {
+               subpass->input_attachments[a].layout =
+                  VK_IMAGE_LAYOUT_SUBPASS_SELF_DEPENDENCY_MESA;
+               subpass->depth_stencil_attachment->layout =
+                  VK_IMAGE_LAYOUT_SUBPASS_SELF_DEPENDENCY_MESA;
+               has_depth_self_dep = true;
+            }
+            if (aspects & VK_IMAGE_ASPECT_STENCIL_BIT) {
+               subpass->input_attachments[a].stencil_layout =
+                  VK_IMAGE_LAYOUT_SUBPASS_SELF_DEPENDENCY_MESA;
+               subpass->depth_stencil_attachment->stencil_layout =
+                  VK_IMAGE_LAYOUT_SUBPASS_SELF_DEPENDENCY_MESA;
+               has_stencil_self_dep = true;
+            }
+         }
+      }
+
       VkFormat *color_formats = NULL;
       VkSampleCountFlagBits samples = 0;
       if (desc->colorAttachmentCount > 0) {
@@ -974,6 +992,14 @@ vk_image_layout_supports_input_attachment(VkImageLayout layout)
    case VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL:
    case VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL:
    case VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR:
+#ifdef __GNUC__
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wswitch"
+#endif
+   case VK_IMAGE_LAYOUT_SUBPASS_SELF_DEPENDENCY_MESA:
+#ifdef __GNUC__
+#pragma GCC diagnostic pop
+#endif
       return true;
    default:
       return false;
diff --git a/src/vulkan/runtime/vk_render_pass.h b/src/vulkan/runtime/vk_render_pass.h
index 59b40a25bf5..53af598e295 100644
--- a/src/vulkan/runtime/vk_render_pass.h
+++ b/src/vulkan/runtime/vk_render_pass.h
@@ -79,6 +79,8 @@ typedef struct VkRenderingAttachmentInitialLayoutInfoMESA {
     VkImageLayout      initialLayout;
 } VkRenderingAttachmentInitialLayoutInfoMESA;
 
+#define VK_IMAGE_LAYOUT_SUBPASS_SELF_DEPENDENCY_MESA (VkImageLayout)1000044902
+
 struct vk_subpass_attachment {
    /** VkAttachmentReference2::attachment */
    uint32_t attachment;



More information about the mesa-commit mailing list