mirror of https://github.com/xemu-project/xemu.git
261 lines
9.7 KiB
HLSL
261 lines
9.7 KiB
HLSL
// Run: %dxc -T lib_6_3 -fspv-extension=SPV_NV_ray_tracing
|
|
// CHECK: OpCapability RayTracingNV
|
|
// CHECK: OpExtension "SPV_NV_ray_tracing"
|
|
// CHECK: OpEntryPoint RayGenerationNV %MyRayGenMain "MyRayGenMain" {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}} %gl_InstanceID {{%\d+}} %gl_PrimitiveID {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}}
|
|
// CHECK: OpEntryPoint RayGenerationNV %MyRayGenMain2 "MyRayGenMain2" {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}} %gl_InstanceID {{%\d+}} %gl_PrimitiveID {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}}
|
|
// CHECK: OpEntryPoint MissNV %MyMissMain "MyMissMain" {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}} %gl_InstanceID {{%\d+}} %gl_PrimitiveID {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}}
|
|
// CHECK: OpEntryPoint MissNV %MyMissMain2 "MyMissMain2" {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}} %gl_InstanceID {{%\d+}} %gl_PrimitiveID {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}}
|
|
// CHECK: OpEntryPoint IntersectionNV %MyISecMain "MyISecMain" {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}} %gl_InstanceID {{%\d+}} %gl_PrimitiveID {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}}
|
|
// CHECK: OpEntryPoint IntersectionNV %MyISecMain2 "MyISecMain2" {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}} %gl_InstanceID {{%\d+}} %gl_PrimitiveID {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}}
|
|
// CHECK: OpEntryPoint AnyHitNV %MyAHitMain "MyAHitMain" {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}} %gl_InstanceID {{%\d+}} %gl_PrimitiveID {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}}
|
|
// CHECK: OpEntryPoint AnyHitNV %MyAHitMain2 "MyAHitMain2" {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}} %gl_InstanceID {{%\d+}} %gl_PrimitiveID {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}}
|
|
// CHECK: OpEntryPoint ClosestHitNV %MyCHitMain "MyCHitMain" {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}} %gl_InstanceID {{%\d+}} %gl_PrimitiveID {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}}
|
|
// CHECK: OpEntryPoint ClosestHitNV %MyCHitMain2 "MyCHitMain2" {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}} %gl_InstanceID {{%\d+}} %gl_PrimitiveID {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}}
|
|
// CHECK: OpEntryPoint CallableNV %MyCallMain "MyCallMain" {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}} %gl_InstanceID {{%\d+}} %gl_PrimitiveID {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}}
|
|
// CHECK: OpEntryPoint CallableNV %MyCallMain2 "MyCallMain2" {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}} %gl_InstanceID {{%\d+}} %gl_PrimitiveID {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}}
|
|
// CHECK: OpDecorate [[a:%\d+]] BuiltIn LaunchIdNV
|
|
// CHECK: OpDecorate [[b:%\d+]] BuiltIn LaunchSizeNV
|
|
// CHECK: OpDecorate [[c:%\d+]] BuiltIn WorldRayOriginNV
|
|
// CHECK: OpDecorate [[d:%\d+]] BuiltIn WorldRayDirectionNV
|
|
// CHECK: OpDecorate [[e:%\d+]] BuiltIn RayTminNV
|
|
// CHECK: OpDecorate [[f:%\d+]] BuiltIn IncomingRayFlagsNV
|
|
// CHECK: OpDecorate %gl_InstanceID BuiltIn InstanceId
|
|
// CHECK: OpDecorate [[g:%\d+]] BuiltIn InstanceCustomIndexNV
|
|
// CHECK: OpDecorate %gl_PrimitiveID BuiltIn PrimitiveId
|
|
// CHECK: OpDecorate [[h:%\d+]] BuiltIn ObjectRayOriginNV
|
|
// CHECK: OpDecorate [[i:%\d+]] BuiltIn ObjectRayDirectionNV
|
|
// CHECK: OpDecorate [[j:%\d+]] BuiltIn ObjectToWorldNV
|
|
// CHECK: OpDecorate [[k:%\d+]] BuiltIn WorldToObjectNV
|
|
// CHECK: OpDecorate [[l:%\d+]] BuiltIn HitKindNV
|
|
|
|
|
|
// CHECK: OpTypePointer CallableDataNV %CallData
|
|
struct CallData
|
|
{
|
|
float4 data;
|
|
};
|
|
// CHECK: OpTypePointer IncomingRayPayloadNV %Payload
|
|
struct Payload
|
|
{
|
|
float4 color;
|
|
};
|
|
// CHECK: OpTypePointer HitAttributeNV %Attribute
|
|
struct Attribute
|
|
{
|
|
float2 bary;
|
|
};
|
|
// CHECK-COUNT-1: [[rstype:%\d+]] = OpTypeAccelerationStructureNV
|
|
RaytracingAccelerationStructure rs;
|
|
|
|
|
|
[shader("raygeneration")]
|
|
void MyRayGenMain() {
|
|
|
|
// CHECK: OpLoad %v3uint [[a]]
|
|
uint3 a = DispatchRaysIndex();
|
|
// CHECK: OpLoad %v3uint [[b]]
|
|
uint3 b = DispatchRaysDimensions();
|
|
|
|
Payload myPayload = { float4(0.0f,0.0f,0.0f,0.0f) };
|
|
CallData myCallData = { float4(0.0f,0.0f,0.0f,0.0f) };
|
|
RayDesc rayDesc;
|
|
rayDesc.Origin = float3(0.0f, 0.0f, 0.0f);
|
|
rayDesc.Direction = float3(0.0f, 0.0f, -1.0f);
|
|
rayDesc.TMin = 0.0f;
|
|
rayDesc.TMax = 1000.0f;
|
|
// CHECK: OpTraceNV {{%\d+}} %uint_0 %uint_255 %uint_0 %uint_1 %uint_0 {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}} %uint_0
|
|
TraceRay(rs, 0x0, 0xff, 0, 1, 0, rayDesc, myPayload);
|
|
// CHECK: OpExecuteCallableNV %uint_0 %uint_0
|
|
CallShader(0, myCallData);
|
|
}
|
|
|
|
[shader("raygeneration")]
|
|
void MyRayGenMain2() {
|
|
CallData myCallData = { float4(0.0f,0.0f,0.0f,0.0f) };
|
|
CallShader(0, myCallData);
|
|
}
|
|
|
|
[shader("miss")]
|
|
void MyMissMain(inout Payload MyPayload) {
|
|
|
|
// CHECK: OpLoad %v3uint [[a]]
|
|
uint3 _1 = DispatchRaysIndex();
|
|
// CHECK: OpLoad %v3uint [[b]]
|
|
uint3 _2 = DispatchRaysDimensions();
|
|
// CHECK: OpLoad %v3float [[c]]
|
|
float3 _3 = WorldRayOrigin();
|
|
// CHECK: OpLoad %v3float [[d]]
|
|
float3 _4 = WorldRayDirection();
|
|
// CHECK: OpLoad %float [[e]]
|
|
float _5 = RayTMin();
|
|
// CHECK: OpLoad %uint [[f]]
|
|
uint _6 = RayFlags();
|
|
}
|
|
|
|
[shader("miss")]
|
|
void MyMissMain2(inout Payload MyPayload) {
|
|
MyPayload.color = float4(0.0f,1.0f,0.0f,1.0f);
|
|
}
|
|
|
|
[shader("intersection")]
|
|
void MyISecMain() {
|
|
|
|
// CHECK: OpLoad %v3uint [[a]]
|
|
uint3 _1 = DispatchRaysIndex();
|
|
// CHECK: OpLoad %v3uint [[b]]
|
|
uint3 _2 = DispatchRaysDimensions();
|
|
// CHECK: OpLoad %v3float [[c]]
|
|
float3 _3 = WorldRayOrigin();
|
|
// CHECK: OpLoad %v3float [[d]]
|
|
float3 _4 = WorldRayDirection();
|
|
// CHECK: OpLoad %float [[e]]
|
|
float _5 = RayTMin();
|
|
// CHECK: OpLoad %uint [[f]]
|
|
uint _6 = RayFlags();
|
|
// CHECK: OpLoad %uint %gl_InstanceID
|
|
uint _7 = InstanceIndex();
|
|
// CHECK: OpLoad %uint [[g]]
|
|
uint _8 = InstanceID();
|
|
// CHECK: OpLoad %uint %gl_PrimitiveID
|
|
uint _9 = PrimitiveIndex();
|
|
// CHECK: OpLoad %v3float [[h]]
|
|
float3 _10 = ObjectRayOrigin();
|
|
// CHECK: OpLoad %v3float [[i]]
|
|
float3 _11 = ObjectRayDirection();
|
|
// CHECK: OpLoad %mat4v3float [[j]]
|
|
float3x4 _12 = ObjectToWorld3x4();
|
|
// CHECK: OpLoad %mat4v3float [[j]]
|
|
float4x3 _13 = ObjectToWorld4x3();
|
|
// CHECK: OpLoad %mat4v3float [[k]]
|
|
float3x4 _14 = WorldToObject3x4();
|
|
// CHECK: OpLoad %mat4v3float [[k]]
|
|
float4x3 _15 = WorldToObject4x3();
|
|
|
|
Attribute myHitAttribute = { float2(0.0f,0.0f) };
|
|
// CHECK: OpReportIntersectionKHR %bool %float_0 %uint_0
|
|
ReportHit(0.0f, 0U, myHitAttribute);
|
|
}
|
|
|
|
[shader("intersection")]
|
|
void MyISecMain2() {
|
|
Attribute myHitAttribute = { float2(0.0f,1.0f) };
|
|
// CHECK: OpReportIntersectionKHR %bool %float_0 %uint_0
|
|
ReportHit(0.0f, 0U, myHitAttribute);
|
|
}
|
|
|
|
[shader("anyhit")]
|
|
void MyAHitMain(inout Payload MyPayload, in Attribute MyAttr) {
|
|
|
|
// CHECK: OpLoad %v3uint [[a]]
|
|
uint3 _1 = DispatchRaysIndex();
|
|
// CHECK: OpLoad %v3uint [[b]]
|
|
uint3 _2 = DispatchRaysDimensions();
|
|
// CHECK: OpLoad %v3float [[c]]
|
|
float3 _3 = WorldRayOrigin();
|
|
// CHECK: OpLoad %v3float [[d]]
|
|
float3 _4 = WorldRayDirection();
|
|
// CHECK: OpLoad %float [[e]]
|
|
float _5 = RayTMin();
|
|
// CHECK: OpLoad %uint [[f]]
|
|
uint _6 = RayFlags();
|
|
// CHECK: OpLoad %uint %gl_InstanceID
|
|
uint _7 = InstanceIndex();
|
|
// CHECK: OpLoad %uint [[g]]
|
|
uint _8 = InstanceID();
|
|
// CHECK: OpLoad %uint %gl_PrimitiveID
|
|
uint _9 = PrimitiveIndex();
|
|
// CHECK: OpLoad %v3float [[h]]
|
|
float3 _10 = ObjectRayOrigin();
|
|
// CHECK: OpLoad %v3float [[i]]
|
|
float3 _11 = ObjectRayDirection();
|
|
// CHECK: OpLoad %mat4v3float [[j]]
|
|
float3x4 _12 = ObjectToWorld3x4();
|
|
// CHECK: OpLoad %mat4v3float [[j]]
|
|
float4x3 _13 = ObjectToWorld4x3();
|
|
// CHECK: OpLoad %mat4v3float [[k]]
|
|
float3x4 _14 = WorldToObject3x4();
|
|
// CHECK: OpLoad %mat4v3float [[k]]
|
|
float4x3 _15 = WorldToObject4x3();
|
|
// CHECK: OpLoad %uint [[l]]
|
|
uint _16 = HitKind();
|
|
|
|
if (_16 == 1U) {
|
|
// CHECK: OpIgnoreIntersectionNV
|
|
IgnoreHit();
|
|
} else {
|
|
// CHECK: OpTerminateRayNV
|
|
AcceptHitAndEndSearch();
|
|
}
|
|
}
|
|
|
|
[shader("anyhit")]
|
|
void MyAHitMain2(inout Payload MyPayload, in Attribute MyAttr) {
|
|
// CHECK: OpTerminateRayNV
|
|
AcceptHitAndEndSearch();
|
|
}
|
|
|
|
[shader("closesthit")]
|
|
void MyCHitMain(inout Payload MyPayload, in Attribute MyAttr) {
|
|
|
|
// CHECK: OpLoad %v3uint [[a]]
|
|
uint3 _1 = DispatchRaysIndex();
|
|
// CHECK: OpLoad %v3uint [[b]]
|
|
uint3 _2 = DispatchRaysDimensions();
|
|
// CHECK: OpLoad %v3float [[c]]
|
|
float3 _3 = WorldRayOrigin();
|
|
// CHECK: OpLoad %v3float [[d]]
|
|
float3 _4 = WorldRayDirection();
|
|
// CHECK: OpLoad %float [[e]]
|
|
float _5 = RayTMin();
|
|
// CHECK: OpLoad %uint [[f]]
|
|
uint _6 = RayFlags();
|
|
// CHECK: OpLoad %uint %gl_InstanceID
|
|
uint _7 = InstanceIndex();
|
|
// CHECK: OpLoad %uint [[g]]
|
|
uint _8 = InstanceID();
|
|
// CHECK: OpLoad %uint %gl_PrimitiveID
|
|
uint _9 = PrimitiveIndex();
|
|
// CHECK: OpLoad %v3float [[h]]
|
|
float3 _10 = ObjectRayOrigin();
|
|
// CHECK: OpLoad %v3float [[i]]
|
|
float3 _11 = ObjectRayDirection();
|
|
// CHECK: OpLoad %mat4v3float [[j]]
|
|
float3x4 _12 = ObjectToWorld3x4();
|
|
// CHECK: OpLoad %mat4v3float [[j]]
|
|
float4x3 _13 = ObjectToWorld4x3();
|
|
// CHECK: OpLoad %mat4v3float [[k]]
|
|
float3x4 _14 = WorldToObject3x4();
|
|
// CHECK: OpLoad %mat4v3float [[k]]
|
|
float4x3 _15 = WorldToObject4x3();
|
|
// CHECK: OpLoad %uint [[l]]
|
|
uint _16 = HitKind();
|
|
|
|
Payload myPayload = { float4(0.0f,0.0f,0.0f,0.0f) };
|
|
RayDesc rayDesc;
|
|
rayDesc.Origin = float3(0.0f, 0.0f, 0.0f);
|
|
rayDesc.Direction = float3(0.0f, 0.0f, -1.0f);
|
|
rayDesc.TMin = 0.0f;
|
|
rayDesc.TMax = 1000.0f;
|
|
// CHECK: OpTraceNV {{%\d+}} %uint_0 %uint_255 %uint_0 %uint_1 %uint_0 {{%\d+}} {{%\d+}} {{%\d+}} {{%\d+}} %uint_0
|
|
TraceRay(rs, 0x0, 0xff, 0, 1, 0, rayDesc, myPayload);
|
|
}
|
|
|
|
[shader("closesthit")]
|
|
void MyCHitMain2(inout Payload MyPayload, in Attribute MyAttr) {
|
|
MyPayload.color = float4(0.0f,1.0f,0.0f,1.0f);
|
|
}
|
|
|
|
[shader("callable")]
|
|
void MyCallMain(inout CallData myCallData) {
|
|
|
|
// CHECK: OpLoad %v3uint [[a]]
|
|
uint3 a = DispatchRaysIndex();
|
|
// CHECK: OpLoad %v3uint [[b]]
|
|
uint3 b = DispatchRaysDimensions();
|
|
}
|
|
|
|
[shader("callable")]
|
|
void MyCallMain2(inout CallData myCallData) {
|
|
myCallData.data = float4(0.0f,1.0f,0.0f,1.0f);
|
|
}
|