/ appendices / VK_NV_ray_tracing.txt
VK_NV_ray_tracing.txt
  1  include::meta/VK_NV_ray_tracing.txt[]
  2  
  3  *Last Modified Date*::
  4      2018-11-20
  5  
  6  *Interactions and External Dependencies*::
  7    - This extension requires the
  8      https://htmlpreview.github.io/?https://github.com/KhronosGroup/SPIRV-Registry/blob/master/extensions/NV/SPV_NV_ray_tracing.html[`SPV_NV_ray_tracing`]
  9      SPIR-V extension.
 10    - This extension requires the
 11      https://github.com/KhronosGroup/GLSL/blob/master/extensions/nv/GLSL_NV_ray_tracing.txt[`GL_NV_ray_tracing`]
 12      extension for GLSL source languages.
 13  
 14  *Contributors*::
 15    - Eric Werness, NVIDIA
 16    - Ashwin Lele, NVIDIA
 17    - Robert Stepinski, NVIDIA
 18    - Nuno Subtil, NVIDIA
 19    - Christoph Kubisch, NVIDIA
 20    - Martin Stich, NVIDIA
 21    - Daniel Koch, NVIDIA
 22    - Jeff Bolz, NVIDIA
 23    - Joshua Barczak, Intel
 24    - Tobias Hector, AMD
 25    - Henrik Rydgard, NVIDIA
 26    - Pascal Gautron, NVIDIA
 27  
 28  Rasterization has been the dominant method to produce interactive graphics,
 29  but increasing performance of graphics hardware has made ray tracing a
 30  viable option for interactive rendering.
 31  Being able to integrate ray tracing with traditional rasterization makes it
 32  easier for applications to incrementally add ray traced effects to existing
 33  applications or to do hybrid approaches with rasterization for primary
 34  visibility and ray tracing for secondary queries.
 35  
 36  To enable ray tracing, this extension adds a few different categories of new
 37  functionality:
 38  
 39    * Acceleration structure objects and build commands
 40    * A new pipeline type with new shader domains
 41    * An indirection table to link shader groups with acceleration structure
 42      items
 43  
 44  This extension adds support for the following SPIR-V extension in Vulkan:
 45  
 46    * `SPV_NV_ray_tracing`
 47  
 48  === New Object Types
 49  
 50    * slink:VkAccelerationStructureNV
 51  
 52  === New Enum Constants
 53  
 54    * Extending elink:VkStructureType:
 55    ** ename:VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_CREATE_INFO_NV
 56    ** ename:VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_NV
 57    ** ename:VK_STRUCTURE_TYPE_GEOMETRY_NV
 58    ** ename:VK_STRUCTURE_TYPE_GEOMETRY_TRIANGLES_NV
 59    ** ename:VK_STRUCTURE_TYPE_GEOMETRY_AABB_NV
 60    ** ename:VK_STRUCTURE_TYPE_BIND_ACCELERATION_STRUCTURE_MEMORY_INFO_NV
 61    ** ename:VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_NV
 62    ** ename:VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_INFO_NV
 63    ** ename:VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV
 64    ** ename:VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_INFO_NV
 65    ** ename:VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_NV
 66    * Extending elink:VkShaderStageFlagBits:
 67    ** ename:VK_SHADER_STAGE_RAYGEN_BIT_NV
 68    ** ename:VK_SHADER_STAGE_ANY_HIT_BIT_NV
 69    ** ename:VK_SHADER_STAGE_CLOSEST_HIT_BIT_NV
 70    ** ename:VK_SHADER_STAGE_MISS_BIT_NV
 71    ** ename:VK_SHADER_STAGE_INTERSECTION_BIT_NV
 72    ** ename:VK_SHADER_STAGE_CALLABLE_BIT_NV
 73    * Extending elink:VkPipelineStageFlagBits:
 74    ** ename:VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_NV
 75    ** ename:VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_NV
 76    * Extending elink:VkBufferUsageFlagBits:
 77    ** ename:VK_BUFFER_USAGE_RAY_TRACING_BIT_NV
 78    * Extending elink:VkPipelineBindPoint:
 79    ** ename:VK_PIPELINE_BIND_POINT_RAY_TRACING_NV
 80    * Extending elink:VkDescriptorType:
 81    ** ename:VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NV
 82    * Extending elink:VkAccessFlagBits:
 83    ** ename:VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_NV
 84    ** ename:VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_NV
 85    * Extending elink:VkQueryType:
 86    ** ename:VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_NV
 87    * Extending elink:VkPipelineCreateFlagBits:
 88    ** ename:VK_PIPELINE_CREATE_DEFER_COMPILE_BIT_NV
 89    * Extending elink:VkIndexType:
 90    ** ename:VK_INDEX_TYPE_NONE_NV
 91  
 92  === New Enums
 93  
 94   ** elink:VkGeometryFlagBitsNV
 95   ** elink:VkGeometryInstanceFlagBitsNV
 96   ** elink:VkBuildAccelerationStructureFlagBitsNV
 97   ** elink:VkCopyAccelerationStructureModeNV
 98   ** elink:VkGeometryTypeNV
 99   ** elink:VkRayTracingShaderGroupTypeNV
