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

struct _15
{
    vec4 _m0;
};

layout(set = 10, binding = 10, std430) buffer DescriptorHeapGlobalQAData
{
    uvec2 failed_shader_hash;
    uint failed_offset;
    uint failed_heap;
    uint failed_cookie;
    uint fault_atomic;
    uint failed_instruction;
    uint failed_descriptor_type_mask;
    uint actual_descriptor_type_mask;
    uint fault_type;
    uint live_status_table[];
} QAGlobalData;

layout(set = 10, binding = 11, std430) readonly buffer DescriptorHeapQAData
{
    uint descriptor_count;
    uint heap_index;
    uvec2 cookies_descriptor_info[];
} QAHeapData;

layout(push_constant, std430) uniform RootConstants
{
    uint _m0;
    uint _m1;
    uint _m2;
    uint _m3;
    uint _m4;
    uint _m5;
    uint _m6;
    uint _m7;
} registers;

layout(set = 0, binding = 0) uniform accelerationStructureEXT _12[];
layout(location = 0) rayPayloadEXT _15 _17;

void descriptor_qa_report_fault(uint fault_type, uint heap_offset, uint cookie, uint heap_index, uint descriptor_type, uint actual_descriptor_type, uint instruction)
{
    uint _54 = atomicAdd(QAGlobalData.fault_atomic, 1u);
    if (_54 == 0u)
    {
        QAGlobalData.failed_cookie = cookie;
        QAGlobalData.failed_offset = heap_offset;
        QAGlobalData.failed_heap = heap_index;
        QAGlobalData.failed_descriptor_type_mask = descriptor_type;
        QAGlobalData.actual_descriptor_type_mask = actual_descriptor_type;
        QAGlobalData.failed_instruction = instruction;
        QAGlobalData.failed_shader_hash = uvec2(3735928559u, 0u);
        memoryBarrierBuffer();
        QAGlobalData.fault_type = fault_type;
    }
}

uint descriptor_qa_check(uint heap_offset, uint descriptor_type_mask, uint instruction)
{
    uint _90 = QAHeapData.descriptor_count;
    uint _92 = QAHeapData.heap_index;
    uvec2 _94 = QAHeapData.cookies_descriptor_info[heap_offset];
    uint _102 = QAGlobalData.live_status_table[_94.x >> 5u];
    uint _113 = (uint(heap_offset >= _90) | (((_94.y & descriptor_type_mask) == descriptor_type_mask) ? 0u : 2u)) | (((_102 & (1u << (_94.x & 31u))) != 0u) ? 0u : 4u);
    if (_113 != 0u)
    {
        descriptor_qa_report_fault(_113, heap_offset, _94.x, _92, descriptor_type_mask, _94.y, instruction);
        return _90;
    }
    return heap_offset;
}

void main()
{
    _17._m0 = vec4(1.0, 2.0, 3.0, 4.0);
    uint _35 = descriptor_qa_check((registers._m0 + 100u) + 10u, 64u, 1u);
    traceRayEXT(_12[_35], 0u, 0u, 0u, 0u, 0u, vec3(1.0, 2.0, 3.0), 1.0, vec3(0.0, 0.0, 1.0), 4.0, 0);
    uint _130 = descriptor_qa_check(registers._m0 + 3u, 64u, 2u);
    traceRayEXT(_12[_130], 0u, 0u, 0u, 0u, 0u, vec3(1.0, 2.0, 3.0), 1.0, vec3(0.0, 0.0, 1.0), 4.0, 0);
    uint _142 = descriptor_qa_check((registers._m0 + 100u) + uint(int(_17._m0.w)), 64u, 3u);
    traceRayEXT(_12[nonuniformEXT(_142)], 0u, 0u, 0u, 0u, 0u, vec3(1.0, 2.0, 3.0), 1.0, vec3(0.0, 0.0, 1.0), 4.0, 0);
}


