Skip to content

Commit e8f4dca

Browse files
Merge pull request #788 from Devsh-Graphics-Programming/ray_query_inline_spirv_example
Ray query inline spirv example
2 parents 38491b8 + 48d4440 commit e8f4dca

File tree

6 files changed

+98
-4
lines changed

6 files changed

+98
-4
lines changed

3rdparty/Vulkan-Headers

Submodule Vulkan-Headers updated 84 files
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
// Copyright (C) 2023 - DevSH Graphics Programming Sp. z O.O.
2+
// This file is part of the "Nabla Engine".
3+
// For conditions of distribution and use, see copyright notice in nabla.h
4+
#ifndef _NBL_BUILTIN_HLSL_SPIRV_INTRINSICS_RAYTRACING_INCLUDED_
5+
#define _NBL_BUILTIN_HLSL_SPIRV_INTRINSICS_RAYTRACING_INCLUDED_
6+
7+
#include "nbl/builtin/hlsl/spirv_intrinsics/core.hlsl"
8+
9+
namespace nbl
10+
{
11+
namespace hlsl
12+
{
13+
namespace spirv
14+
{
15+
16+
//[[vk::ext_capability(spv::CapabilityRayQueryKHR)]] https://github.com/microsoft/DirectXShaderCompiler/issues/6958
17+
using RayQueryKHR = vk::SpirvOpaqueType<spv::OpTypeRayQueryKHR>;
18+
19+
//[[vk::ext_capability(spv::CapabilityAccelerationStructureKHR)]]
20+
using AccelerationStructureKHR = vk::SpirvOpaqueType<spv::OpTypeAccelerationStructureKHR>;
21+
22+
[[vk::ext_instruction(spv::OpConvertUToAccelerationStructureKHR)]]
23+
AccelerationStructureKHR accelerationStructureKHR(uint64_t u);
24+
25+
[[vk::ext_capability(spv::CapabilityRayQueryKHR)]]
26+
[[vk::ext_extension("SPV_KHR_ray_query")]]
27+
[[vk::ext_instruction(spv::OpRayQueryInitializeKHR)]]
28+
void rayQueryInitializeKHR([[vk::ext_reference]] RayQueryKHR query, AccelerationStructureKHR AS, uint32_t flags, uint32_t cullMask, float32_t3 origin, float32_t tmin, float32_t3 direction, float32_t tmax);
29+
30+
[[vk::ext_capability(spv::CapabilityRayQueryKHR)]]
31+
[[vk::ext_extension("SPV_KHR_ray_query")]]
32+
[[vk::ext_instruction(spv::OpRayQueryInitializeKHR)]]
33+
void rayQueryInitializeKHR([[vk::ext_reference]] RayQueryKHR query, RaytracingAccelerationStructure AS, uint32_t flags, uint32_t cullMask, float32_t3 origin, float32_t tmin, float32_t3 direction, float32_t tmax);
34+
35+
[[vk::ext_capability(spv::CapabilityRayQueryKHR)]]
36+
[[vk::ext_extension("SPV_KHR_ray_query")]]
37+
[[vk::ext_instruction(spv::OpRayQueryProceedKHR)]]
38+
bool rayQueryProceedKHR([[vk::ext_reference]] RayQueryKHR query);
39+
40+
[[vk::ext_capability(spv::CapabilityRayQueryKHR)]]
41+
[[vk::ext_extension("SPV_KHR_ray_query")]]
42+
[[vk::ext_instruction(spv::OpRayQueryGetIntersectionTypeKHR)]]
43+
int rayQueryGetIntersectionTypeKHR([[vk::ext_reference]] RayQueryKHR query, uint32_t committed);
44+
45+
[[vk::ext_capability(spv::CapabilityRayQueryKHR)]]
46+
[[vk::ext_extension("SPV_KHR_ray_query")]]
47+
[[vk::ext_instruction(spv::OpRayQueryGetIntersectionInstanceIdKHR)]]
48+
int rayQueryGetIntersectionInstanceIdKHR([[vk::ext_reference]] RayQueryKHR query, uint32_t committed);
49+
50+
[[vk::ext_capability(spv::CapabilityRayQueryKHR)]]
51+
[[vk::ext_extension("SPV_KHR_ray_query")]]
52+
[[vk::ext_instruction(spv::OpRayQueryGetIntersectionPrimitiveIndexKHR)]]
53+
int rayQueryGetIntersectionPrimitiveIndexKHR([[vk::ext_reference]] RayQueryKHR query, uint32_t committed);
54+
55+
[[vk::ext_capability(spv::CapabilityRayQueryKHR)]]
56+
[[vk::ext_extension("SPV_KHR_ray_query")]]
57+
[[vk::ext_instruction(spv::OpRayQueryGetIntersectionBarycentricsKHR)]]
58+
float2 rayQueryGetIntersectionBarycentricsKHR([[vk::ext_reference]] RayQueryKHR query, uint32_t committed);
59+
60+
// position fetch for ray tracing uses gl_HitTriangleVertexPositionsEXT -> HitTriangleVertexPositionsKHR decorated OpVariable
61+
[[vk::ext_builtin_input(spv::BuiltInHitTriangleVertexPositionsKHR)]]
62+
static const float32_t3 HitTriangleVertexPositionsKHR[3];
63+
64+
// ray query version
65+
[[vk::ext_capability(spv::CapabilityRayQueryPositionFetchKHR)]]
66+
[[vk::ext_extension("SPV_KHR_ray_tracing_position_fetch")]]
67+
[[vk::ext_instruction(spv::OpRayQueryGetIntersectionTriangleVertexPositionsKHR)]]
68+
float3 rayQueryGetIntersectionTriangleVertexPositionsKHR([[vk::ext_reference]] RayQueryKHR query, uint32_t committed)[3];
69+
70+
}
71+
}
72+
}
73+
74+
#endif

