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;
