#version 460
#extension GL_EXT_ray_tracing : require
#extension GL_EXT_nonuniform_qualifier : require

struct _10
{
    vec4 _m0;
};

layout(set = 0, binding = 0) uniform writeonly image2D IMG;
layout(location = 0) callableDataEXT _10 _12;
layout(location = 1) callableDataEXT _10 _13;
layout(location = 2) callableDataEXT _10 _14;
layout(location = 3) callableDataEXT _10 _15;

void main()
{
    executeCallableEXT(0u, 0);
    executeCallableEXT(1u, 1);
    executeCallableEXT(2u, 2);
    executeCallableEXT(3u, 3);
    imageStore(IMG, ivec2(uvec2(gl_LaunchIDEXT.x, gl_LaunchIDEXT.y)), vec4(((_13._m0.x + _12._m0.x) + _14._m0.x) + _15._m0.x, ((_13._m0.y + _12._m0.y) + _14._m0.y) + _15._m0.y, ((_13._m0.z + _12._m0.z) + _14._m0.z) + _15._m0.z, ((_13._m0.w + _12._m0.w) + _14._m0.w) + _15._m0.w));
}


#if 0
// SPIR-V disassembly
; SPIR-V
; Version: 1.4
; Generator: Unknown(30017); 21022
; Bound: 72
; Schema: 0
OpCapability Shader
OpCapability UniformBufferArrayDynamicIndexing
OpCapability SampledImageArrayDynamicIndexing
OpCapability StorageBufferArrayDynamicIndexing
OpCapability StorageImageArrayDynamicIndexing
OpCapability StorageImageWriteWithoutFormat
OpCapability RayTracingKHR
OpCapability RuntimeDescriptorArray
OpCapability UniformBufferArrayNonUniformIndexing
OpCapability SampledImageArrayNonUniformIndexing
OpCapability StorageBufferArrayNonUniformIndexing
OpCapability StorageImageArrayNonUniformIndexing
OpExtension "SPV_EXT_descriptor_indexing"
OpExtension "SPV_KHR_ray_tracing"
OpMemoryModel Logical GLSL450
OpEntryPoint RayGenerationNV %3 "main" %8 %12 %13 %14 %15 %60
OpName %3 "main"
OpName %8 "IMG"
OpName %10 ""
OpDecorate %8 DescriptorSet 0
OpDecorate %8 Binding 0
OpDecorate %8 NonReadable
OpDecorate %60 BuiltIn LaunchIdNV
%1 = OpTypeVoid
%2 = OpTypeFunction %1
%5 = OpTypeFloat 32
%6 = OpTypeImage %5 2D 0 0 0 2 Unknown
%7 = OpTypePointer UniformConstant %6
%8 = OpVariable %7 UniformConstant
%9 = OpTypeVector %5 4
%10 = OpTypeStruct %9
%11 = OpTypePointer CallableDataNV %10
%12 = OpVariable %11 CallableDataNV
%13 = OpVariable %11 CallableDataNV
%14 = OpVariable %11 CallableDataNV
%15 = OpVariable %11 CallableDataNV
%16 = OpTypeInt 32 0
%17 = OpConstant %16 0
%18 = OpConstant %16 1
%19 = OpConstant %16 2
%20 = OpConstant %16 3
%21 = OpTypePointer CallableDataNV %9
%58 = OpTypeVector %16 3
%59 = OpTypePointer Input %58
%60 = OpVariable %59 Input
%61 = OpTypePointer Input %16
%67 = OpTypeVector %16 2
%3 = OpFunction %1 None %2
%4 = OpLabel
OpBranch %70
%70 = OpLabel
OpExecuteCallableKHR %17 %12
OpExecuteCallableKHR %18 %13
OpExecuteCallableKHR %19 %14
OpExecuteCallableKHR %20 %15
%22 = OpInBoundsAccessChain %21 %12 %17
%23 = OpLoad %9 %22
%24 = OpCompositeExtract %5 %23 0
%25 = OpCompositeExtract %5 %23 1
%26 = OpCompositeExtract %5 %23 2
%27 = OpCompositeExtract %5 %23 3
%28 = OpInBoundsAccessChain %21 %13 %17
%29 = OpLoad %9 %28
%30 = OpCompositeExtract %5 %29 0
%31 = OpFAdd %5 %30 %24
%32 = OpCompositeExtract %5 %29 1
%33 = OpFAdd %5 %32 %25
%34 = OpCompositeExtract %5 %29 2
%35 = OpFAdd %5 %34 %26
%36 = OpCompositeExtract %5 %29 3
%37 = OpFAdd %5 %36 %27
%38 = OpInBoundsAccessChain %21 %14 %17
%39 = OpLoad %9 %38
%40 = OpCompositeExtract %5 %39 0
%41 = OpFAdd %5 %31 %40
%42 = OpCompositeExtract %5 %39 1
%43 = OpFAdd %5 %33 %42
%44 = OpCompositeExtract %5 %39 2
%45 = OpFAdd %5 %35 %44
%46 = OpCompositeExtract %5 %39 3
%47 = OpFAdd %5 %37 %46
%48 = OpInBoundsAccessChain %21 %15 %17
%49 = OpLoad %9 %48
%50 = OpCompositeExtract %5 %49 0
%51 = OpFAdd %5 %41 %50
%52 = OpCompositeExtract %5 %49 1
%53 = OpFAdd %5 %43 %52
%54 = OpCompositeExtract %5 %49 2
%55 = OpFAdd %5 %45 %54
%56 = OpCompositeExtract %5 %49 3
%57 = OpFAdd %5 %47 %56
%62 = OpAccessChain %61 %60 %17
%63 = OpLoad %16 %62
%64 = OpAccessChain %61 %60 %18
%65 = OpLoad %16 %64
%66 = OpLoad %6 %8
%68 = OpCompositeConstruct %67 %63 %65
%69 = OpCompositeConstruct %9 %51 %53 %55 %57
OpImageWrite %66 %68 %69
OpReturn
OpFunctionEnd
#endif
