Skip to content

Commit 6347849

Browse files
committed
Fix Enabling of Extensions in CVulkanPhysicalDevice
1 parent d82c005 commit 6347849

File tree

2 files changed

+34
-9
lines changed

2 files changed

+34
-9
lines changed

examples_tests/56.RayQuery/main.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,12 @@ class RayQuerySampleApp : public ApplicationBase
188188
CommonAPI::SFeatureRequest<video::IAPIConnection::E_FEATURE> optionalInstanceFeatures = {};
189189

190190
CommonAPI::SFeatureRequest<video::ILogicalDevice::E_FEATURE> requiredDeviceFeatures = {};
191-
video::ILogicalDevice::E_FEATURE requiredFeatures_Device[] = { video::ILogicalDevice::EF_SWAPCHAIN, video::ILogicalDevice::EF_RAY_QUERY, video::ILogicalDevice::EF_ACCELERATION_STRUCTURE };
191+
video::ILogicalDevice::E_FEATURE requiredFeatures_Device[] =
192+
{
193+
video::ILogicalDevice::EF_SWAPCHAIN,
194+
video::ILogicalDevice::EF_ACCELERATION_STRUCTURE,
195+
video::ILogicalDevice::EF_RAY_QUERY
196+
};
192197
requiredDeviceFeatures.count = 3u;
193198
requiredDeviceFeatures.features = requiredFeatures_Device;
194199

src/nbl/video/CVulkanPhysicalDevice.h

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -358,40 +358,60 @@ class CVulkanPhysicalDevice final : public IPhysicalDevice
358358
selectedFeatures[i++] = feature.c_str();
359359
}
360360

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};
364378
if (selectedFeatureSet.find(VK_KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME) != selectedFeatureSet.end())
365379
{
366380
accelerationStructureFeatures.accelerationStructure = m_features.accelerationStructure;
367381
accelerationStructureFeatures.accelerationStructureCaptureReplay = m_features.accelerationStructureCaptureReplay;
368382
accelerationStructureFeatures.accelerationStructureIndirectBuild = m_features.accelerationStructureIndirectBuild;
369383
accelerationStructureFeatures.accelerationStructureHostCommands = m_features.accelerationStructureHostCommands;
370384
accelerationStructureFeatures.descriptorBindingAccelerationStructureUpdateAfterBind = m_features.descriptorBindingAccelerationStructureUpdateAfterBind;
385+
addFeatureToChain(&accelerationStructureFeatures);
371386
}
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};
373389
if (selectedFeatureSet.find(VK_KHR_RAY_TRACING_PIPELINE_EXTENSION_NAME) != selectedFeatureSet.end())
374390
{
375391
rayTracingPipelineFeatures.rayTracingPipeline = m_features.rayTracingPipeline;
376392
rayTracingPipelineFeatures.rayTracingPipelineShaderGroupHandleCaptureReplay = m_features.rayTracingPipelineShaderGroupHandleCaptureReplay;
377393
rayTracingPipelineFeatures.rayTracingPipelineShaderGroupHandleCaptureReplayMixed = m_features.rayTracingPipelineShaderGroupHandleCaptureReplayMixed;
378394
rayTracingPipelineFeatures.rayTracingPipelineTraceRaysIndirect = m_features.rayTracingPipelineTraceRaysIndirect;
379395
rayTracingPipelineFeatures.rayTraversalPrimitiveCulling = m_features.rayTraversalPrimitiveCulling;
396+
addFeatureToChain(&rayTracingPipelineFeatures);
380397
}
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};
382400
if (selectedFeatureSet.find(VK_KHR_RAY_QUERY_EXTENSION_NAME) != selectedFeatureSet.end())
383401
{
384402
rayQueryFeatures.rayQuery = m_features.rayQuery;
403+
addFeatureToChain(&rayQueryFeatures);
385404
}
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};
388407
if (selectedFeatureSet.find(VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME) != selectedFeatureSet.end())
389408
{
390409
bufferDeviceAddressFeatures.bufferDeviceAddress = m_features.bufferDeviceAddress;
410+
addFeatureToChain(&bufferDeviceAddressFeatures);
391411
}
392412

393413
VkPhysicalDeviceFeatures2 vk_deviceFeatures2 = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2 };
394-
vk_deviceFeatures2.pNext = &bufferDeviceAddressFeatures;
414+
vk_deviceFeatures2.pNext = firstFeatureInChain;
395415
vk_deviceFeatures2.features = {};
396416

397417
// Create Device

0 commit comments

Comments
 (0)