From 7c80c92304bda01d805afa75d4c3f3806cccce7f Mon Sep 17 00:00:00 2001 From: Hans-Kristian Arntzen Date: Fri, 25 Jun 2021 13:17:47 +0200 Subject: [PATCH] vkd3d: Use ALLOW_VARYING_SUBGROUP_SIZE flag as appropriate. Signed-off-by: Hans-Kristian Arntzen --- libs/vkd3d/device.c | 2 ++ libs/vkd3d/raytracing_pipeline.c | 7 +++++++ libs/vkd3d/state.c | 3 +++ libs/vkd3d/vkd3d_private.h | 1 + 4 files changed, 13 insertions(+) diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c index 03e3264f..2b01fe6b 100644 --- a/libs/vkd3d/device.c +++ b/libs/vkd3d/device.c @@ -1057,7 +1057,9 @@ static void vkd3d_physical_device_info_init(struct vkd3d_physical_device_info *i if (vulkan_info->EXT_subgroup_size_control) { info->subgroup_size_control_properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT; + info->subgroup_size_control_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT; vk_prepend_struct(&info->properties2, &info->subgroup_size_control_properties); + vk_prepend_struct(&info->features2, &info->subgroup_size_control_features); } if (vulkan_info->EXT_texel_buffer_alignment) diff --git a/libs/vkd3d/raytracing_pipeline.c b/libs/vkd3d/raytracing_pipeline.c index 1560a6d2..f589931a 100644 --- a/libs/vkd3d/raytracing_pipeline.c +++ b/libs/vkd3d/raytracing_pipeline.c @@ -976,6 +976,13 @@ static HRESULT d3d12_state_object_compile_pipeline(struct d3d12_state_object *ob } stage->module = create_shader_module(object->device, spirv.code, spirv.size); + + if (spirv.meta.uses_subgroup_size && + object->device->device_info.subgroup_size_control_features.subgroupSizeControl) + { + stage->flags |= VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT; + } + vkd3d_shader_free_shader_code(&spirv); if (!stage->module) return E_OUTOFMEMORY; diff --git a/libs/vkd3d/state.c b/libs/vkd3d/state.c index 83c82a9e..900cb970 100644 --- a/libs/vkd3d/state.c +++ b/libs/vkd3d/state.c @@ -2094,6 +2094,9 @@ static HRESULT create_shader_stage(struct d3d12_device *device, shader_desc.pCode = spirv.code; *meta = spirv.meta; + if (spirv.meta.uses_subgroup_size && device->device_info.subgroup_size_control_features.subgroupSizeControl) + stage_desc->flags |= VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT; + vr = VK_CALL(vkCreateShaderModule(device->vk_device, &shader_desc, NULL, &stage_desc->module)); vkd3d_shader_free_shader_code(&spirv); if (vr < 0) diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h index 0a6d5f17..6d650a99 100644 --- a/libs/vkd3d/vkd3d_private.h +++ b/libs/vkd3d/vkd3d_private.h @@ -2515,6 +2515,7 @@ struct vkd3d_physical_device_info VkPhysicalDeviceAccelerationStructureFeaturesKHR acceleration_structure_features; VkPhysicalDeviceFragmentShadingRateFeaturesKHR fragment_shading_rate_features; VkPhysicalDeviceShaderDrawParametersFeatures shader_draw_parameters_features; + VkPhysicalDeviceSubgroupSizeControlFeaturesEXT subgroup_size_control_features; VkPhysicalDeviceFeatures2 features2;