@@ -50,7 +50,8 @@ const std::vector<const char*> kOptionalDeviceExtensions =
50
50
VK_KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME,
51
51
VK_KHR_PRESENT_WAIT_EXTENSION_NAME,
52
52
VK_KHR_PRESENT_ID_EXTENSION_NAME,
53
- VK_EXT_DEPTH_CLIP_ENABLE_EXTENSION_NAME
53
+ VK_EXT_DEPTH_CLIP_ENABLE_EXTENSION_NAME,
54
+ VK_EXT_PIPELINE_ROBUSTNESS_EXTENSION_NAME
54
55
};
55
56
56
57
const std::vector<const char *> kRequiredDeviceExtensions =
@@ -263,6 +264,14 @@ void VulkanRenderer::GetDeviceFeatures()
263
264
pwf.pNext = prevStruct;
264
265
prevStruct = &pwf;
265
266
267
+ VkPhysicalDevicePipelineRobustnessFeaturesEXT pprf{};
268
+ if (m_featureControl.deviceExtensions .pipeline_robustness )
269
+ {
270
+ pprf.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_FEATURES_EXT;
271
+ pprf.pNext = prevStruct;
272
+ prevStruct = &pprf;
273
+ }
274
+
266
275
VkPhysicalDeviceFeatures2 physicalDeviceFeatures2{};
267
276
physicalDeviceFeatures2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
268
277
physicalDeviceFeatures2.pNext = prevStruct;
@@ -317,6 +326,11 @@ void VulkanRenderer::GetDeviceFeatures()
317
326
{
318
327
cemuLog_log (LogType::Force, " VK_EXT_depth_clip_enable not supported" );
319
328
}
329
+ if (m_featureControl.deviceExtensions .pipeline_robustness )
330
+ {
331
+ if ( pprf.pipelineRobustness != VK_TRUE )
332
+ m_featureControl.deviceExtensions .pipeline_robustness = false ;
333
+ }
320
334
// get limits
321
335
m_featureControl.limits .minUniformBufferOffsetAlignment = std::max (prop2.properties .limits .minUniformBufferOffsetAlignment , (VkDeviceSize)4 );
322
336
m_featureControl.limits .nonCoherentAtomSize = std::max (prop2.properties .limits .nonCoherentAtomSize , (VkDeviceSize)4 );
@@ -475,11 +489,17 @@ VulkanRenderer::VulkanRenderer()
475
489
deviceFeatures.occlusionQueryPrecise = VK_TRUE;
476
490
deviceFeatures.depthClamp = VK_TRUE;
477
491
deviceFeatures.depthBiasClamp = VK_TRUE;
478
- if (m_vendor == GfxVendor::AMD)
492
+
493
+ if (m_featureControl.deviceExtensions .pipeline_robustness )
479
494
{
495
+ deviceFeatures.robustBufferAccess = VK_FALSE;
496
+ }
497
+ else
498
+ {
499
+ cemuLog_log (LogType::Force, " VK_EXT_pipeline_robustness not supported. Falling back to robustBufferAccess" );
480
500
deviceFeatures.robustBufferAccess = VK_TRUE;
481
- cemuLog_log (LogType::Force, " Enable robust buffer access" );
482
501
}
502
+
483
503
if (m_featureControl.mode .useTFEmulationViaSSBO )
484
504
{
485
505
deviceFeatures.vertexPipelineStoresAndAtomics = true ;
@@ -524,6 +544,15 @@ VulkanRenderer::VulkanRenderer()
524
544
deviceExtensionFeatures = &presentWaitFeature;
525
545
presentWaitFeature.presentWait = VK_TRUE;
526
546
}
547
+ // enable VK_EXT_pipeline_robustness
548
+ VkPhysicalDevicePipelineRobustnessFeaturesEXT pipelineRobustnessFeature{};
549
+ if (m_featureControl.deviceExtensions .pipeline_robustness )
550
+ {
551
+ pipelineRobustnessFeature.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_FEATURES_EXT;
552
+ pipelineRobustnessFeature.pNext = deviceExtensionFeatures;
553
+ deviceExtensionFeatures = &pipelineRobustnessFeature;
554
+ pipelineRobustnessFeature.pipelineRobustness = VK_TRUE;
555
+ }
527
556
528
557
std::vector<const char *> used_extensions;
529
558
VkDeviceCreateInfo createInfo = CreateDeviceCreateInfo (queueCreateInfos, deviceFeatures, deviceExtensionFeatures, used_extensions);
@@ -1127,6 +1156,8 @@ VkDeviceCreateInfo VulkanRenderer::CreateDeviceCreateInfo(const std::vector<VkDe
1127
1156
used_extensions.emplace_back (VK_KHR_PRESENT_ID_EXTENSION_NAME);
1128
1157
used_extensions.emplace_back (VK_KHR_PRESENT_WAIT_EXTENSION_NAME);
1129
1158
}
1159
+ if (m_featureControl.deviceExtensions .pipeline_robustness )
1160
+ used_extensions.emplace_back (VK_EXT_PIPELINE_ROBUSTNESS_EXTENSION_NAME);
1130
1161
1131
1162
VkDeviceCreateInfo createInfo{};
1132
1163
createInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
@@ -1224,6 +1255,7 @@ bool VulkanRenderer::CheckDeviceExtensionSupport(const VkPhysicalDevice device,
1224
1255
info.deviceExtensions .shader_float_controls = isExtensionAvailable (VK_KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME);
1225
1256
info.deviceExtensions .dynamic_rendering = false ; // isExtensionAvailable(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
1226
1257
info.deviceExtensions .depth_clip_enable = isExtensionAvailable (VK_EXT_DEPTH_CLIP_ENABLE_EXTENSION_NAME);
1258
+ info.deviceExtensions .pipeline_robustness = isExtensionAvailable (VK_EXT_PIPELINE_ROBUSTNESS_EXTENSION_NAME);
1227
1259
// dynamic rendering doesn't provide any benefits for us right now. Driver implementations are very unoptimized as of Feb 2022
1228
1260
info.deviceExtensions .present_wait = isExtensionAvailable (VK_KHR_PRESENT_WAIT_EXTENSION_NAME) && isExtensionAvailable (VK_KHR_PRESENT_ID_EXTENSION_NAME);
1229
1261
0 commit comments