#if 0
// SPIR-V disassembly
; SPIR-V
; Version: 1.4
; Generator: Unknown(30017); 21022
; Bound: 148
; Schema: 0
OpCapability Shader
OpCapability UniformBufferArrayDynamicIndexing
OpCapability SampledImageArrayDynamicIndexing
OpCapability StorageBufferArrayDynamicIndexing
OpCapability StorageImageArrayDynamicIndexing
OpCapability RayTracingKHR
OpCapability RuntimeDescriptorArray
OpCapability UniformBufferArrayNonUniformIndexing
OpCapability SampledImageArrayNonUniformIndexing
OpCapability StorageBufferArrayNonUniformIndexing
OpCapability StorageImageArrayNonUniformIndexing
OpCapability PhysicalStorageBufferAddresses
OpExtension "SPV_EXT_descriptor_indexing"
OpExtension "SPV_KHR_physical_storage_buffer"
OpExtension "SPV_KHR_ray_tracing"
OpMemoryModel PhysicalStorageBuffer64 GLSL450
OpEntryPoint RayGenerationNV %3 "main" %8 %12 %17 %40 %82
OpName %3 "main"
OpName %6 "RootConstants"
OpName %8 "registers"
OpName %15 ""
OpName %38 "DescriptorHeapGlobalQAData"
OpMemberName %38 0 "failed_shader_hash"
OpMemberName %38 1 "failed_offset"
OpMemberName %38 2 "failed_heap"
OpMemberName %38 3 "failed_cookie"
OpMemberName %38 4 "fault_atomic"
OpMemberName %38 5 "failed_instruction"
OpMemberName %38 6 "failed_descriptor_type_mask"
OpMemberName %38 7 "actual_descriptor_type_mask"
OpMemberName %38 8 "fault_type"
OpMemberName %38 9 "live_status_table"
OpName %40 "QAGlobalData"
OpName %49 "descriptor_qa_report_fault"
OpName %42 "fault_type"
OpName %43 "heap_offset"
OpName %44 "cookie"
OpName %45 "heap_index"
OpName %46 "descriptor_type"
OpName %47 "actual_descriptor_type"
OpName %48 "instruction"
OpName %80 "DescriptorHeapQAData"
OpMemberName %80 0 "descriptor_count"
OpMemberName %80 1 "heap_index"
OpMemberName %80 2 "cookies_descriptor_info"
OpName %82 "QAHeapData"
OpName %87 "descriptor_qa_check"
OpName %84 "heap_offset"
OpName %85 "descriptor_type_mask"
OpName %86 "instruction"
OpDecorate %6 Block
OpMemberDecorate %6 0 Offset 0
OpMemberDecorate %6 1 Offset 4
OpMemberDecorate %6 2 Offset 8
OpMemberDecorate %6 3 Offset 12
OpMemberDecorate %6 4 Offset 16
OpMemberDecorate %6 5 Offset 20
OpMemberDecorate %6 6 Offset 24
OpMemberDecorate %6 7 Offset 28
OpDecorate %12 DescriptorSet 0
OpDecorate %12 Binding 0
OpDecorate %37 ArrayStride 4
OpMemberDecorate %38 0 Offset 0
OpMemberDecorate %38 1 Offset 8
OpMemberDecorate %38 2 Offset 12
OpMemberDecorate %38 3 Offset 16
OpMemberDecorate %38 4 Offset 20
OpMemberDecorate %38 5 Offset 24
OpMemberDecorate %38 6 Offset 28
OpMemberDecorate %38 7 Offset 32
OpMemberDecorate %38 8 Offset 36
OpMemberDecorate %38 9 Offset 40
OpDecorate %38 Block
OpDecorate %40 DescriptorSet 10
OpDecorate %40 Binding 10
OpDecorate %79 ArrayStride 8
OpMemberDecorate %80 0 Offset 0
OpMemberDecorate %80 1 Offset 4
OpMemberDecorate %80 2 Offset 8
OpDecorate %80 Block
OpDecorate %82 DescriptorSet 10
OpDecorate %82 Binding 11
OpDecorate %82 NonWritable
OpDecorate %142 NonUniform
OpDecorate %143 NonUniform
%1 = OpTypeVoid
%2 = OpTypeFunction %1
%5 = OpTypeInt 32 0
%6 = OpTypeStruct %5 %5 %5 %5 %5 %5 %5 %5
%7 = OpTypePointer PushConstant %6
%8 = OpVariable %7 PushConstant
%9 = OpTypeAccelerationStructureKHR
%10 = OpTypeRuntimeArray %9
%11 = OpTypePointer UniformConstant %10
%12 = OpVariable %11 UniformConstant
%13 = OpTypeFloat 32
%14 = OpTypeVector %13 4
%15 = OpTypeStruct %14
%16 = OpTypePointer RayPayloadNV %15
%17 = OpVariable %16 RayPayloadNV
%18 = OpTypePointer RayPayloadNV %14
%20 = OpConstant %5 0
%21 = OpConstant %13 1
%22 = OpConstant %13 2
%23 = OpConstant %13 3
%24 = OpConstant %13 4
%25 = OpConstantComposite %14 %21 %22 %23 %24
%26 = OpTypePointer UniformConstant %9
%28 = OpTypePointer PushConstant %5
%32 = OpConstant %5 100
%34 = OpConstant %5 10
%36 = OpTypeVector %5 2
%37 = OpTypeRuntimeArray %5
%38 = OpTypeStruct %36 %5 %5 %5 %5 %5 %5 %5 %5 %37
%39 = OpTypePointer StorageBuffer %38
%40 = OpVariable %39 StorageBuffer
%41 = OpTypeFunction %1 %5 %5 %5 %5 %5 %5 %5
%51 = OpTypePointer StorageBuffer %5
%53 = OpConstant %5 4
%55 = OpConstant %5 1
%56 = OpTypeBool
%61 = OpConstant %5 3
%64 = OpConstant %5 2
%66 = OpConstant %5 6
%68 = OpConstant %5 7
%70 = OpConstant %5 5
%71 = OpConstant %5 3735928559
%72 = OpConstantComposite %36 %71 %20
%73 = OpTypePointer StorageBuffer %36
%75 = OpConstant %5 72
%77 = OpConstant %5 8
%79 = OpTypeRuntimeArray %36
%80 = OpTypeStruct %5 %5 %79
%81 = OpTypePointer StorageBuffer %80
%82 = OpVariable %81 StorageBuffer
%83 = OpTypeFunction %5 %5 %5 %5
%99 = OpConstant %5 31
%101 = OpConstant %5 9
%120 = OpConstant %5 64
%122 = OpConstant %13 0
%123 = OpTypeVector %13 3
%3 = OpFunction %1 None %2
%4 = OpLabel
OpBranch %146
%146 = OpLabel
%19 = OpInBoundsAccessChain %18 %17 %20
OpStore %19 %25
%29 = OpAccessChain %28 %8 %20
%30 = OpLoad %5 %29
%31 = OpIAdd %5 %30 %32
%33 = OpIAdd %5 %31 %34
%35 = OpFunctionCall %5 %87 %33 %120 %55
%27 = OpAccessChain %26 %12 %35
%121 = OpLoad %9 %27
%124 = OpCompositeConstruct %123 %21 %22 %23
%125 = OpCompositeConstruct %123 %122 %122 %21
OpTraceRayKHR %121 %20 %20 %20 %20 %20 %124 %21 %125 %24 %17
%127 = OpAccessChain %28 %8 %20
%128 = OpLoad %5 %127
%129 = OpIAdd %5 %128 %61
%130 = OpFunctionCall %5 %87 %129 %120 %64
%126 = OpAccessChain %26 %12 %130
%131 = OpLoad %9 %126
%132 = OpCompositeConstruct %123 %21 %22 %23
%133 = OpCompositeConstruct %123 %122 %122 %21
OpTraceRayKHR %131 %20 %20 %20 %20 %20 %132 %21 %133 %24 %17
%134 = OpLoad %14 %19
%135 = OpCompositeExtract %13 %134 3
%136 = OpConvertFToS %5 %135
%138 = OpAccessChain %28 %8 %20
%139 = OpLoad %5 %138
%140 = OpIAdd %5 %139 %32
%141 = OpIAdd %5 %140 %136
%142 = OpFunctionCall %5 %87 %141 %120 %61
%137 = OpAccessChain %26 %12 %142
%143 = OpLoad %9 %137
%144 = OpCompositeConstruct %123 %21 %22 %23
%145 = OpCompositeConstruct %123 %122 %122 %21
OpTraceRayKHR %143 %20 %20 %20 %20 %20 %144 %21 %145 %24 %17
OpReturn
OpFunctionEnd
%49 = OpFunction %1 None %41
%42 = OpFunctionParameter %5
%43 = OpFunctionParameter %5
%44 = OpFunctionParameter %5
%45 = OpFunctionParameter %5
%46 = OpFunctionParameter %5
%47 = OpFunctionParameter %5
%48 = OpFunctionParameter %5
%50 = OpLabel
%52 = OpAccessChain %51 %40 %53
%54 = OpAtomicIAdd %5 %52 %55 %20 %55
%57 = OpIEqual %56 %54 %20
OpSelectionMerge %59 None
OpBranchConditional %57 %58 %59
%58 = OpLabel
%60 = OpAccessChain %51 %40 %61
OpStore %60 %44
%62 = OpAccessChain %51 %40 %55
OpStore %62 %43
%63 = OpAccessChain %51 %40 %64
OpStore %63 %45
%65 = OpAccessChain %51 %40 %66
OpStore %65 %46
%67 = OpAccessChain %51 %40 %68
OpStore %67 %47
%69 = OpAccessChain %51 %40 %70
OpStore %69 %48
%74 = OpAccessChain %73 %40 %20
OpStore %74 %72
OpMemoryBarrier %55 %75
%76 = OpAccessChain %51 %40 %77
OpStore %76 %42
OpBranch %59
%59 = OpLabel
OpReturn
OpFunctionEnd
%87 = OpFunction %5 None %83
%84 = OpFunctionParameter %5
%85 = OpFunctionParameter %5
%86 = OpFunctionParameter %5
%88 = OpLabel
%89 = OpAccessChain %51 %82 %20
%90 = OpLoad %5 %89
%91 = OpAccessChain %51 %82 %55
%92 = OpLoad %5 %91
%93 = OpAccessChain %73 %82 %64 %84
%94 = OpLoad %36 %93
%95 = OpCompositeExtract %5 %94 0
%97 = OpShiftRightLogical %5 %95 %70
%98 = OpBitwiseAnd %5 %95 %99
%96 = OpCompositeExtract %5 %94 1
%100 = OpAccessChain %51 %40 %101 %97
%102 = OpLoad %5 %100
%103 = OpShiftLeftLogical %5 %55 %98
%104 = OpBitwiseAnd %5 %102 %103
%105 = OpINotEqual %56 %104 %20
%106 = OpBitwiseAnd %5 %96 %85
%107 = OpIEqual %56 %106 %85
%108 = OpUGreaterThanEqual %56 %84 %90
%109 = OpSelect %5 %108 %55 %20
%110 = OpSelect %5 %107 %20 %64
%111 = OpSelect %5 %105 %20 %53
%112 = OpBitwiseOr %5 %109 %110
%113 = OpBitwiseOr %5 %112 %111
%114 = OpINotEqual %56 %113 %20
OpSelectionMerge %116 None
OpBranchConditional %114 %115 %116
%115 = OpLabel
%117 = OpFunctionCall %1 %49 %113 %84 %95 %92 %85 %96 %86
OpReturnValue %90
%116 = OpLabel
OpReturnValue %84
OpFunctionEnd
#endif
