From 55b57db84d85994aee17475768dc0ec1c7e5f322 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Fri, 11 Dec 2020 18:56:46 -0500 Subject: [PATCH] zink: add vk/spirv caps/extension for shader LAYER variable this is required if gl_Layer is used outside of GEOMETRY stage Fixes: c77df59c9e6 ("zink: export PIPE_CAP_TGSI_VS_LAYER_VIEWPORT") Reviewed-by: Dave Airlie Part-of: --- src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c | 9 +++++++++ src/gallium/drivers/zink/zink_device_info.py | 1 + src/gallium/drivers/zink/zink_screen.c | 5 +++-- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c b/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c index c7a833c0530..a0f7e5e2fb8 100644 --- a/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c +++ b/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c @@ -3611,6 +3611,15 @@ nir_to_spirv(struct nir_shader *s, const struct zink_so_info *so_info, unreachable("invalid stage"); } + if (s->info.stage != MESA_SHADER_GEOMETRY) { + if (s->info.outputs_written & BITFIELD64_BIT(VARYING_SLOT_LAYER) || + s->info.inputs_read & BITFIELD64_BIT(VARYING_SLOT_LAYER)) { + spirv_builder_emit_extension(&ctx.builder, "SPV_EXT_shader_viewport_index_layer"); + spirv_builder_emit_cap(&ctx.builder, SpvCapabilityShaderViewportIndexLayerEXT); + spirv_builder_emit_cap(&ctx.builder, SpvCapabilityShaderLayer); + } + } + if (s->info.num_ssbos) spirv_builder_emit_extension(&ctx.builder, "SPV_KHR_storage_buffer_storage_class"); diff --git a/src/gallium/drivers/zink/zink_device_info.py b/src/gallium/drivers/zink/zink_device_info.py index 887ed82ae39..0aab83a9245 100644 --- a/src/gallium/drivers/zink/zink_device_info.py +++ b/src/gallium/drivers/zink/zink_device_info.py @@ -65,6 +65,7 @@ EXTENSIONS = [ Extension("VK_KHR_external_memory"), Extension("VK_KHR_external_memory_fd"), Extension("VK_KHR_vulkan_memory_model"), + Extension("VK_EXT_shader_viewport_index_layer"), Extension("VK_KHR_driver_properties", alias="driver", properties=True), diff --git a/src/gallium/drivers/zink/zink_screen.c b/src/gallium/drivers/zink/zink_screen.c index 9e0fe23ba57..a1972be1528 100644 --- a/src/gallium/drivers/zink/zink_screen.c +++ b/src/gallium/drivers/zink/zink_screen.c @@ -413,8 +413,9 @@ zink_get_param(struct pipe_screen *pscreen, enum pipe_cap param) return 1; case PIPE_CAP_TGSI_VS_LAYER_VIEWPORT: - return screen->info.feats12.shaderOutputLayer && - screen->info.feats12.shaderOutputViewportIndex; + return screen->info.have_EXT_shader_viewport_index_layer || + (screen->info.feats12.shaderOutputLayer && + screen->info.feats12.shaderOutputViewportIndex); case PIPE_CAP_TEXTURE_FLOAT_LINEAR: case PIPE_CAP_TEXTURE_HALF_FLOAT_LINEAR: