Mesa (main): vulkan: Record shader stages in vk_graphics_pipeline_state

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Jul 22 03:08:26 UTC 2022


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

Author: Jason Ekstrand <jason.ekstrand at collabora.com>
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 <lionel.g.landwerlin at intel.com>
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;
 



More information about the mesa-commit mailing list