Mesa (main): lavapipe: fix renderpass info handling during pipeline creation

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Jun 24 00:28:19 UTC 2022


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

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date:   Thu Jun 23 10:26:09 2022 -0400

lavapipe: fix renderpass info handling during pipeline creation

only the viewMask parameter of VkPipelineRenderingCreateInfoKHR can
be accessed in the fragment stage, so for pipeline libraries it should
be assumed that zs attachments exist for the purpose of copying dynamic
state values, and then these dynamic states will naturally be pruned
during final pipeline construction if the attachments turn out to not
be present

cc: mesa-stable

Reviewed-by: Dave Airlie <airlied at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17219>

---

 src/gallium/frontends/lavapipe/lvp_pipeline.c | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/src/gallium/frontends/lavapipe/lvp_pipeline.c b/src/gallium/frontends/lavapipe/lvp_pipeline.c
index fbe4a458bf2..7e546c32ae9 100644
--- a/src/gallium/frontends/lavapipe/lvp_pipeline.c
+++ b/src/gallium/frontends/lavapipe/lvp_pipeline.c
@@ -402,7 +402,7 @@ deep_copy_graphics_create_info(void *mem_ctx,
    dst->pNext = NULL;
    dst->flags = src->flags;
    dst->layout = src->layout;
-   if (shaders & (VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT | VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_OUTPUT_INTERFACE_BIT_EXT)) {
+   if (shaders & VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_OUTPUT_INTERFACE_BIT_EXT) {
       assert(!dst->renderPass || !src->renderPass || dst->renderPass == src->renderPass);
       assert(!dst->subpass || !src->subpass || dst->subpass == src->subpass);
       dst->subpass = src->subpass;
@@ -420,6 +420,14 @@ deep_copy_graphics_create_info(void *mem_ctx,
    if (rp_info) {
       has_depth = rp_info->depthAttachmentFormat != VK_FORMAT_UNDEFINED;
       has_stencil = rp_info->stencilAttachmentFormat != VK_FORMAT_UNDEFINED;
+   } else if ((shaders & VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT) &&
+              (shaders ^ VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_OUTPUT_INTERFACE_BIT_EXT)) {
+      /* if this is a fragment stage without a fragment output,
+       * assume both of these exist so the dynamic states are covered,
+       * then let them be naturally pruned in the final pipeline
+       */
+      has_depth = true;
+      has_stencil = true;
    }
    dst->basePipelineHandle = src->basePipelineHandle;
    dst->basePipelineIndex = src->basePipelineIndex;
@@ -503,8 +511,6 @@ deep_copy_graphics_create_info(void *mem_ctx,
    }
 
    if (shaders & VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT) {
-      assert(rp_info);
-      bool have_output = (shaders & VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_OUTPUT_INTERFACE_BIT_EXT) > 0;
       /* pDepthStencilState */
       if (src->pDepthStencilState && !rasterization_disabled &&
           /*
@@ -522,7 +528,7 @@ deep_copy_graphics_create_info(void *mem_ctx,
                state but not fragment output interface state, pDepthStencilState must be a valid pointer
                to a valid VkPipelineDepthStencilStateCreateInfo structure
           */
-          (!have_output || has_depth || has_stencil)) {
+          (has_depth || has_stencil)) {
          LVP_PIPELINE_DUP(dst->pDepthStencilState,
                           src->pDepthStencilState,
                           VkPipelineDepthStencilStateCreateInfo,



More information about the mesa-commit mailing list