#version 460
#if defined(GL_ARB_gpu_shader_int64)
#extension GL_ARB_gpu_shader_int64 : require
#else
#error No extension available for 64-bit integers.
#endif
#extension GL_EXT_nonuniform_qualifier : require
#extension GL_EXT_shader_image_int64 : require
layout(local_size_x = 128, local_size_y = 1, local_size_z = 1) in;

layout(set = 0, binding = 0, r64ui) uniform u64imageBuffer _9[];
layout(set = 0, binding = 0, r64ui) uniform u64image2D _13[];

void main()
{
    uint64_t _35 = uint64_t(gl_GlobalInvocationID.x);
    uint64_t _38 = imageAtomicAdd(_9[0u], int(0u), _35);
    uint64_t _40 = imageAtomicAnd(_9[1u], int(1u), _35);
    uint64_t _42 = imageAtomicOr(_9[0u], int(2u), _35);
    uint64_t _44 = imageAtomicXor(_9[1u], int(3u), _35);
    uint64_t _47 = imageAtomicMin(_9[0u], int(4u), _35);
    uint64_t _50 = imageAtomicMax(_9[0u], int(5u), _35);
    uint64_t _53 = imageAtomicMin(_9[1u], int(6u), _35);
    uint64_t _56 = imageAtomicMax(_9[1u], int(7u), _35);
    uint64_t _59 = imageAtomicExchange(_9[1u], int(8u), _35);
    uint64_t _62 = imageAtomicCompSwap(_9[0u], int(9u), 10ul, _59);
    uint64_t _66 = imageAtomicCompSwap(_9[1u], int(10u), 20ul, _35);
    uint64_t _71 = imageAtomicAdd(_13[2u], ivec2(uvec2(1u, 2u)), _35);
    uint64_t _74 = imageAtomicAdd(_13[3u], ivec2(uvec2(3u, 4u)), _35);
}


#if 0
// SPIR-V disassembly
; SPIR-V
; Version: 1.3
; Generator: Unknown(30017); 21022
; Bound: 77
; Schema: 0
OpCapability Shader
OpCapability Int64
OpCapability Int64Atomics
OpCapability ImageBuffer
OpCapability Int64ImageEXT
OpCapability RuntimeDescriptorArray
OpExtension "SPV_EXT_descriptor_indexing"
OpExtension "SPV_EXT_shader_image_int64"
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %3 "main" %17
OpExecutionMode %3 LocalSize 128 1 1
OpName %3 "main"
OpDecorate %9 DescriptorSet 0
OpDecorate %9 Binding 0
OpDecorate %13 DescriptorSet 0
OpDecorate %13 Binding 0
OpDecorate %17 BuiltIn GlobalInvocationId
%1 = OpTypeVoid
%2 = OpTypeFunction %1
%5 = OpTypeInt 64 0
%6 = OpTypeImage %5 Buffer 0 0 0 2 R64ui
%7 = OpTypeRuntimeArray %6
%8 = OpTypePointer UniformConstant %7
%9 = OpVariable %8 UniformConstant
%10 = OpTypeImage %5 2D 0 0 0 2 R64ui
%11 = OpTypeRuntimeArray %10
%12 = OpTypePointer UniformConstant %11
%13 = OpVariable %12 UniformConstant
%14 = OpTypeInt 32 0
%15 = OpTypeVector %14 3
%16 = OpTypePointer Input %15
%17 = OpVariable %16 Input
%18 = OpTypePointer Input %14
%20 = OpConstant %14 0
%22 = OpTypePointer UniformConstant %6
%26 = OpConstant %14 1
%28 = OpTypePointer UniformConstant %10
%30 = OpConstant %14 2
%33 = OpConstant %14 3
%36 = OpTypePointer Image %5
%45 = OpConstant %14 4
%48 = OpConstant %14 5
%51 = OpConstant %14 6
%54 = OpConstant %14 7
%57 = OpConstant %14 8
%60 = OpConstant %14 9
%63 = OpConstant %5 10
%64 = OpConstant %14 10
%67 = OpConstant %5 20
%68 = OpTypeVector %14 2
%3 = OpFunction %1 None %2
%4 = OpLabel
OpBranch %75
%75 = OpLabel
%19 = OpAccessChain %18 %17 %20
%21 = OpLoad %14 %19
%23 = OpAccessChain %22 %9 %20
%24 = OpLoad %6 %23
%25 = OpAccessChain %22 %9 %26
%27 = OpLoad %6 %25
%29 = OpAccessChain %28 %13 %30
%31 = OpLoad %10 %29
%32 = OpAccessChain %28 %13 %33
%34 = OpLoad %10 %32
%35 = OpUConvert %5 %21
%37 = OpImageTexelPointer %36 %23 %20 %20
%38 = OpAtomicIAdd %5 %37 %26 %20 %35
%39 = OpImageTexelPointer %36 %25 %26 %20
%40 = OpAtomicAnd %5 %39 %26 %20 %35
%41 = OpImageTexelPointer %36 %23 %30 %20
%42 = OpAtomicOr %5 %41 %26 %20 %35
%43 = OpImageTexelPointer %36 %25 %33 %20
%44 = OpAtomicXor %5 %43 %26 %20 %35
%46 = OpImageTexelPointer %36 %23 %45 %20
%47 = OpAtomicUMin %5 %46 %26 %20 %35
%49 = OpImageTexelPointer %36 %23 %48 %20
%50 = OpAtomicUMax %5 %49 %26 %20 %35
%52 = OpImageTexelPointer %36 %25 %51 %20
%53 = OpAtomicSMin %5 %52 %26 %20 %35
%55 = OpImageTexelPointer %36 %25 %54 %20
%56 = OpAtomicSMax %5 %55 %26 %20 %35
%58 = OpImageTexelPointer %36 %25 %57 %20
%59 = OpAtomicExchange %5 %58 %26 %20 %35
%61 = OpImageTexelPointer %36 %23 %60 %20
%62 = OpAtomicCompareExchange %5 %61 %26 %20 %20 %59 %63
%65 = OpImageTexelPointer %36 %25 %64 %20
%66 = OpAtomicCompareExchange %5 %65 %26 %20 %20 %35 %67
%69 = OpCompositeConstruct %68 %26 %30
%70 = OpImageTexelPointer %36 %29 %69 %20
%71 = OpAtomicIAdd %5 %70 %26 %20 %35
%72 = OpCompositeConstruct %68 %33 %45
%73 = OpImageTexelPointer %36 %32 %72 %20
%74 = OpAtomicIAdd %5 %73 %26 %20 %35
OpReturn
OpFunctionEnd
#endif