src/nbl/builtin/CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,7 @@ LIST_BUILTIN_RESOURCE(NBL_RESOURCES_TO_EMBED "hlsl/macros.h")
213213
#spirv intrinsics
214214
LIST_BUILTIN_RESOURCE(NBL_RESOURCES_TO_EMBED "hlsl/spirv_intrinsics/core.hlsl")
215215
LIST_BUILTIN_RESOURCE(NBL_RESOURCES_TO_EMBED "hlsl/spirv_intrinsics/fragment_shader_pixel_interlock.hlsl")
216+
LIST_BUILTIN_RESOURCE(NBL_RESOURCES_TO_EMBED "hlsl/spirv_intrinsics/raytracing.hlsl")
216217
LIST_BUILTIN_RESOURCE(NBL_RESOURCES_TO_EMBED "hlsl/spirv_intrinsics/subgroup_arithmetic.hlsl")
217218
LIST_BUILTIN_RESOURCE(NBL_RESOURCES_TO_EMBED "hlsl/spirv_intrinsics/subgroup_ballot.hlsl")
218219
LIST_BUILTIN_RESOURCE(NBL_RESOURCES_TO_EMBED "hlsl/spirv_intrinsics/subgroup_basic.hlsl")

src/nbl/video/CVulkanPhysicalDevice.cpp

