Skip to content

Commit a269ffb

Browse files
committed
Validate requested extensions
Separate code-paths for 1.0, 1.1 and 1.2+
1 parent 872aa0a commit a269ffb

File tree

1 file changed

+86
-27
lines changed

1 file changed

+86
-27
lines changed

src/gpu/vulkan/SDL_gpu_vulkan.c

Lines changed: 86 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -11380,6 +11380,89 @@ static bool VULKAN_INTERNAL_ValidateOptInVulkan13Features(VkPhysicalDeviceVulkan
1138011380

1138111381
#undef CHECK_OPTIONAL_DEVICE_FEATURE
1138211382

11383+
static bool VULKAN_INTERNAL_ValidateOptInFeatures(VulkanRenderer *renderer, VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures *vk10Features)
11384+
{
11385+
bool supportsAllFeatures = true;
11386+
11387+
if (renderer->desiredApiVersion < VK_API_VERSION_1_1) {
11388+
supportsAllFeatures &= VULKAN_INTERNAL_ValidateOptInVulkan10Features(&renderer->desiredVulkan10DeviceFeatures, vk10Features);
11389+
} else if (renderer->desiredApiVersion < VK_API_VERSION_1_2) {
11390+
// Query device features using the pre-1.2 structures
11391+
VkPhysicalDevice16BitStorageFeatures storage = { 0 };
11392+
storage.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES;
11393+
11394+
VkPhysicalDeviceMultiviewFeatures multiview = { 0 };
11395+
multiview.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES;
11396+
11397+
VkPhysicalDeviceProtectedMemoryFeatures protectedMem = { 0 };
11398+
protectedMem.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES;
11399+
11400+
VkPhysicalDeviceSamplerYcbcrConversionFeatures ycbcr = { 0 };
11401+
ycbcr.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES;
11402+
11403+
VkPhysicalDeviceShaderDrawParametersFeatures drawParams = { 0 };
11404+
drawParams.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES;
11405+
11406+
VkPhysicalDeviceVariablePointersFeatures varPointers = { 0 };
11407+
varPointers.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES;
11408+
11409+
VkPhysicalDeviceFeatures2 supportedFeatureList = { 0 };
11410+
supportedFeatureList.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
11411+
supportedFeatureList.pNext = &storage;
11412+
storage.pNext = &multiview;
11413+
multiview.pNext = &protectedMem;
11414+
protectedMem.pNext = &ycbcr;
11415+
ycbcr.pNext = &drawParams;
11416+
drawParams.pNext = &varPointers;
11417+
11418+
renderer->vkGetPhysicalDeviceFeatures2(physicalDevice, &supportedFeatureList);
11419+
11420+
// Pack the results into the post-1.2 structure for easier checking
11421+
VkPhysicalDeviceVulkan11Features vk11Features = { 0 };
11422+
vk11Features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES;
11423+
vk11Features.storageBuffer16BitAccess = storage.storageBuffer16BitAccess;
11424+
vk11Features.uniformAndStorageBuffer16BitAccess = storage.uniformAndStorageBuffer16BitAccess;
11425+
vk11Features.storagePushConstant16 = storage.storagePushConstant16;
11426+
vk11Features.storageInputOutput16 = storage.storageInputOutput16;
11427+
vk11Features.multiview = multiview.multiview;
11428+
vk11Features.multiviewGeometryShader = multiview.multiviewGeometryShader;
11429+
vk11Features.multiviewTessellationShader = multiview.multiviewTessellationShader;
11430+
vk11Features.protectedMemory = protectedMem.protectedMemory;
11431+
vk11Features.samplerYcbcrConversion = ycbcr.samplerYcbcrConversion;
11432+
vk11Features.shaderDrawParameters = drawParams.shaderDrawParameters;
11433+
vk11Features.variablePointers = varPointers.variablePointers;
11434+
vk11Features.variablePointersStorageBuffer = varPointers.variablePointersStorageBuffer;
11435+
11436+
// Check support
11437+
supportsAllFeatures &= VULKAN_INTERNAL_ValidateOptInVulkan10Features(&renderer->desiredVulkan10DeviceFeatures, vk10Features);
11438+
supportsAllFeatures &= VULKAN_INTERNAL_ValidateOptInVulkan11Features(&renderer->desiredVulkan11DeviceFeatures, &vk11Features);
11439+
} else {
11440+
VkPhysicalDeviceVulkan11Features vk11Features = { 0 };
11441+
vk11Features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES;
11442+
11443+
VkPhysicalDeviceVulkan12Features vk12Features = { 0 };
11444+
vk12Features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES;
11445+
11446+
VkPhysicalDeviceVulkan13Features vk13Features = { 0 };
11447+
vk13Features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES;
11448+
11449+
VkPhysicalDeviceFeatures2 supportedFeatureList = { 0 };
11450+
supportedFeatureList.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
11451+
supportedFeatureList.pNext = &vk11Features;
11452+
vk11Features.pNext = &vk12Features;
11453+
vk12Features.pNext = &vk13Features;
11454+
11455+
renderer->vkGetPhysicalDeviceFeatures2(physicalDevice, &supportedFeatureList);
11456+
11457+
supportsAllFeatures &= VULKAN_INTERNAL_ValidateOptInVulkan10Features(&renderer->desiredVulkan10DeviceFeatures, vk10Features);
11458+
supportsAllFeatures &= VULKAN_INTERNAL_ValidateOptInVulkan11Features(&renderer->desiredVulkan11DeviceFeatures, &vk11Features);
11459+
supportsAllFeatures &= VULKAN_INTERNAL_ValidateOptInVulkan12Features(&renderer->desiredVulkan12DeviceFeatures, &vk12Features);
11460+
supportsAllFeatures &= VULKAN_INTERNAL_ValidateOptInVulkan13Features(&renderer->desiredVulkan13DeviceFeatures, &vk13Features);
11461+
}
11462+
11463+
return supportsAllFeatures;
11464+
}
11465+
1138311466
static void VULKAN_INTERNAL_AddDeviceFeatures(VkBool32 *firstFeature, VkBool32 *lastFeature, VkBool32 *firstFeatureToAdd)
1138411467
{
1138511468
while (firstFeature <= lastFeature) {
@@ -11536,9 +11619,9 @@ static bool VULKAN_INTERNAL_AddOptInVulkanOptions(SDL_PropertiesID props, Vulkan
1153611619
&features->robustBufferAccess);
1153711620
}
1153811621

11539-
bool supportsHigherLevelFeatures = renderer->desiredApiVersion != VK_API_VERSION_1_0;
11622+
bool supportsHigherLevelFeatures = renderer->desiredApiVersion > VK_API_VERSION_1_0;
1154011623
if (supportsHigherLevelFeatures && options->feature_list) {
11541-
if (renderer->desiredApiVersion == VK_API_VERSION_1_1) {
11624+
if (renderer->desiredApiVersion < VK_API_VERSION_1_2) {
1154211625
// Iterate through the entire list and combine all requested features
1154311626
VkBaseOutStructure *nextStructure = (VkBaseOutStructure *)options->feature_list;
1154411627
while (nextStructure) {
@@ -11740,31 +11823,7 @@ static Uint8 VULKAN_INTERNAL_IsDeviceSuitable(
1174011823

1174111824
// Check opt-in device features
1174211825
if (renderer->usesCustomVulkanOptions) {
11743-
VkPhysicalDeviceFeatures2 featureList = { 0 };
11744-
featureList.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
11745-
11746-
VkPhysicalDeviceVulkan11Features vk11Features = { 0 };
11747-
vk11Features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES;
11748-
11749-
VkPhysicalDeviceVulkan12Features vk12Features = { 0 };
11750-
vk12Features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES;
11751-
11752-
VkPhysicalDeviceVulkan13Features vk13Features = { 0 };
11753-
vk13Features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES;
11754-
11755-
featureList.pNext = &vk11Features;
11756-
vk11Features.pNext = &vk12Features;
11757-
vk12Features.pNext = &vk13Features;
11758-
11759-
renderer->vkGetPhysicalDeviceFeatures2(
11760-
physicalDevice,
11761-
&featureList);
11762-
11763-
bool supportsAllFeatures = VULKAN_INTERNAL_ValidateOptInVulkan10Features(&renderer->desiredVulkan10DeviceFeatures, &featureList.features);
11764-
supportsAllFeatures &= VULKAN_INTERNAL_ValidateOptInVulkan11Features(&renderer->desiredVulkan11DeviceFeatures, &vk11Features);
11765-
supportsAllFeatures &= VULKAN_INTERNAL_ValidateOptInVulkan12Features(&renderer->desiredVulkan12DeviceFeatures, &vk12Features);
11766-
supportsAllFeatures &= VULKAN_INTERNAL_ValidateOptInVulkan13Features(&renderer->desiredVulkan13DeviceFeatures, &vk13Features);
11767-
11826+
bool supportsAllFeatures = VULKAN_INTERNAL_ValidateOptInFeatures(renderer, physicalDevice, &deviceFeatures);
1176811827
if (!supportsAllFeatures) {
1176911828
return 0;
1177011829
}

0 commit comments

Comments
 (0)