@@ -1088,6 +1088,7 @@ struct VulkanRenderer
1088
1088
VkPhysicalDevice physicalDevice ;
1089
1089
VkPhysicalDeviceProperties2KHR physicalDeviceProperties ;
1090
1090
VkPhysicalDeviceDriverPropertiesKHR physicalDeviceDriverProperties ;
1091
+ VkPhysicalDeviceFeatures desiredDeviceFeatures ;
1091
1092
VkDevice logicalDevice ;
1092
1093
Uint8 integratedMemoryNotification ;
1093
1094
Uint8 outOfDeviceLocalMemoryWarning ;
@@ -11220,12 +11221,14 @@ static Uint8 VULKAN_INTERNAL_IsDeviceSuitable(
11220
11221
renderer -> vkGetPhysicalDeviceFeatures (
11221
11222
physicalDevice ,
11222
11223
& deviceFeatures );
11223
- if (!deviceFeatures .independentBlend ||
11224
- !deviceFeatures .imageCubeArray ||
11225
- !deviceFeatures .depthClamp ||
11226
- !deviceFeatures .shaderClipDistance ||
11227
- !deviceFeatures .drawIndirectFirstInstance ||
11228
- !deviceFeatures .sampleRateShading ) {
11224
+
11225
+ if ((!deviceFeatures .independentBlend && renderer -> desiredDeviceFeatures .independentBlend ) ||
11226
+ (!deviceFeatures .imageCubeArray && renderer -> desiredDeviceFeatures .imageCubeArray ) ||
11227
+ (!deviceFeatures .depthClamp && renderer -> desiredDeviceFeatures .depthClamp ) ||
11228
+ (!deviceFeatures .shaderClipDistance && renderer -> desiredDeviceFeatures .shaderClipDistance ) ||
11229
+ (!deviceFeatures .drawIndirectFirstInstance && renderer -> desiredDeviceFeatures .drawIndirectFirstInstance ) ||
11230
+ (!deviceFeatures .sampleRateShading && renderer -> desiredDeviceFeatures .sampleRateShading ) ||
11231
+ (!deviceFeatures .samplerAnisotropy && renderer -> desiredDeviceFeatures .samplerAnisotropy )) {
11229
11232
return 0 ;
11230
11233
}
11231
11234
@@ -11441,7 +11444,6 @@ static Uint8 VULKAN_INTERNAL_CreateLogicalDevice(
11441
11444
{
11442
11445
VkResult vulkanResult ;
11443
11446
VkDeviceCreateInfo deviceCreateInfo ;
11444
- VkPhysicalDeviceFeatures desiredDeviceFeatures ;
11445
11447
VkPhysicalDeviceFeatures haveDeviceFeatures ;
11446
11448
VkPhysicalDevicePortabilitySubsetFeaturesKHR portabilityFeatures ;
11447
11449
const char * * deviceExtensions ;
@@ -11465,22 +11467,13 @@ static Uint8 VULKAN_INTERNAL_CreateLogicalDevice(
11465
11467
11466
11468
// specifying used device features
11467
11469
11468
- SDL_zero (desiredDeviceFeatures );
11469
- desiredDeviceFeatures .independentBlend = VK_TRUE ;
11470
- desiredDeviceFeatures .samplerAnisotropy = VK_TRUE ;
11471
- desiredDeviceFeatures .imageCubeArray = VK_TRUE ;
11472
- desiredDeviceFeatures .depthClamp = VK_TRUE ;
11473
- desiredDeviceFeatures .shaderClipDistance = VK_TRUE ;
11474
- desiredDeviceFeatures .drawIndirectFirstInstance = VK_TRUE ;
11475
- desiredDeviceFeatures .sampleRateShading = VK_TRUE ;
11476
-
11477
11470
if (haveDeviceFeatures .fillModeNonSolid ) {
11478
- desiredDeviceFeatures .fillModeNonSolid = VK_TRUE ;
11471
+ renderer -> desiredDeviceFeatures .fillModeNonSolid = VK_TRUE ;
11479
11472
renderer -> supportsFillModeNonSolid = true;
11480
11473
}
11481
11474
11482
11475
if (haveDeviceFeatures .multiDrawIndirect ) {
11483
- desiredDeviceFeatures .multiDrawIndirect = VK_TRUE ;
11476
+ renderer -> desiredDeviceFeatures .multiDrawIndirect = VK_TRUE ;
11484
11477
renderer -> supportsMultiDrawIndirect = true;
11485
11478
}
11486
11479
@@ -11521,7 +11514,7 @@ static Uint8 VULKAN_INTERNAL_CreateLogicalDevice(
11521
11514
deviceCreateInfo .enabledExtensionCount );
11522
11515
CreateDeviceExtensionArray (& renderer -> supports , deviceExtensions );
11523
11516
deviceCreateInfo .ppEnabledExtensionNames = deviceExtensions ;
11524
- deviceCreateInfo .pEnabledFeatures = & desiredDeviceFeatures ;
11517
+ deviceCreateInfo .pEnabledFeatures = & renderer -> desiredDeviceFeatures ;
11525
11518
11526
11519
vulkanResult = renderer -> vkCreateDevice (
11527
11520
renderer -> physicalDevice ,
@@ -11606,7 +11599,7 @@ static bool VULKAN_INTERNAL_PrepareVulkan(
11606
11599
return true;
11607
11600
}
11608
11601
11609
- static bool VULKAN_PrepareDriver (SDL_VideoDevice * _this )
11602
+ static bool VULKAN_PrepareDriver (SDL_VideoDevice * _this , SDL_PropertiesID props )
11610
11603
{
11611
11604
// Set up dummy VulkanRenderer
11612
11605
VulkanRenderer * renderer ;
@@ -11622,6 +11615,17 @@ static bool VULKAN_PrepareDriver(SDL_VideoDevice *_this)
11622
11615
11623
11616
renderer = (VulkanRenderer * )SDL_calloc (1 , sizeof (* renderer ));
11624
11617
if (renderer ) {
11618
+ // Opt out device features (higher compatibility in exchange for reduced functionality)
11619
+ renderer -> desiredDeviceFeatures .samplerAnisotropy = SDL_GetBooleanProperty (props , SDL_PROP_GPU_DEVICE_CREATE_VULKAN_SAMPLERANISOTROPY_BOOLEAN , true) ? VK_TRUE : VK_FALSE ;
11620
+ renderer -> desiredDeviceFeatures .depthClamp = SDL_GetBooleanProperty (props , SDL_PROP_GPU_DEVICE_CREATE_VULKAN_DEPTHCLAMP_BOOLEAN , true) ? VK_TRUE : VK_FALSE ;
11621
+ renderer -> desiredDeviceFeatures .shaderClipDistance = SDL_GetBooleanProperty (props , SDL_PROP_GPU_DEVICE_CREATE_VULKAN_SHADERCLIPDISTANCE_BOOLEAN , true) ? VK_TRUE : VK_FALSE ;
11622
+ renderer -> desiredDeviceFeatures .drawIndirectFirstInstance = SDL_GetBooleanProperty (props , SDL_PROP_GPU_DEVICE_CREATE_VULKAN_DRAWINDIRECTFIRST_BOOLEAN , true) ? VK_TRUE : VK_FALSE ;
11623
+
11624
+ // These features have near universal support so they are always enabled
11625
+ renderer -> desiredDeviceFeatures .independentBlend = VK_TRUE ;
11626
+ renderer -> desiredDeviceFeatures .sampleRateShading = VK_TRUE ;
11627
+ renderer -> desiredDeviceFeatures .imageCubeArray = VK_TRUE ;
11628
+
11625
11629
result = VULKAN_INTERNAL_PrepareVulkan (renderer );
11626
11630
if (result ) {
11627
11631
renderer -> vkDestroyInstance (renderer -> instance , NULL );
@@ -11660,6 +11664,17 @@ static SDL_GPUDevice *VULKAN_CreateDevice(bool debugMode, bool preferLowPower, S
11660
11664
renderer -> preferLowPower = preferLowPower ;
11661
11665
renderer -> allowedFramesInFlight = 2 ;
11662
11666
11667
+ // Opt out device features (higher compatibility in exchange for reduced functionality)
11668
+ renderer -> desiredDeviceFeatures .samplerAnisotropy = SDL_GetBooleanProperty (props , SDL_PROP_GPU_DEVICE_CREATE_VULKAN_SAMPLERANISOTROPY_BOOLEAN , true) ? VK_TRUE : VK_FALSE ;
11669
+ renderer -> desiredDeviceFeatures .depthClamp = SDL_GetBooleanProperty (props , SDL_PROP_GPU_DEVICE_CREATE_VULKAN_DEPTHCLAMP_BOOLEAN , true) ? VK_TRUE : VK_FALSE ;
11670
+ renderer -> desiredDeviceFeatures .shaderClipDistance = SDL_GetBooleanProperty (props , SDL_PROP_GPU_DEVICE_CREATE_VULKAN_SHADERCLIPDISTANCE_BOOLEAN , true) ? VK_TRUE : VK_FALSE ;
11671
+ renderer -> desiredDeviceFeatures .drawIndirectFirstInstance = SDL_GetBooleanProperty (props , SDL_PROP_GPU_DEVICE_CREATE_VULKAN_DRAWINDIRECTFIRST_BOOLEAN , true) ? VK_TRUE : VK_FALSE ;
11672
+
11673
+ // These features have near universal support so they are always enabled
11674
+ renderer -> desiredDeviceFeatures .independentBlend = VK_TRUE ;
11675
+ renderer -> desiredDeviceFeatures .sampleRateShading = VK_TRUE ;
11676
+ renderer -> desiredDeviceFeatures .imageCubeArray = VK_TRUE ;
11677
+
11663
11678
if (!VULKAN_INTERNAL_PrepareVulkan (renderer )) {
11664
11679
SDL_free (renderer );
11665
11680
SDL_Vulkan_UnloadLibrary ();
0 commit comments