+11
Original file line numberDiff line numberDiff line change
@@ -705,6 +705,7 @@ std::unique_ptr<CVulkanPhysicalDevice> CVulkanPhysicalDevice::create(core::smart
705705
VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR workgroupMemoryExplicitLayout = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_FEATURES_KHR };
706706
VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR raytracingMaintenance1Features = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MAINTENANCE_1_FEATURES_KHR };
707707
VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesARM rasterizationOrderAttachmentAccessFeatures = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_ARM };
708+
VkPhysicalDeviceRayTracingPositionFetchFeaturesKHR rayTracingPositionFetchFeatures = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_POSITION_FETCH_FEATURES_KHR };
708709
VkPhysicalDeviceColorWriteEnableFeaturesEXT colorWriteEnableFeatures = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT };
709710
#if 0
710711
VkPhysicalDeviceCooperativeMatrixFeaturesKHR cooperativeMatrixFeatures = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_KHR };
@@ -768,6 +769,8 @@ std::unique_ptr<CVulkanPhysicalDevice> CVulkanPhysicalDevice::create(core::smart
768769
addToPNextChain(&workgroupMemoryExplicitLayout);
769770
if (isExtensionSupported(VK_ARM_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_EXTENSION_NAME))
770771
addToPNextChain(&rasterizationOrderAttachmentAccessFeatures);
772+
if (isExtensionSupported(VK_KHR_RAY_TRACING_POSITION_FETCH_EXTENSION_NAME))
773+
addToPNextChain(&rayTracingPositionFetchFeatures);
771774
if (isExtensionSupported(VK_EXT_COLOR_WRITE_ENABLE_EXTENSION_NAME))
772775
addToPNextChain(&colorWriteEnableFeatures);
773776
// call
@@ -1196,6 +1199,9 @@ std::unique_ptr<CVulkanPhysicalDevice> CVulkanPhysicalDevice::create(core::smart
11961199
properties.limits.workgroupMemoryExplicitLayout16BitAccess = workgroupMemoryExplicitLayout.workgroupMemoryExplicitLayout16BitAccess;
11971200
}
11981201

1202+
if (isExtensionSupported(VK_KHR_RAY_TRACING_POSITION_FETCH_EXTENSION_NAME) && isExtensionSupported(VK_KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME))
1203+
properties.limits.rayTracingPositionFetch = rayTracingPositionFetchFeatures.rayTracingPositionFetch;
1204+
11991205
if (isExtensionSupported(VK_EXT_COLOR_WRITE_ENABLE_EXTENSION_NAME))
12001206
properties.limits.colorWriteEnable = colorWriteEnableFeatures.colorWriteEnable;
12011207
#if 0 //TODO
@@ -1566,6 +1572,9 @@ core::smart_refctd_ptr<ILogicalDevice> CVulkanPhysicalDevice::createLogicalDevic
15661572
&rasterizationOrderAttachmentAccessFeatures
15671573
);
15681574

1575+
VkPhysicalDeviceRayTracingPositionFetchFeaturesKHR rayTracingPositionFetchFeatures = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_POSITION_FETCH_FEATURES_KHR, nullptr };
1576+
REQUIRE_EXTENSION_IF(enabledFeatures.accelerationStructure && m_initData.properties.limits.rayTracingPositionFetch, VK_KHR_RAY_TRACING_POSITION_FETCH_EXTENSION_NAME, &rayTracingPositionFetchFeatures);
1577+
15691578
VkPhysicalDeviceColorWriteEnableFeaturesEXT colorWriteEnableFeatures = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT,nullptr };
15701579
enableExtensionIfAvailable(VK_EXT_COLOR_WRITE_ENABLE_EXTENSION_NAME,&colorWriteEnableFeatures);
15711580
#if 0
@@ -1751,6 +1760,8 @@ core::smart_refctd_ptr<ILogicalDevice> CVulkanPhysicalDevice::createLogicalDevic
17511760

17521761
rayQueryFeatures.rayQuery = enabledFeatures.rayQuery;
17531762

1763+
rayTracingPositionFetchFeatures.rayTracingPositionFetch = limits.rayTracingPositionFetch;
1764+
17541765
//shaderSMBuiltinsFeaturesNV [LIMIT SO ENABLE EVERYTHING BY DEFAULT]
17551766

17561767
representativeFragmentTestFeatures.representativeFragmentTest = enabledFeatures.representativeFragmentTest;

src/nbl/video/device_capabilities/device_features.json

+10-2
Original file line numberDiff line numberDiff line change
@@ -4023,8 +4023,16 @@
40234023
"VK_AMD_extension_478",
40244024
"VK_AMD_extension_479",
40254025
"VK_EXT_extension_480",
4026-
"VK_EXT_extension_481",
4027-
"TODO: implement",
4026+
"VK_EXT_extension_481"
4027+
]
4028+
},
4029+
{
4030+
"type": "bool",
4031+
"name": "rayTracingPositionFetch",
4032+
"value": false,
4033+
"expose": "MOVE_TO_LIMIT",
4034+
"comment": [
4035+
"RayTracingPositionFetchFeaturesKHR",
40284036
"VK_KHR_ray_tracing_position_fetch"
40294037
]
40304038
},

0 commit comments

Comments
 (0)