Vulkan-ValidationLayers icon indicating copy to clipboard operation
Vulkan-ValidationLayers copied to clipboard

Create Multi entrypoint tests for RayTracing

Open spencer-lunarg opened this issue 9 months ago • 0 comments

Same idea as PositiveGpuAVOOB/VertexFragmentMultiEntrypoint/NegativeGpuAVOOB.VertexFragmentMultiEntrypoint (from https://github.com/KhronosGroup/Vulkan-ValidationLayers/pull/7778/files)

We should add a simple RTX test in PositiveGpuAVRayTracing/NegativeGpuAVRayTracing to test we handle this correctly

The biggest issue is the rt::Pipeline::SetRayGenShader test framework interface allows no way to do this currently

Here is a simple HLSL (and SPIR-V) example

// Compile with
// dxc -spirv -T lib_6_4 -fspv-target-env=vulkan1.2 -Fo out.spv in.hlsl 
struct ColorPayload {
    uint index;
};

[shader("miss")] 
void mainMiss(inout ColorPayload payload) {
    payload.index = 0;
}

[shader("closesthit")]
void mainClosestHit(inout ColorPayload payload, BuiltInTriangleIntersectionAttributes attr) {
    payload.index = 1;
}

RWStructuredBuffer<float> OutBuffer : register(u0); // StorageBuffer (set 0, binding 0)
Texture2D MyTextures[] : register(t1); // Texture array (set 0, binding 1)
RaytracingAccelerationStructure _tlas; // (set 0, binding 2)

[shader("raygeneration")]
void mainRaygen() {
    float2 uv = float2(0.5, 0.5);

    RayDesc ray;
    ray.Origin = ray.Origin;
    ray.TMin = 0;
    ray.Direction = float3(0.5, 0.5, 0.5);
    ray.TMax = 1e6;

    ColorPayload payload;
    TraceRay(_tlas, -1, RAY_FLAG_NONE, 0, 0, 0, ray, payload);
    
    // the index will either be 0 or 1, this can be adjusted, but the main thing is to use this to trigger (or not trigger) descriptor indexing OOB
    Texture2D tex = MyTextures[NonUniformResourceIndex(payload.index)];
    float4 val = tex[uv];
    OutBuffer[0] = val.x;
}

Spirv

OpCapability RayTracingKHR OpCapability RuntimeDescriptorArray OpCapability ShaderNonUniform OpCapability SampledImageArrayNonUniformIndexing OpExtension "SPV_KHR_ray_tracing" OpExtension "SPV_EXT_descriptor_indexing" OpMemoryModel Logical GLSL450 OpEntryPoint MissNV %mainMiss "mainMiss" %payload OpEntryPoint ClosestHitNV %mainClosestHit "mainClosestHit" %payload_0 OpEntryPoint RayGenerationNV %mainRaygen "mainRaygen" %OutBuffer %MyTextures %_tlas %payload_1 OpSource HLSL 640 OpName %type_RWStructuredBuffer_float "type.RWStructuredBuffer.float" OpName %OutBuffer "OutBuffer" OpName %type_2d_image "type.2d.image" OpName %MyTextures "MyTextures" OpName %accelerationStructureNV "accelerationStructureNV" OpName %_tlas "_tlas" OpName %ColorPayload "ColorPayload" OpMemberName %ColorPayload 0 "index" OpName %payload "payload" OpName %payload_0 "payload" OpName %payload_1 "payload" OpName %mainMiss "mainMiss" OpName %mainClosestHit "mainClosestHit" OpName %mainRaygen "mainRaygen" OpDecorate %payload_1 Location 0 OpDecorate %OutBuffer DescriptorSet 0 OpDecorate %OutBuffer Binding 0 OpDecorate %MyTextures DescriptorSet 0 OpDecorate %MyTextures Binding 1 OpDecorate %_tlas DescriptorSet 0 OpDecorate %_tlas Binding 2 OpDecorate %_runtimearr_float ArrayStride 4 OpMemberDecorate %type_RWStructuredBuffer_float 0 Offset 0 OpDecorate %type_RWStructuredBuffer_float Block OpDecorate %15 NonUniform OpDecorate %16 NonUniform OpDecorate %17 NonUniform %uint = OpTypeInt 32 0 %uint_0 = OpConstant %uint 0 %int = OpTypeInt 32 1 %int_0 = OpConstant %int 0 %uint_1 = OpConstant %uint 1 %float = OpTypeFloat 32 %float_0_5 = OpConstant %float 0.5 %float_0 = OpConstant %float 0 %v3float = OpTypeVector %float 3 %27 = OpConstantComposite %v3float %float_0_5 %float_0_5 %float_0_5 %float_1000000 = OpConstant %float 1000000 %uint_4294967295 = OpConstant %uint 4294967295 %_runtimearr_float = OpTypeRuntimeArray %float %type_RWStructuredBuffer_float = OpTypeStruct %_runtimearr_float %_ptr_StorageBuffer_type_RWStructuredBuffer_float = OpTypePointer StorageBuffer %type_RWStructuredBuffer_float %type_2d_image = OpTypeImage %float 2D 2 0 0 1 Unknown %_runtimearr_type_2d_image = OpTypeRuntimeArray %type_2d_image %_ptr_UniformConstant__runtimearr_type_2d_image = OpTypePointer UniformConstant %_runtimearr_type_2d_image %accelerationStructureNV = OpTypeAccelerationStructureKHR %_ptr_UniformConstant_accelerationStructureNV = OpTypePointer UniformConstant %accelerationStructureNV %ColorPayload = OpTypeStruct %uint %_ptr_IncomingRayPayloadNV_ColorPayload = OpTypePointer IncomingRayPayloadNV %ColorPayload %_ptr_RayPayloadNV_ColorPayload = OpTypePointer RayPayloadNV %ColorPayload %void = OpTypeVoid %37 = OpTypeFunction %void %v4float = OpTypeVector %float 4 %_ptr_UniformConstant_type_2d_image = OpTypePointer UniformConstant %type_2d_image %v2uint = OpTypeVector %uint 2 %_ptr_StorageBuffer_float = OpTypePointer StorageBuffer %float %OutBuffer = OpVariable %_ptr_StorageBuffer_type_RWStructuredBuffer_float StorageBuffer %MyTextures = OpVariable %_ptr_UniformConstant__runtimearr_type_2d_image UniformConstant %_tlas = OpVariable %_ptr_UniformConstant_accelerationStructureNV UniformConstant %payload = OpVariable %_ptr_IncomingRayPayloadNV_ColorPayload IncomingRayPayloadNV %payload_0 = OpVariable %_ptr_IncomingRayPayloadNV_ColorPayload IncomingRayPayloadNV %payload_1 = OpVariable %_ptr_RayPayloadNV_ColorPayload RayPayloadNV %42 = OpUndef %v3float %43 = OpUndef %uint %44 = OpConstantComposite %ColorPayload %uint_0 %45 = OpConstantComposite %ColorPayload %uint_1 %46 = OpConstantComposite %v2uint %uint_0 %uint_0 %mainMiss = OpFunction %void None %37 %47 = OpLabel OpStore %payload %44 OpReturn OpFunctionEnd %mainClosestHit = OpFunction %void None %37 %48 = OpLabel OpStore %payload_0 %45 OpReturn OpFunctionEnd %mainRaygen = OpFunction %void None %37 %49 = OpLabel %50 = OpCompositeConstruct %ColorPayload %43 OpStore %payload_1 %50 %51 = OpLoad %accelerationStructureNV %_tlas OpTraceRayKHR %51 %uint_4294967295 %uint_0 %uint_0 %uint_0 %uint_0 %42 %float_0 %27 %float_1000000 %payload_1 %52 = OpLoad %ColorPayload %payload_1 %53 = OpCompositeExtract %uint %52 0 %15 = OpCopyObject %uint %53 %16 = OpAccessChain %_ptr_UniformConstant_type_2d_image %MyTextures %15 %17 = OpLoad %type_2d_image %16 %54 = OpImageFetch %v4float %17 %46 Lod %uint_0 %55 = OpCompositeExtract %float %54 0 %56 = OpAccessChain %_ptr_StorageBuffer_float %OutBuffer %int_0 %uint_0 OpStore %56 %55 OpReturn OpFunctionEnd

spencer-lunarg avatar May 10 '24 04:05 spencer-lunarg