summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
m---------external/vulkan0
-rw-r--r--slang-gfx.h9
-rw-r--r--tools/gfx/vulkan/vk-api.h6
-rw-r--r--tools/gfx/vulkan/vk-device.cpp35
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;
}