From b33a29f61e5bea8de10395dd5f07a6366d8c0fa8 Mon Sep 17 00:00:00 2001 From: Konstantin Seurer Date: Thu, 19 Sep 2024 10:15:35 +0200 Subject: [PATCH] lavapipe: Implement VK_KHR_shader_subgroup_rotate Reviewed-By: Mike Blumenkrantz Part-of: --- src/gallium/frontends/lavapipe/lvp_device.c | 7 ++++++- src/gallium/frontends/lavapipe/lvp_pipeline.c | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/gallium/frontends/lavapipe/lvp_device.c b/src/gallium/frontends/lavapipe/lvp_device.c index 73ebe8c1abc..5299bd8110e 100644 --- a/src/gallium/frontends/lavapipe/lvp_device.c +++ b/src/gallium/frontends/lavapipe/lvp_device.c @@ -168,6 +168,7 @@ static const struct vk_device_extension_table lvp_device_extensions_supported = .KHR_shader_non_semantic_info = true, .KHR_shader_relaxed_extended_instruction = true, .KHR_shader_subgroup_extended_types = true, + .KHR_shader_subgroup_rotate = true, .KHR_shader_terminate_invocation = true, .KHR_spirv_1_4 = true, .KHR_storage_buffer_storage_class = true, @@ -736,6 +737,10 @@ lvp_get_features(const struct lvp_physical_device *pdevice, /* VK_KHR_shader_relaxed_extended_instruction */ .shaderRelaxedExtendedInstruction = true, + + /* VK_KHR_shader_subgroup_rotate */ + .shaderSubgroupRotate = true, + .shaderSubgroupRotateClustered = true, }; } @@ -1205,7 +1210,7 @@ lvp_get_properties(const struct lvp_physical_device *device, struct vk_propertie #if LLVM_VERSION_MAJOR >= 10 p->subgroupSupportedOperations |= VK_SUBGROUP_FEATURE_SHUFFLE_BIT | VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT | VK_SUBGROUP_FEATURE_QUAD_BIT | - VK_SUBGROUP_FEATURE_CLUSTERED_BIT; + VK_SUBGROUP_FEATURE_CLUSTERED_BIT | VK_SUBGROUP_FEATURE_ROTATE_BIT_KHR | VK_SUBGROUP_FEATURE_ROTATE_CLUSTERED_BIT_KHR; #endif /* Vulkan 1.2 */ diff --git a/src/gallium/frontends/lavapipe/lvp_pipeline.c b/src/gallium/frontends/lavapipe/lvp_pipeline.c index 9156c3e851e..71f9238500b 100644 --- a/src/gallium/frontends/lavapipe/lvp_pipeline.c +++ b/src/gallium/frontends/lavapipe/lvp_pipeline.c @@ -366,6 +366,7 @@ lvp_shader_lower(struct lvp_device *pdevice, struct lvp_pipeline *pipeline, nir_ subgroup_opts.ballot_components = 1; subgroup_opts.ballot_bit_size = 32; subgroup_opts.lower_inverse_ballot = true; + subgroup_opts.lower_rotate_to_shuffle = true; NIR_PASS_V(nir, nir_lower_subgroups, &subgroup_opts); if (nir->info.stage == MESA_SHADER_FRAGMENT)