Vulkan-Docs/appendices/VK_NVX_raytracing.txt

180 lines
6.4 KiB
Plaintext
Raw Normal View History

Change log for September 19, 2018 Vulkan 1.1.85 spec update: * Update release number to 85. Public Issues: * Add self-dependency ename:VK_DEPENDENCY_BY_REGION_BIT valid usage statements for slink:VkSubpassDependency(public pull request 778). * Apply fix from pull request 742 to slink:VkSubpassDependency and slink:VkSubpassDependency2 (public pull request 779). * Specify the units of slink:VkBufferImageCopy::pname:bufferRowLength and pname:bufferImageHeight as texels (public pull request 781). * Better specify promoted parameter mapping in the `<<VK_KHR_create_renderpass2>>` appendix (public pull request 782). Internal Issues: * Only include the <<fundamentals-validusage-versions, Valid Usage for Newer Core Versions>> section in Vulkan 1.1 or later (internal issue 1381). Other Issues: * Clean up redundant valid usage language for the `VK_ANDROID_external_memory_android_hardware_buffer` extension interaction with slink:VkImageCreateInfo. * Fix error in a flag name within valid usage statements for slink:VkMemoryAllocateInfo. * Clarify that memory types are not totally ordered in slink:VkPhysicalDeviceMemoryProperties. * For slink:VkWriteDescriptorSetInlineUniformBlockEXT, set structextends="VkWriteDescriptorSet" in `vk.xml`, and make slink:VkDescriptorSetLayoutBindingFlagsCreateInfoEXT::pname:pBindingFlags optional. * Add documentation of 'provisional' XML attribute to registry.txt. New Extensions: * `VK_NV_compute_shader_derivatives` * `VK_NV_corner_sampled_image` * `VK_NV_fragment_shader_barycentric` * `VK_NV_mesh_shader` * `VK_NV_representative_fragment_test` * `VK_NV_scissor_exclusive` * `VK_NV_shader_image_footprint` * `VK_NV_shading_rate_image` * `VK_NVX_raytracing`
2018-09-15 18:35:16 -07:00
include::meta/VK_NVX_raytracing.txt[]
*Last Modified Date*::
2018-09-11
*Interactions and External Dependencies*::
- This extension requires the
https://www.khronos.org/registry/spir-v/extensions/NVX/SPV_NVX_raytracing.html[+SPV_NVX_raytracing+]
SPIR-V extension.
- This extension requires the
https://github.com/KhronosGroup/GLSL/tree/master/extensions/NVX/GL_NVX_raytracing.txt[+GL_NVX_raytracing+]
extension for GLSL source languages.
*Contributors*::
- Eric Werness, NVIDIA
- Ashwin Lele, NVIDIA
- Robert Stepinski, NVIDIA
- Nuno Subtil, NVIDIA
- Christoph Kubisch, NVIDIA
- Martin Stich, NVIDIA
- Daniel Koch, NVIDIA
Rasterization has been the dominant method to produce interactive graphics,
but increasing performance of graphics hardware has made raytracing a viable
option for interactive rendering.
Being able to integrate raytracing with traditional rasterization makes it
easier for applications to incrementally add raytraced effects to existing
applications or to do hybrid approaches with rasterization for primary
visibility and raytracing for secondary queries.
To enable raytracing, this extension adds a few different categories of new
functionality:
* Acceleration structure objects and build commands
* A new pipeline type with new shader domains
* An indirection table to link shader groups with acceleration structure
items
This extension adds support for the following SPIR-V extension in Vulkan:
* +SPV_NVX_raytracing+
=== New Object Types
* slink:VkAccelerationStructureNVX
=== New Enum Constants
* Extending elink:VkStructureType:
** ename:VK_STRUCTURE_TYPE_RAYTRACING_PIPELINE_CREATE_INFO_NVX
** ename:VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_NVX
** ename:VK_STRUCTURE_TYPE_GEOMETRY_INSTANCE_NVX
** ename:VK_STRUCTURE_TYPE_GEOMETRY_NVX
** ename:VK_STRUCTURE_TYPE_GEOMETRY_TRIANGLES_NVX
** ename:VK_STRUCTURE_TYPE_GEOMETRY_AABB_NVX
** ename:VK_STRUCTURE_TYPE_BIND_ACCELERATION_STRUCTURE_MEMORY_INFO_NVX
** ename:VK_STRUCTURE_TYPE_DESCRIPTOR_ACCELERATION_STRUCTURE_INFO_NVX
** ename:VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_INFO_NVX
** ename:VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAYTRACING_PROPERTIES_NVX
* Extending elink:VkShaderStageFlagBits:
** ename:VK_SHADER_STAGE_RAYGEN_BIT_NVX
** ename:VK_SHADER_STAGE_ANY_HIT_BIT_NVX
** ename:VK_SHADER_STAGE_CLOSEST_HIT_BIT_NVX
** ename:VK_SHADER_STAGE_MISS_BIT_NVX
** ename:VK_SHADER_STAGE_INTERSECTION_BIT_NVX
** ename:VK_SHADER_STAGE_CALLABLE_BIT_NVX
* Extending elink:VkPipelineStageFlagBits:
** ename:VK_PIPELINE_STAGE_RAYTRACING_BIT_NVX
* Extending elink:VkBufferUsageFlagBits:
** ename:VK_BUFFER_USAGE_RAYTRACING_BIT_NVX
* Extending elink:VkPipelineBindPoint:
** ename:VK_PIPELINE_BIND_POINT_RAYTRACING_NVX
* Extending elink:VkDescriptorType
** ename:VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NVX
* Extending elink:VkAccessFlagBits
** ename:VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_NVX
** ename:VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_NVX
* Extending elink:VkQueryType
** ename:VK_QUERY_TYPE_COMPACTED_SIZE_NVX
* Extending elink:VkPipelineCreateFlagBits
** ename:VK_PIPELINE_CREATE_DEFER_COMPILE_BIT_NVX
=== New Enums
** elink:VkGeometryFlagBitsNVX
** elink:VkGeometryInstanceFlagBitsNVX (TBD)
** elink:VkBuildAccelerationStructureFlagBitsNVX
** elink:VkCopyAccelerationStructureModeNVX
** elink:VkGeometryTypeNVX
=== New Structures
** slink:VkRaytracingPipelineCreateInfoNVX
** slink:VkGeometryTrianglesNVX
** slink:VkGeometryAABBNVX
** slink:VkGeometryDataNVX
** slink:VkGeometryNVX
** slink:VkAccelerationStructureCreateInfoNVX
** slink:VkBindAccelerationStructureMemoryInfoNVX
** slink:VkDescriptorAccelerationStructureInfoNVX
** slink:VkAccelerationStructureMemoryRequirementsInfoNVX
** slink:VkPhysicalDeviceRaytracingPropertiesNVX
=== New Functions
* flink:vkCreateAccelerationStructureNVX
* flink:vkDestroyAccelerationStructureNVX
* flink:vkGetAccelerationStructureMemoryRequirementsNVX
* flink:vkGetAccelerationStructureScratchMemoryRequirementsNVX
* flink:vkBindAccelerationStructureMemoryNVX
* flink:vkCmdBuildAccelerationStructureNVX
* flink:vkCmdCopyAccelerationStructureNVX
* flink:vkCmdTraceRaysNVX
* flink:vkCreateRaytracingPipelinesNVX
* flink:vkGetRaytracingShaderHandlesNVX
* flink:vkGetAccelerationStructureHandleNVX
* flink:vkCmdWriteAccelerationStructurePropertiesNVX
* flink:vkCompileDeferredNVX
=== New or Modified Built-In Variables
* <<interfaces-builtin-variables-launchid,code:LaunchIDNVX>>
* <<interfaces-builtin-variables-launchsize,code:LaunchSizeNVX>>
* <<interfaces-builtin-variables-worldrayorigin,code:WorldRayOriginNVX>>
* <<interfaces-builtin-variables-worldraydirection,code:WorldRayDirectionNVX>>
* <<interfaces-builtin-variables-objectrayorigin,code:ObjectRayOriginNVX>>
* <<interfaces-builtin-variables-objectraydirection,code:ObjectRayDirectionNVX>>
* <<interfaces-builtin-variables-raytmin,code:RayTminNVX>>
* <<interfaces-builtin-variables-raytmax,code:RayTmaxNVX>>
* <<interfaces-builtin-variables-instancecustomindex,code:InstanceCustomIndexNVX>>
* <<interfaces-builtin-variables-objecttoworld,code:ObjectToWorldNVX>>
* <<interfaces-builtin-variables-worldtoobject,code:WorldToObjectNVX>>
* <<interfaces-builtin-variables-hitt,code:HitTNVX>>
* <<interfaces-builtin-variables-hitkind,code:HitKindNVX>>
* (modified)code:InstanceIndex
* (modified)code:PrimitiveId
=== New SPIR-V Capabilities
* <<spirvenv-capabilities-table-raytracing,RaytracingNVX>>
=== Issues
1) Are there issues?
*RESOLVED*: Yes.
=== Sample Code
Example ray generation GLSL shader
[source,c]
---------------------------------------------------
#version 450 core
#extension GL_NVX_raytracing : require
layout(set = 0, binding = 0, rgba8) uniform image2D image;
layout(set = 0, binding = 1) uniform accelerationStructureNVX as;
layout(location = 0) rayPayloadNVX float payload;
void main()
{
vec4 col = vec4(0, 0, 0, 1);
vec3 origin = vec3(float(gl_LaunchIDNVX.x)/float(gl_LaunchSizeNVX.x), float(gl_LaunchIDNVX.y)/float(gl_LaunchSizeNVX.y), 1.0);
vec3 dir = vec3(0.0, 0.0, -1.0);
traceNVX(as, 0, 0xff, 0, 1, 0, origin, 0.0, dir, 1000.0, 0);
col.y = payload;
imageStore(image, ivec2(gl_LaunchIDNVX.xy), col);
}
---------------------------------------------------
=== Version History
* Revision 1, 2018-09-11 (Robert Stepinski, Nuno Subtil, Eric Werness)
- Internal revisions