HLSL does not provide this functionality natively yet.
However, it is possible to use this functionality via SPIR-V Intrinsics.
The codes for shader invocation reorder are obtained from this page:
#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<HitObjectAttributeNV>
The payload:
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:
VK_NV_ray_tracing_invocation_reorderVK_KHR_ray_tracing_pipelineSPV_NV_shader_invocation_reorderGL_NV_shader_invocation_reorder| Modifier and Type | Field and Description |
|---|---|
| public static final String | VK_NV_RAY_TRACING_INVOCATION_REORDER_EXTENSION_NAME
The extension name. |
| public static final int | VK_NV_RAY_TRACING_INVOCATION_REORDER_SPEC_VERSION
The extension specification version. |
| public static final int | VK_RAY_TRACING_INVOCATION_REORDER_MODE_NONE_NV
VkRayTracingInvocationReorderModeNV - Enum providing a hint on how the application may reorder Description
|
| public static final int | VK_RAY_TRACING_INVOCATION_REORDER_MODE_REORDER_NV
VkRayTracingInvocationReorderModeNV - Enum providing a hint on how the application may reorder Description
|
| public static final int | VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_FEATURES_NV
Extends |
| public static final int | VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_PROPERTIES_NV
Extends |
| Access | Constructor and Description |
|---|---|
| private |
| VK_NV_RAY_TRACING_INVOCATION_REORDER_EXTENSION_NAME | back to summary |
|---|---|
| public static final String VK_NV_RAY_TRACING_INVOCATION_REORDER_EXTENSION_NAME The extension name. | |
| VK_NV_RAY_TRACING_INVOCATION_REORDER_SPEC_VERSION | back to summary |
|---|---|
| public static final int VK_NV_RAY_TRACING_INVOCATION_REORDER_SPEC_VERSION The extension specification version. | |
| VK_RAY_TRACING_INVOCATION_REORDER_MODE_NONE_NV | back to summary |
|---|---|
| public static final int VK_RAY_TRACING_INVOCATION_REORDER_MODE_NONE_NV VkRayTracingInvocationReorderModeNV - Enum providing a hint on how the application may reorder Description
See Also | |
| VK_RAY_TRACING_INVOCATION_REORDER_MODE_REORDER_NV | back to summary |
|---|---|
| public static final int VK_RAY_TRACING_INVOCATION_REORDER_MODE_REORDER_NV VkRayTracingInvocationReorderModeNV - Enum providing a hint on how the application may reorder Description
See Also | |
| VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_FEATURES_NV | back to summary |
|---|---|
| public static final int VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_FEATURES_NV Extends Enum values: | |
| VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_PROPERTIES_NV | back to summary |
|---|---|
| public static final int VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_PROPERTIES_NV Extends Enum values: | |
| NVRayTracingInvocationReorder | back to summary |
|---|---|
| private NVRayTracingInvocationReorder() | |