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: