Skip to content

Commit fd8b758

Browse files
authored
Support VK_EXT_shader_long_vector when Vulkan headers have it (#1103)
Conditionally compile the support based on whether the Vulkan headers have the necessary definitions. Attempting to use the feature in an Amber script successfully parse the script but then fail to run, which is the intention. This should fix the Android NDK build. Even the latest NDK r29 does not have a new enough Vulkan header. Fixed: #1102
1 parent 4e0fc42 commit fd8b758

File tree

2 files changed

+31
-12
lines changed

2 files changed

+31
-12
lines changed

samples/config_helper_vulkan.cc

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -932,8 +932,10 @@ amber::Result ConfigHelperVulkan::CheckVulkanPhysicalDeviceRequirements(
932932
supports_.vulkan_memory_model = true;
933933
} else if (ext == VK_KHR_ZERO_INITIALIZE_WORKGROUP_MEMORY_EXTENSION_NAME) {
934934
supports_.zero_initialize_workgroup_memory = true;
935+
#ifdef VK_EXT_SHADER_LONG_VECTOR_EXTENSION_NAME
935936
} else if (ext == VK_EXT_SHADER_LONG_VECTOR_EXTENSION_NAME) {
936937
supports_.shader_long_vector = true;
938+
#endif
937939
}
938940
}
939941

@@ -954,7 +956,9 @@ amber::Result ConfigHelperVulkan::CheckVulkanPhysicalDeviceRequirements(
954956
VkPhysicalDeviceVulkanMemoryModelFeatures memory_model_structure_features{};
955957
VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR
956958
zero_initialize_workgroup_memory_features{};
959+
#ifdef VK_EXT_SHADER_LONG_VECTOR_EXTENSION_NAME
957960
VkPhysicalDeviceShaderLongVectorFeaturesEXT shader_long_vector_features{};
961+
#endif
958962
VkPhysicalDeviceAccelerationStructureFeaturesKHR
959963
acceleration_structure_features = {};
960964
VkPhysicalDeviceBufferDeviceAddressFeatures buffer_device_address_features =
@@ -995,10 +999,12 @@ amber::Result ConfigHelperVulkan::CheckVulkanPhysicalDeviceRequirements(
995999
zero_initialize_workgroup_memory_features.pNext = next_ptr;
9961000
next_ptr = &zero_initialize_workgroup_memory_features;
9971001

1002+
#ifdef VK_EXT_SHADER_LONG_VECTOR_EXTENSION_NAME
9981003
shader_long_vector_features.sType =
9991004
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_LONG_VECTOR_FEATURES_EXT;
10001005
shader_long_vector_features.pNext = next_ptr;
10011006
next_ptr = &shader_long_vector_features;
1007+
#endif
10021008

10031009
shader_subgroup_extended_types_features.sType =
10041010
// NOLINTNEXTLINE(whitespace/line_length)
@@ -1083,20 +1089,26 @@ amber::Result ConfigHelperVulkan::CheckVulkanPhysicalDeviceRequirements(
10831089
continue;
10841090
}
10851091

1092+
const bool long_vector_supported =
1093+
#ifdef VK_EXT_SHADER_LONG_VECTOR_EXTENSION_NAME
1094+
shader_long_vector_features.longVector == VK_TRUE;
1095+
#else
1096+
false;
1097+
#endif
1098+
10861099
if ((feature == kVariablePointers &&
10871100
variable_pointers_features.variablePointers == VK_FALSE) ||
1088-
(feature == kVulkanMemoryModel_vulkanMemoryModel &&
1089-
memory_model_structure_features.vulkanMemoryModel == VK_FALSE) ||
1090-
(feature == kVulkanMemoryModel_vulkanMemoryModelDeviceScope &&
1091-
memory_model_structure_features.vulkanMemoryModelDeviceScope
1092-
== VK_FALSE) ||
1093-
(feature ==
1094-
// NOLINTNEXTLINE(whitespace/line_length)
1095-
kZeroInitializeWorkgroupMemory_shaderZeroInitializeWorkgroupMemory &&
1096-
zero_initialize_workgroup_memory_features
1097-
.shaderZeroInitializeWorkgroupMemory == VK_FALSE) ||
1098-
(feature == kShaderLongVector_longVector &&
1099-
shader_long_vector_features.longVector == VK_FALSE) ||
1101+
(feature == kVulkanMemoryModel_vulkanMemoryModel &&
1102+
memory_model_structure_features.vulkanMemoryModel == VK_FALSE) ||
1103+
(feature == kVulkanMemoryModel_vulkanMemoryModelDeviceScope &&
1104+
memory_model_structure_features.vulkanMemoryModelDeviceScope ==
1105+
VK_FALSE) ||
1106+
(feature ==
1107+
// NOLINTNEXTLINE(whitespace/line_length)
1108+
kZeroInitializeWorkgroupMemory_shaderZeroInitializeWorkgroupMemory &&
1109+
zero_initialize_workgroup_memory_features
1110+
.shaderZeroInitializeWorkgroupMemory == VK_FALSE) ||
1111+
(feature == kShaderLongVector_longVector && !long_vector_supported) ||
11001112
(feature == kVariablePointersStorageBuffer &&
11011113
variable_pointers_features.variablePointersStorageBuffer ==
11021114
VK_FALSE) ||
@@ -1343,13 +1355,17 @@ amber::Result ConfigHelperVulkan::CreateDeviceWithFeatures2(
13431355
.shaderZeroInitializeWorkgroupMemory = VK_TRUE;
13441356
}
13451357
} else if (StartsWith(feature, "ShaderLongVectorFeaturesEXT.")) {
1358+
#ifdef VK_EXT_SHADER_LONG_VECTOR_EXTENSION_NAME
13461359
init_feature(
13471360
supports_.shader_long_vector, features_.shader_long_vector,
13481361
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_LONG_VECTOR_FEATURES_EXT,
13491362
VK_EXT_SHADER_LONG_VECTOR_EXTENSION_NAME);
13501363
if (feature == kShaderLongVector_longVector) {
13511364
features_.shader_long_vector.longVector = VK_TRUE;
13521365
}
1366+
#else
1367+
return amber::Result("Vulkan instance does not support " + feature);
1368+
#endif
13531369
} else if (StartsWith(feature, "Float16Int8Features.")) {
13541370
init_feature(supports_.shader_float16_int8, features_.float16_int8,
13551371
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT16_INT8_FEATURES_KHR,

samples/config_helper_vulkan.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,10 @@ class ConfigHelperVulkan : public ConfigHelperImpl {
153153
VkPhysicalDeviceVulkanMemoryModelFeatures memory_model_structure{};
154154
VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR
155155
zero_initialize_workgroup_memory_features{};
156+
#ifdef VK_EXT_SHADER_LONG_VECTOR_EXTENSION_NAME
157+
// Not available in the Android NDK r29
156158
VkPhysicalDeviceShaderLongVectorFeaturesEXT shader_long_vector{};
159+
#endif
157160
} features_;
158161
};
159162

0 commit comments

Comments
 (0)