100   ** elink:VkAccelerationStructureMemoryRequirementsTypeNV
101   ** elink:VkAccelerationStructureTypeNV
102  
103  === New Structures
104  
105   ** slink:VkRayTracingPipelineCreateInfoNV
106   ** slink:VkGeometryTrianglesNV
107   ** slink:VkGeometryAABBNV
108   ** slink:VkGeometryDataNV
109   ** slink:VkGeometryNV
110   ** slink:VkAccelerationStructureCreateInfoNV
111   ** slink:VkBindAccelerationStructureMemoryInfoNV
112   ** slink:VkWriteDescriptorSetAccelerationStructureNV
113   ** slink:VkAccelerationStructureMemoryRequirementsInfoNV
114   ** slink:VkPhysicalDeviceRayTracingPropertiesNV
115   ** slink:VkRayTracingShaderGroupCreateInfoNV
116   ** slink:VkAccelerationStructureInfoNV
117  
118  === New Functions
119  
120    * flink:vkCreateAccelerationStructureNV
121    * flink:vkDestroyAccelerationStructureNV
122    * flink:vkGetAccelerationStructureMemoryRequirementsNV
123    * flink:vkBindAccelerationStructureMemoryNV
124    * flink:vkCmdBuildAccelerationStructureNV
125    * flink:vkCmdCopyAccelerationStructureNV
126    * flink:vkCmdTraceRaysNV
127    * flink:vkCreateRayTracingPipelinesNV
128    * flink:vkGetRayTracingShaderGroupHandlesNV
129    * flink:vkGetAccelerationStructureHandleNV
130    * flink:vkCmdWriteAccelerationStructuresPropertiesNV
131    * flink:vkCompileDeferredNV
132  
133  === New or Modified Built-In Variables
134  
135    * <<interfaces-builtin-variables-launchid,code:LaunchIDNV>>
136    * <<interfaces-builtin-variables-launchsize,code:LaunchSizeNV>>
137    * <<interfaces-builtin-variables-worldrayorigin,code:WorldRayOriginNV>>
138    * <<interfaces-builtin-variables-worldraydirection,code:WorldRayDirectionNV>>
139    * <<interfaces-builtin-variables-objectrayorigin,code:ObjectRayOriginNV>>
140    * <<interfaces-builtin-variables-objectraydirection,code:ObjectRayDirectionNV>>
141    * <<interfaces-builtin-variables-raytmin,code:RayTminNV>>
142    * <<interfaces-builtin-variables-raytmax,code:RayTmaxNV>>
143    * <<interfaces-builtin-variables-instancecustomindex,code:InstanceCustomIndexNV>>
144    * <<interfaces-builtin-variables-instanceid,code:InstanceId>>
145    * <<interfaces-builtin-variables-objecttoworld,code:ObjectToWorldNV>>
146    * <<interfaces-builtin-variables-worldtoobject,code:WorldToObjectNV>>
147    * <<interfaces-builtin-variables-hitt,code:HitTNV>>
148    * <<interfaces-builtin-variables-hitkind,code:HitKindNV>>
149    * <<interfaces-builtin-variables-incomingrayflags,code:IncomingRayFlagsNV>>
150    * (modified)code:PrimitiveId
151  
152  === New SPIR-V Capabilities
153  
154    * <<spirvenv-capabilities-table-raytracing,RayTracingNV>>
155  
156  === Issues
157  
158  1) Are there issues?
159  
160  *RESOLVED*: Yes.
161  
162  === Sample Code
163  
164  Example ray generation GLSL shader
165  
166  [source,c]
167  ---------------------------------------------------
168  #version 450 core
169  #extension GL_NV_ray_tracing : require
170  layout(set = 0, binding = 0, rgba8) uniform image2D image;
171  layout(set = 0, binding = 1) uniform accelerationStructureNV as;
172  layout(location = 0) rayPayloadNV float payload;
173  
174  void main()
175  {
176     vec4 col = vec4(0, 0, 0, 1);
177  
178     vec3 origin = vec3(float(gl_LaunchIDNV.x)/float(gl_LaunchSizeNV.x), float(gl_LaunchIDNV.y)/float(gl_LaunchSizeNV.y), 1.0);
179     vec3 dir = vec3(0.0, 0.0, -1.0);
180  
181     traceNV(as, 0, 0xff, 0, 1, 0, origin, 0.0, dir, 1000.0, 0);
182  
183     col.y = payload;
184  
185     imageStore(image, ivec2(gl_LaunchIDNV.xy), col);
186  }
187  ---------------------------------------------------
188  
189  === Version History
190  
191    * Revision 1, 2018-09-11 (Robert Stepinski, Nuno Subtil, Eric Werness)
192      - Internal revisions
193    * Revision 2, 2018-10-19 (Eric Werness)
194      - rename to VK_NV_ray_tracing, add support for callables.
195      - too many updates to list
196    * Revision 3, 2018-11-20 (Daniel Koch)
197      - update to use InstanceId instead of InstanceIndex as implemented.