renderer_vulkan: Force subgroup size to 64 when possible (#4111)

This commit is contained in:
TheTurtle 2026-03-09 17:46:51 +02:00 committed by GitHub
parent e16ba06ab0
commit df6bb8562e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 16 additions and 2 deletions

View File

@ -21,7 +21,11 @@ ComputePipeline::ComputePipeline(const Instance& instance, Scheduler& scheduler,
info = &info_;
const auto debug_str = GetDebugString();
const vk::PipelineShaderStageRequiredSubgroupSizeCreateInfo subgroup_size_ci = {
.requiredSubgroupSize = 64,
};
const vk::PipelineShaderStageCreateInfo shader_ci = {
.pNext = instance.IsSubgroupSize64Supported() ? &subgroup_size_ci : nullptr,
.stage = vk::ShaderStageFlagBits::eCompute,
.module = module,
.pName = "main",

View File

@ -220,9 +220,11 @@ bool Instance::CreateDevice() {
const vk::StructureChain properties_chain = physical_device.getProperties2<
vk::PhysicalDeviceProperties2, vk::PhysicalDeviceVulkan11Properties,
vk::PhysicalDeviceVulkan12Properties, vk::PhysicalDevicePushDescriptorPropertiesKHR>();
vk::PhysicalDeviceVulkan12Properties, vk::PhysicalDeviceVulkan13Properties,
vk::PhysicalDevicePushDescriptorPropertiesKHR>();
vk11_props = properties_chain.get<vk::PhysicalDeviceVulkan11Properties>();
vk12_props = properties_chain.get<vk::PhysicalDeviceVulkan12Properties>();
vk13_props = properties_chain.get<vk::PhysicalDeviceVulkan13Properties>();
push_descriptor_props = properties_chain.get<vk::PhysicalDevicePushDescriptorPropertiesKHR>();
LOG_INFO(Render_Vulkan, "Physical device subgroup size {}", vk11_props.subgroupSize);
@ -367,7 +369,7 @@ bool Instance::CreateDevice() {
feature_chain.get<vk::PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT>();
const auto vk11_features = feature_chain.get<vk::PhysicalDeviceVulkan11Features>();
vk12_features = feature_chain.get<vk::PhysicalDeviceVulkan12Features>();
const auto vk13_features = feature_chain.get<vk::PhysicalDeviceVulkan13Features>();
vk13_features = feature_chain.get<vk::PhysicalDeviceVulkan13Features>();
vk::StructureChain device_chain = {
vk::DeviceCreateInfo{
.queueCreateInfoCount = 1u,
@ -429,6 +431,7 @@ bool Instance::CreateDevice() {
vk::PhysicalDeviceVulkan13Features{
.robustImageAccess = vk13_features.robustImageAccess,
.shaderDemoteToHelperInvocation = vk13_features.shaderDemoteToHelperInvocation,
.subgroupSizeControl = vk13_features.subgroupSizeControl,
.synchronization2 = vk13_features.synchronization2,
.dynamicRendering = vk13_features.dynamicRendering,
.maintenance4 = vk13_features.maintenance4,

View File

@ -233,6 +233,11 @@ public:
return vk12_features.shaderSharedInt64Atomics;
}
/// Returns true if the subgroup size can be set to match guest subgroup size
bool IsSubgroupSize64Supported() const {
return vk13_features.subgroupSizeControl && vk13_props.maxSubgroupSize >= 64;
}
/// Returns true when VK_KHR_workgroup_memory_explicit_layout is supported.
bool IsWorkgroupMemoryExplicitLayoutSupported() const {
return workgroup_memory_explicit_layout &&
@ -455,9 +460,11 @@ private:
vk::PhysicalDeviceMemoryProperties memory_properties;
vk::PhysicalDeviceVulkan11Properties vk11_props;
vk::PhysicalDeviceVulkan12Properties vk12_props;
vk::PhysicalDeviceVulkan13Properties vk13_props;
vk::PhysicalDevicePushDescriptorPropertiesKHR push_descriptor_props;
vk::PhysicalDeviceFeatures features;
vk::PhysicalDeviceVulkan12Features vk12_features;
vk::PhysicalDeviceVulkan13Features vk13_features;
vk::PhysicalDevicePortabilitySubsetFeaturesKHR portability_features;
vk::PhysicalDeviceExtendedDynamicState3FeaturesEXT dynamic_state_3_features;
vk::PhysicalDeviceRobustness2FeaturesEXT robustness2_features;