diff --git a/src/gallium/drivers/zink/zink_device_info.py b/src/gallium/drivers/zink/zink_device_info.py index fc52d5ea112..75b6e31ee46 100644 --- a/src/gallium/drivers/zink/zink_device_info.py +++ b/src/gallium/drivers/zink/zink_device_info.py @@ -86,6 +86,7 @@ EXTENSIONS = [ Extension("VK_EXT_post_depth_coverage"), Extension("VK_EXT_depth_clip_control", alias="clip_control", features=True), Extension("VK_EXT_shader_subgroup_ballot"), + Extension("VK_EXT_shader_subgroup_vote"), Extension("VK_EXT_shader_atomic_float", alias="atomic_float", features=True), Extension("VK_KHR_8bit_storage", alias="storage_8bit", diff --git a/src/gallium/drivers/zink/zink_screen.c b/src/gallium/drivers/zink/zink_screen.c index b5379c2388c..d455fd514d9 100644 --- a/src/gallium/drivers/zink/zink_screen.c +++ b/src/gallium/drivers/zink/zink_screen.c @@ -448,10 +448,13 @@ zink_get_param(struct pipe_screen *pscreen, enum pipe_cap param) return screen->info.feats11.shaderDrawParameters || screen->info.have_KHR_shader_draw_parameters; case PIPE_CAP_SHADER_GROUP_VOTE: - return screen->info.have_vulkan11 && + if (screen->info.have_vulkan11 && (screen->info.subgroup.supportedOperations & VK_SUBGROUP_FEATURE_VOTE_BIT) && - (screen->info.subgroup.supportedStages & VK_SHADER_STAGE_COMPUTE_BIT); - + (screen->info.subgroup.supportedStages & VK_SHADER_STAGE_COMPUTE_BIT)) + return true; + if (screen->info.have_EXT_shader_subgroup_vote) + return true; + return false; case PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION: return screen->info.have_EXT_provoking_vertex; @@ -518,8 +521,14 @@ zink_get_param(struct pipe_screen *pscreen, enum pipe_cap param) return 1; case PIPE_CAP_SHADER_BALLOT: - return screen->info.have_vulkan12 && screen->info.have_EXT_shader_subgroup_ballot && screen->info.props11.subgroupSize <= 64; - + if (screen->info.props11.subgroupSize > 64) + return false; + if (screen->info.have_vulkan11 && + screen->info.subgroup.supportedOperations & VK_SUBGROUP_FEATURE_BALLOT_BIT) + return true; + if (screen->info.have_EXT_shader_subgroup_ballot) + return true; + return false; case PIPE_CAP_SAMPLE_SHADING: return screen->info.feats.features.sampleRateShading;