From 83428a99334e51907723acf69c01223810d9f2b4 Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Tue, 8 Aug 2023 15:17:53 +0200 Subject: [PATCH] zink: fix setting VkShaderCreateInfoEXT::nextStage nextStage has some restrictions depending on the current stage. Fixes: cd6625c6eb9 ("zink: use EXT_shader_object to (re)implement separate shaders") Signed-off-by: Samuel Pitoiset Part-of: (cherry picked from commit 478a18aa3d43aea1c8aef675899a0cfd1a266639) --- .pick_status.json | 2 +- src/gallium/drivers/zink/zink_compiler.c | 26 ++++++++++++++++++++++-- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index ecd81b2e965..5a2ef993418 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -9754,7 +9754,7 @@ "description": "zink: fix setting VkShaderCreateInfoEXT::nextStage", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "cd6625c6eb9699245b2fb6c9c704607d762a95ea", "notes": null diff --git a/src/gallium/drivers/zink/zink_compiler.c b/src/gallium/drivers/zink/zink_compiler.c index fed03a76367..2707ad267f3 100644 --- a/src/gallium/drivers/zink/zink_compiler.c +++ b/src/gallium/drivers/zink/zink_compiler.c @@ -3137,6 +3137,29 @@ zink_shader_dump(const struct zink_shader *zs, void *words, size_t size, const c } } +static VkShaderStageFlagBits +zink_get_next_stage(gl_shader_stage stage) +{ + switch (stage) { + case MESA_SHADER_VERTEX: + return VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | + VK_SHADER_STAGE_GEOMETRY_BIT | + VK_SHADER_STAGE_FRAGMENT_BIT; + case MESA_SHADER_TESS_CTRL: + return VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT; + case MESA_SHADER_TESS_EVAL: + return VK_SHADER_STAGE_GEOMETRY_BIT | + VK_SHADER_STAGE_FRAGMENT_BIT; + case MESA_SHADER_GEOMETRY: + return VK_SHADER_STAGE_FRAGMENT_BIT; + case MESA_SHADER_FRAGMENT: + case MESA_SHADER_COMPUTE: + return 0; + default: + unreachable("invalid shader stage"); + } +} + struct zink_shader_object zink_shader_spirv_compile(struct zink_screen *screen, struct zink_shader *zs, struct spirv_shader *spirv, bool can_shobj, struct zink_program *pg) { @@ -3155,8 +3178,7 @@ zink_shader_spirv_compile(struct zink_screen *screen, struct zink_shader *zs, st sci.sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO_EXT; sci.stage = mesa_to_vk_shader_stage(zs->info.stage); - if (sci.stage != VK_SHADER_STAGE_FRAGMENT_BIT) - sci.nextStage = VK_SHADER_STAGE_ALL_GRAPHICS & ~VK_SHADER_STAGE_VERTEX_BIT; + sci.nextStage = zink_get_next_stage(zs->info.stage); sci.codeType = VK_SHADER_CODE_TYPE_SPIRV_EXT; sci.codeSize = spirv->num_words * sizeof(uint32_t); sci.pCode = spirv->words;