diff options
| author | ccummingsNV <ccummings@nvidia.com> | 2024-06-27 16:25:07 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-06-27 17:25:07 +0200 |
| commit | 1d4db4224bd981b54b1e5f260a232a1183bbdcda (patch) | |
| tree | bc1503383b3d5a9207d20e08b0c043e50b44526f | |
| parent | 7751963f14544fdb6d606a8017f58d131c852ad2 (diff) | |
Ray tracing validation (#4418)
* Ray tracing validation in Vulkan
* Clean up RT validation code
* Remove redundant api additions
* Remove redundant debug utils callback
* Ray tracing validation uses extended descriptor for initialization
---------
Co-authored-by: Chris Cummings <chriscummings@nvidia.com>
Co-authored-by: Jay Kwak <82421531+jkwak-work@users.noreply.github.com>
Co-authored-by: skallweitNV <64953474+skallweitNV@users.noreply.github.com>
| m--------- | external/vulkan | 0 | ||||
| -rw-r--r-- | slang-gfx.h | 9 | ||||
| -rw-r--r-- | tools/gfx/vulkan/vk-api.h | 6 | ||||
| -rw-r--r-- | tools/gfx/vulkan/vk-device.cpp | 35 |
4 files changed, 48 insertions, 2 deletions
diff --git a/external/vulkan b/external/vulkan -Subproject 2634c969d7dc0e983f005f7f2e665cce8449efe +Subproject 577baa05033cf1d9236b3d078ca4b3269ed87a2 diff --git a/slang-gfx.h b/slang-gfx.h index 0ecae4f31..d273ce427 100644 --- a/slang-gfx.h +++ b/slang-gfx.h @@ -56,7 +56,7 @@ const uint64_t kTimeoutInfinite = 0xFFFFFFFFFFFFFFFF; enum class StructType { - D3D12DeviceExtendedDesc, D3D12ExperimentalFeaturesDesc, SlangSessionExtendedDesc + D3D12DeviceExtendedDesc, D3D12ExperimentalFeaturesDesc, SlangSessionExtendedDesc, RayTracingValidationDesc }; // TODO: Rename to Stage @@ -2738,4 +2738,11 @@ struct SlangSessionExtendedDesc slang::CompilerOptionEntry* compilerOptionEntries = nullptr; }; +/// Whether to enable ray tracing validation (currently only Vulkan - D3D requires app layer to use NVAPI) +struct RayTracingValidationDesc +{ + StructType structType = StructType::RayTracingValidationDesc; + bool enableRaytracingValidation = false; +}; + } diff --git a/tools/gfx/vulkan/vk-api.h b/tools/gfx/vulkan/vk-api.h index ff97da448..70af62ed1 100644 --- a/tools/gfx/vulkan/vk-api.h +++ b/tools/gfx/vulkan/vk-api.h @@ -315,6 +315,12 @@ struct VulkanExtendedFeatureProperties VkPhysicalDeviceVulkan12Features vulkan12Features = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES }; + + // Ray tracing validation features + VkPhysicalDeviceRayTracingValidationFeaturesNV rayTracingValidationFeatures = { + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_VALIDATION_FEATURES_NV + }; + }; struct VulkanApi diff --git a/tools/gfx/vulkan/vk-device.cpp b/tools/gfx/vulkan/vk-device.cpp index b2c14873a..bc1641aff 100644 --- a/tools/gfx/vulkan/vk-device.cpp +++ b/tools/gfx/vulkan/vk-device.cpp @@ -161,6 +161,22 @@ Result DeviceImpl::initVulkanInstanceAndDevice( m_queueAllocCount = 0; + bool enableRayTracingValidation = false; + + // Read properties from extended device descriptions + for (GfxIndex i = 0; i < m_desc.extendedDescCount; i++) + { + StructType stype; + memcpy(&stype, m_desc.extendedDescs[i], sizeof(stype)); + switch (stype) + { + case StructType::RayTracingValidationDesc: + enableRayTracingValidation = static_cast<RayTracingValidationDesc*>(m_desc.extendedDescs[i])->enableRaytracingValidation; + break; + } + } + + VkInstance instance = VK_NULL_HANDLE; if (handles[0].handleValue == 0) { @@ -288,7 +304,8 @@ Result DeviceImpl::initVulkanInstanceAndDevice( if (!instance) return SLANG_FAIL; SLANG_RETURN_ON_FAIL(m_api.initInstanceProcs(instance)); - if (useValidationLayer && m_api.vkCreateDebugReportCallbackEXT) + + if ((enableRayTracingValidation || useValidationLayer) && m_api.vkCreateDebugReportCallbackEXT) { VkDebugReportFlagsEXT debugFlags = VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT; @@ -512,6 +529,10 @@ Result DeviceImpl::initVulkanInstanceAndDevice( extendedFeatures.fragmentShadingRateFeatures.pNext = deviceFeatures2.pNext; deviceFeatures2.pNext = &extendedFeatures.fragmentShadingRateFeatures; + // raytracing validation features + extendedFeatures.rayTracingValidationFeatures.pNext = deviceFeatures2.pNext; + deviceFeatures2.pNext = &extendedFeatures.rayTracingValidationFeatures; + if (VK_MAKE_VERSION(majorVersion, minorVersion, 0) >= VK_API_VERSION_1_2) { extendedFeatures.vulkan12Features.pNext = deviceFeatures2.pNext; @@ -697,6 +718,17 @@ Result DeviceImpl::initVulkanInstanceAndDevice( "computeDerivativeGroupLinear" ); + // Only enable raytracing validation if both requested and supported + if(enableRayTracingValidation && extendedFeatures.rayTracingValidationFeatures.rayTracingValidation) + { + SIMPLE_EXTENSION_FEATURE( + extendedFeatures.rayTracingValidationFeatures, + rayTracingValidation, + VK_NV_RAY_TRACING_VALIDATION_EXTENSION_NAME, + "ray-tracing-validation" + ); + } + #undef SIMPLE_EXTENSION_FEATURE if (extendedFeatures.vulkan12Features.shaderBufferInt64Atomics) @@ -934,6 +966,7 @@ Result DeviceImpl::initVulkanInstanceAndDevice( { installPipelineDumpLayer(m_api); } + return SLANG_OK; } |
