@@ -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+
1138311466static 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