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

Author: Jason Ekstrand <[email protected]>
Date:   Wed Jul 20 15:11:57 2022 -0500

vulkan: Record shader stages in vk_graphics_pipeline_state

Some of our asserts and other checks depend on the total set of stages,
not just the stages set in the current pCreateInfo.  Recording the stage
mask lets us combine them in vk_graphics_pipeline_state_merge().

Reviewed-by: Lionel Landwerlin <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17696>

---

 src/vulkan/runtime/vk_graphics_state.c | 15 ++++++++-------
 src/vulkan/runtime/vk_graphics_state.h |  2 ++
 2 files changed, 10 insertions(+), 7 deletions(-)

diff --git a/src/vulkan/runtime/vk_graphics_state.c 
b/src/vulkan/runtime/vk_graphics_state.c
index d01050cb009..14f1c0f4ead 100644
--- a/src/vulkan/runtime/vk_graphics_state.c
+++ b/src/vulkan/runtime/vk_graphics_state.c
@@ -1012,9 +1012,8 @@ vk_graphics_pipeline_state_fill(const struct vk_device 
*device,
    BITSET_DECLARE(dynamic, MESA_VK_DYNAMIC_GRAPHICS_STATE_ENUM_MAX);
    vk_get_dynamic_graphics_states(dynamic, info->pDynamicState);
 
-   VkShaderStageFlags stages = 0;
    for (uint32_t i = 0; i < info->stageCount; i++)
-      stages |= info->pStages[i].stage;
+      state->shader_stages |= info->pStages[i].stage;
 
    /* In case we return early */
    if (alloc_ptr_out != NULL)
@@ -1055,7 +1054,7 @@ vk_graphics_pipeline_state_fill(const struct vk_device 
*device,
        */
       lib = VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT;
 
-      if (stages & VK_SHADER_STAGE_VERTEX_BIT)
+      if (state->shader_stages & VK_SHADER_STAGE_VERTEX_BIT)
          lib |= VK_GRAPHICS_PIPELINE_LIBRARY_VERTEX_INPUT_INTERFACE_BIT_EXT;
 
       if (may_have_rasterization(state, dynamic, info)) {
@@ -1103,11 +1102,11 @@ vk_graphics_pipeline_state_fill(const struct vk_device 
*device,
        *    state the stage member of one element of pStages must be either
        *    VK_SHADER_STAGE_VERTEX_BIT or VK_SHADER_STAGE_MESH_BIT_NV"
        */
-      assert(stages & (VK_SHADER_STAGE_VERTEX_BIT |
-                       VK_SHADER_STAGE_MESH_BIT_NV));
+      assert(state->shader_stages & (VK_SHADER_STAGE_VERTEX_BIT |
+                                     VK_SHADER_STAGE_MESH_BIT_NV));
 
-      if (stages & (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT |
-                    VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT))
+      if (state->shader_stages & (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT |
+                                  VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT))
          needs |= MESA_VK_GRAPHICS_STATE_TESSELLATION_BIT;
 
       if (may_have_rasterization(state, dynamic, info))
@@ -1317,6 +1316,8 @@ vk_graphics_pipeline_state_merge(struct 
vk_graphics_pipeline_state *dst,
 
    BITSET_OR(dst->dynamic, dst->dynamic, src->dynamic);
 
+   dst->shader_stages |= src->shader_stages;
+
    /* Render pass state needs special care because a render pass state may be
     * incomplete (view mask only).  See vk_render_pass_state_init().
     */
diff --git a/src/vulkan/runtime/vk_graphics_state.h 
b/src/vulkan/runtime/vk_graphics_state.h
index 415ff8d62cf..79fc4513e95 100644
--- a/src/vulkan/runtime/vk_graphics_state.h
+++ b/src/vulkan/runtime/vk_graphics_state.h
@@ -703,6 +703,8 @@ struct vk_graphics_pipeline_state {
    /** Bitset of which states are dynamic */
    BITSET_DECLARE(dynamic, MESA_VK_DYNAMIC_GRAPHICS_STATE_ENUM_MAX);
 
+   VkShaderStageFlags shader_stages;
+
    /** Vertex input state */
    const struct vk_vertex_input_state *vi;
 

Reply via email to