{-# language CPP #-} -- | = Name -- -- VK_NV_ray_tracing_invocation_reorder - device extension -- -- == VK_NV_ray_tracing_invocation_reorder -- -- [__Name String__] -- @VK_NV_ray_tracing_invocation_reorder@ -- -- [__Extension Type__] -- Device extension -- -- [__Registered Extension Number__] -- 491 -- -- [__Revision__] -- 1 -- -- [__Ratification Status__] -- Not ratified -- -- [__Extension and Version Dependencies__] -- -- -- [__Contact__] -- -- - Eric Werness -- -- -- == Other Extension Metadata -- -- [__Last Modified Date__] -- 2022-11-02 -- -- [__Interactions and External Dependencies__] -- -- - This extension requires -- -- -- - This extension provides API support for -- -- -- [__Contributors__] -- -- - Eric Werness, NVIDIA -- -- - Ashwin Lele, NVIDIA -- -- == Description -- -- The ray tracing pipeline API provides some ability to reorder for -- locality, but it is useful to have more control over how the reordering -- happens and what information is included in the reordering. The shader -- API provides a hit object to contain result information from the hit -- which can be used as part of the explicit sorting plus options that -- contain an integer for hint bits to use to add more locality. -- -- == New Structures -- -- - Extending -- 'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.PhysicalDeviceFeatures2', -- 'Vulkan.Core10.Device.DeviceCreateInfo': -- -- - 'PhysicalDeviceRayTracingInvocationReorderFeaturesNV' -- -- - Extending -- 'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.PhysicalDeviceProperties2': -- -- - 'PhysicalDeviceRayTracingInvocationReorderPropertiesNV' -- -- == New Enums -- -- - 'RayTracingInvocationReorderModeNV' -- -- == New Enum Constants -- -- - 'NV_RAY_TRACING_INVOCATION_REORDER_EXTENSION_NAME' -- -- - 'NV_RAY_TRACING_INVOCATION_REORDER_SPEC_VERSION' -- -- - Extending 'Vulkan.Core10.Enums.StructureType.StructureType': -- -- - 'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_FEATURES_NV' -- -- - 'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_PROPERTIES_NV' -- -- == HLSL Mapping -- -- HLSL does not provide this functionality natively yet. -- -- However, it is possible to use this functionality via -- . -- -- The codes for shader invocation reorder are obtained from -- : -- -- > #define ShaderInvocationReorderNV 5383 -- > #define HitObjectAttributeNV 5385 -- > -- > #define OpHitObjectRecordHitMotionNV 5249 -- > #define OpHitObjectRecordHitWithIndexMotionNV 5250 -- > #define OpHitObjectRecordMissMotionNV 5251 -- > #define OpHitObjectGetWorldToObjectNV 5252 -- > #define OpHitObjectGetObjectToWorldNV 5253 -- > #define OpHitObjectGetObjectRayDirectionNV 5254 -- > #define OpHitObjectGetObjectRayOriginNV 5255 -- > #define OpHitObjectTraceRayMotionNV 5256 -- > #define OpHitObjectGetShaderRecordBufferHandleNV 5257 -- > #define OpHitObjectGetShaderBindingTableRecordIndexNV 5258 -- > #define OpHitObjectRecordEmptyNV 5259 -- > #define OpHitObjectTraceRayNV 5260 -- > #define OpHitObjectRecordHitNV 5261 -- > #define OpHitObjectRecordHitWithIndexNV 5262 -- > #define OpHitObjectRecordMissNV 5263 -- > #define OpHitObjectExecuteShaderNV 5264 -- > #define OpHitObjectGetCurrentTimeNV 5265 -- > #define OpHitObjectGetAttributesNV 5266 -- > #define OpHitObjectGetHitKindNV 5267 -- > #define OpHitObjectGetPrimitiveIndexNV 5268 -- > #define OpHitObjectGetGeometryIndexNV 5269 -- > #define OpHitObjectGetInstanceIdNV 5270 -- > #define OpHitObjectGetInstanceCustomIndexNV 5271 -- > #define OpHitObjectGetWorldRayDirectionNV 5272 -- > #define OpHitObjectGetWorldRayOriginNV 5273 -- > #define OpHitObjectGetRayTMaxNV 5274 -- > #define OpHitObjectGetRayTMinNV 5275 -- > #define OpHitObjectIsEmptyNV 5276 -- > #define OpHitObjectIsHitNV 5277 -- > #define OpHitObjectIsMissNV 5278 -- > #define OpReorderThreadWithHitObjectNV 5279 -- > #define OpReorderThreadWithHintNV 5280 -- > #define OpTypeHitObjectNV 5281 -- -- The capability and extension need to be added: -- -- > [[vk::ext_capability(ShaderInvocationReorderNV)]] -- > [[vk::ext_extension("SPV_NV_shader_invocation_reorder")]] -- -- The creation of the @HitObject@ type can be done like this: -- -- > [[vk::ext_type_def(HitObjectAttributeNV, OpTypeHitObjectNV)]] -- > void createHitObjectNV(); -- > #define HitObjectNV vk::ext_type -- -- The payload: -- -- - must be global -- -- - needs the @RayPayloadKHR@ attribute as an extra storage class -- -- > struct [raypayload] HitPayload -- > { -- > float hitT : write(closesthit, miss) : read(caller); -- > int instanceIndex : write(closesthit) : read(caller); -- > float3 pos : write(closesthit) : read(caller); -- > float3 nrm : write(closesthit) : read(caller); -- > }; -- > -- > #define RayPayloadKHR 5338 -- > [[vk::ext_storage_class(RayPayloadKHR)]] static HitPayload payload; -- -- Here is the declaration of a few invocation reordering functions: -- -- > [[vk::ext_instruction(OpHitObjectRecordEmptyNV)]] -- > void hitObjectRecordEmptyNV([[vk::ext_reference]] HitObjectNV hitObject); -- > -- > [[vk::ext_instruction(OpHitObjectTraceRayNV)]] -- > void hitObjectTraceRayNV( -- > [[vk::ext_reference]] HitObjectNV hitObject, -- > RaytracingAccelerationStructure as, -- > uint RayFlags, -- > uint CullMask, -- > uint SBTOffset, -- > uint SBTStride, -- > uint MissIndex, -- > float3 RayOrigin, -- > float RayTmin, -- > float3 RayDirection, -- > float RayTMax, -- > [[vk::ext_reference]] [[vk::ext_storage_class(RayPayloadKHR)]] HitPayload payload -- > ); -- > -- > [[vk::ext_instruction(OpReorderThreadWithHintNV)]] -- > void reorderThreadWithHintNV(int Hint, int Bits); -- > -- > [[vk::ext_instruction(OpReorderThreadWithHitObjectNV)]] -- > void reorderThreadWithHitObjectNV([[vk::ext_reference]] HitObjectNV hitObject); -- > -- > [[vk::ext_instruction(OpHitObjectExecuteShaderNV)]] -- > void hitObjectExecuteShaderNV([[vk::ext_reference]] HitObjectNV hitObject, [[vk::ext_reference]] [[vk::ext_storage_class(RayPayloadKHR)]] HitPayload payload); -- > -- > [[vk::ext_instruction(OpHitObjectIsHitNV)]] -- > bool hitObjectIsHitNV([[vk::ext_reference]] HitObjectNV hitObject); -- -- Using the function in the code, can be done like this -- -- > if (USE_SER == 1) -- > { -- > createHitObjectNV(); -- > HitObjectNV hObj; // hitObjectNV hObj; -- > hitObjectRecordEmptyNV(hObj); //Initialize to an empty hit object -- > hitObjectTraceRayNV(hObj, topLevelAS, rayFlags, 0xFF, 0, 0, 0, r.Origin, 0.0, r.Direction, INFINITE, payload); -- > reorderThreadWithHitObjectNV(hObj); -- > hitObjectExecuteShaderNV(hObj, payload); -- > } -- -- Note: -- -- - createHitObjectNV() needs to be call at least once. This can be also -- done in the main entry of the shader. -- -- - Function with a payload parameter, needs to have the payload struct -- defined before. There are no templated declaration of the function. -- -- == Version History -- -- - Revision 1, 2020-09-12 (Eric Werness, Ashwin Lele) -- -- - Initial external release -- -- == See Also -- -- 'PhysicalDeviceRayTracingInvocationReorderFeaturesNV', -- 'PhysicalDeviceRayTracingInvocationReorderPropertiesNV', -- 'RayTracingInvocationReorderModeNV' -- -- == Document Notes -- -- For more information, see the -- -- -- This page is a generated document. Fixes and changes should be made to -- the generator scripts, not directly. module Vulkan.Extensions.VK_NV_ray_tracing_invocation_reorder ( PhysicalDeviceRayTracingInvocationReorderFeaturesNV , PhysicalDeviceRayTracingInvocationReorderPropertiesNV ) where import Vulkan.CStruct (FromCStruct) import Vulkan.CStruct (ToCStruct) import Data.Kind (Type) data PhysicalDeviceRayTracingInvocationReorderFeaturesNV instance ToCStruct PhysicalDeviceRayTracingInvocationReorderFeaturesNV instance Show PhysicalDeviceRayTracingInvocationReorderFeaturesNV instance FromCStruct PhysicalDeviceRayTracingInvocationReorderFeaturesNV data PhysicalDeviceRayTracingInvocationReorderPropertiesNV instance ToCStruct PhysicalDeviceRayTracingInvocationReorderPropertiesNV instance Show PhysicalDeviceRayTracingInvocationReorderPropertiesNV instance FromCStruct PhysicalDeviceRayTracingInvocationReorderPropertiesNV