@@ -358,40 +358,60 @@ class CVulkanPhysicalDevice final : public IPhysicalDevice
358
358
selectedFeatures[i++] = feature.c_str ();
359
359
}
360
360
361
- // Currently enabling all features supported by the GPU, for the following extensions
362
- // @Erfan you can cherry pick the ones you want
363
- VkPhysicalDeviceAccelerationStructureFeaturesKHR accelerationStructureFeatures = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR };
361
+ void * firstFeatureInChain = nullptr ;
362
+
363
+ // Vulkan has problems with having features in the feature chain that have values set to false.
364
+ // For example having an empty "RayTracingPipelineFeaturesKHR" in the chain will lead to validation errors for RayQueryONLY applications.
365
+ auto addFeatureToChain = [&firstFeatureInChain](void * feature) -> void
366
+ {
367
+ struct VulkanStructHeader
368
+ {
369
+ VkStructureType sType ;
370
+ void * pNext;
371
+ };
372
+ VulkanStructHeader* enabledExtStructPtr = reinterpret_cast <VulkanStructHeader*>(feature);
373
+ enabledExtStructPtr->pNext = firstFeatureInChain;
374
+ firstFeatureInChain = feature;
375
+ };
376
+
377
+ VkPhysicalDeviceAccelerationStructureFeaturesKHR accelerationStructureFeatures = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR};
364
378
if (selectedFeatureSet.find (VK_KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME) != selectedFeatureSet.end ())
365
379
{
366
380
accelerationStructureFeatures.accelerationStructure = m_features.accelerationStructure ;
367
381
accelerationStructureFeatures.accelerationStructureCaptureReplay = m_features.accelerationStructureCaptureReplay ;
368
382
accelerationStructureFeatures.accelerationStructureIndirectBuild = m_features.accelerationStructureIndirectBuild ;
369
383
accelerationStructureFeatures.accelerationStructureHostCommands = m_features.accelerationStructureHostCommands ;
370
384
accelerationStructureFeatures.descriptorBindingAccelerationStructureUpdateAfterBind = m_features.descriptorBindingAccelerationStructureUpdateAfterBind ;
385
+ addFeatureToChain (&accelerationStructureFeatures);
371
386
}
372
- VkPhysicalDeviceRayTracingPipelineFeaturesKHR rayTracingPipelineFeatures = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR, &accelerationStructureFeatures };
387
+
388
+ VkPhysicalDeviceRayTracingPipelineFeaturesKHR rayTracingPipelineFeatures = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR};
373
389
if (selectedFeatureSet.find (VK_KHR_RAY_TRACING_PIPELINE_EXTENSION_NAME) != selectedFeatureSet.end ())
374
390
{
375
391
rayTracingPipelineFeatures.rayTracingPipeline = m_features.rayTracingPipeline ;
376
392
rayTracingPipelineFeatures.rayTracingPipelineShaderGroupHandleCaptureReplay = m_features.rayTracingPipelineShaderGroupHandleCaptureReplay ;
377
393
rayTracingPipelineFeatures.rayTracingPipelineShaderGroupHandleCaptureReplayMixed = m_features.rayTracingPipelineShaderGroupHandleCaptureReplayMixed ;
378
394
rayTracingPipelineFeatures.rayTracingPipelineTraceRaysIndirect = m_features.rayTracingPipelineTraceRaysIndirect ;
379
395
rayTracingPipelineFeatures.rayTraversalPrimitiveCulling = m_features.rayTraversalPrimitiveCulling ;
396
+ addFeatureToChain (&rayTracingPipelineFeatures);
380
397
}
381
- VkPhysicalDeviceRayQueryFeaturesKHR rayQueryFeatures = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR, &rayTracingPipelineFeatures };
398
+
399
+ VkPhysicalDeviceRayQueryFeaturesKHR rayQueryFeatures = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR};
382
400
if (selectedFeatureSet.find (VK_KHR_RAY_QUERY_EXTENSION_NAME) != selectedFeatureSet.end ())
383
401
{
384
402
rayQueryFeatures.rayQuery = m_features.rayQuery ;
403
+ addFeatureToChain (&rayQueryFeatures);
385
404
}
386
-
387
- VkPhysicalDeviceBufferDeviceAddressFeaturesKHR bufferDeviceAddressFeatures = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_KHR, &rayQueryFeatures };
405
+
406
+ VkPhysicalDeviceBufferDeviceAddressFeaturesKHR bufferDeviceAddressFeatures = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_KHR};
388
407
if (selectedFeatureSet.find (VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME) != selectedFeatureSet.end ())
389
408
{
390
409
bufferDeviceAddressFeatures.bufferDeviceAddress = m_features.bufferDeviceAddress ;
410
+ addFeatureToChain (&bufferDeviceAddressFeatures);
391
411
}
392
412
393
413
VkPhysicalDeviceFeatures2 vk_deviceFeatures2 = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2 };
394
- vk_deviceFeatures2.pNext = &bufferDeviceAddressFeatures ;
414
+ vk_deviceFeatures2.pNext = firstFeatureInChain ;
395
415
vk_deviceFeatures2.features = {};
396
416
397
417
// Create Device
0 commit comments