#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_shader_explicit_arithmetic_types_int16 : require
#extension GL_EXT_shader_16bit_storage : require
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;

layout(set = 0, binding = 0, std430) writeonly buffer SSBO
{
    uvec4 _m0[];
} _15;

layout(set = 0, binding = 0, std430) writeonly buffer _19_21
{
    u64vec4 _m0[];
} _21;

layout(set = 0, binding = 0) uniform mediump utexture2D _8;
layout(set = 0, binding = 1) uniform utexture2D _9;
layout(set = 0, binding = 2) uniform utexture2D _10;
layout(set = 0, binding = 0) uniform sampler _24;

void main()
{
    u16vec4 _42 = u16vec4(textureGatherOffset(usampler2D(_8, _24), vec2(0.5), ivec2(1, 2)));
    uint _47 = uint(_42.x);
    uint _48 = uint(_42.y);
    vec2 _62 = vec2(0.5);
    uvec4 _65 = textureGatherOffset(usampler2D(_10, _24), _62, ivec2(4, 5));
    uvec4 _67 = textureGatherOffset(usampler2D(_10, _24), _62, ivec2(4, 5), int(1u));
    _15._m0[0u] = uvec4(_47, _48, uint(_42.z), uint(_42.w));
    _15._m0[1u] = uvec4(textureGatherOffset(usampler2D(_9, _24), vec2(0.5), ivec2(int(_47), int(_48))));
    _21._m0[1u] = u64vec4(u64vec4(packUint2x32(uvec2(_65.x, _67.x)), packUint2x32(uvec2(_65.y, _67.y)), packUint2x32(uvec2(_65.z, _67.z)), packUint2x32(uvec2(_65.w, _67.w))));
}


#if 0
// SPIR-V disassembly
; SPIR-V
; Version: 1.3
; Generator: Unknown(30017); 21022
; Bound: 103
; Schema: 0
OpCapability Shader
OpCapability Int64
OpCapability Int16
OpCapability ImageGatherExtended
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %3 "main"
OpExecutionMode %3 LocalSize 1 1 1
OpName %3 "main"
OpName %13 "SSBO"
OpName %19 "SSBO"
OpDecorate %8 RelaxedPrecision
OpDecorate %8 DescriptorSet 0
OpDecorate %8 Binding 0
OpDecorate %9 DescriptorSet 0
OpDecorate %9 Binding 1
OpDecorate %10 DescriptorSet 0
OpDecorate %10 Binding 2
OpDecorate %12 ArrayStride 16
OpMemberDecorate %13 0 Offset 0
OpDecorate %13 Block
OpDecorate %18 ArrayStride 32
OpMemberDecorate %19 0 Offset 0
OpDecorate %19 Block
OpDecorate %15 DescriptorSet 0
OpDecorate %15 Binding 0
OpDecorate %15 NonReadable
OpDecorate %15 Aliased
OpDecorate %21 DescriptorSet 0
OpDecorate %21 Binding 0
OpDecorate %21 NonReadable
OpDecorate %21 Aliased
OpDecorate %24 DescriptorSet 0
OpDecorate %24 Binding 0
%1 = OpTypeVoid
%2 = OpTypeFunction %1
%5 = OpTypeInt 32 0
%6 = OpTypeImage %5 2D 0 0 0 1 Unknown
%7 = OpTypePointer UniformConstant %6
%8 = OpVariable %7 UniformConstant
%9 = OpVariable %7 UniformConstant
%10 = OpVariable %7 UniformConstant
%11 = OpTypeVector %5 4
%12 = OpTypeRuntimeArray %11
%13 = OpTypeStruct %12
%14 = OpTypePointer StorageBuffer %13
%15 = OpVariable %14 StorageBuffer
%16 = OpTypeInt 64 0
%17 = OpTypeVector %16 4
%18 = OpTypeRuntimeArray %17
%19 = OpTypeStruct %18
%20 = OpTypePointer StorageBuffer %19
%21 = OpVariable %20 StorageBuffer
%22 = OpTypeSampler
%23 = OpTypePointer UniformConstant %22
%24 = OpVariable %23 UniformConstant
%27 = OpTypeSampledImage %6
%29 = OpTypeFloat 32
%30 = OpConstant %29 0.5
%31 = OpTypeVector %29 2
%33 = OpTypeInt 32 1
%34 = OpConstant %33 1
%35 = OpConstant %33 2
%36 = OpConstant %5 0
%38 = OpTypeVector %33 2
%39 = OpConstantComposite %38 %34 %35
%40 = OpTypeInt 16 0
%41 = OpTypeVector %40 4
%63 = OpConstant %33 4
%64 = OpConstant %33 5
%66 = OpConstantComposite %38 %63 %64
%68 = OpConstant %5 1
%71 = OpTypeVector %5 2
%94 = OpTypePointer StorageBuffer %11
%99 = OpTypePointer StorageBuffer %17
%3 = OpFunction %1 None %2
%4 = OpLabel
OpBranch %101
%101 = OpLabel
%25 = OpLoad %6 %8
%26 = OpLoad %22 %24
%28 = OpSampledImage %27 %25 %26
%32 = OpCompositeConstruct %31 %30 %30
%37 = OpImageGather %11 %28 %32 %36 ConstOffset %39
%42 = OpUConvert %41 %37
%43 = OpCompositeExtract %40 %42 0
%44 = OpCompositeExtract %40 %42 1
%45 = OpCompositeExtract %40 %42 2
%46 = OpCompositeExtract %40 %42 3
%47 = OpUConvert %5 %43
%48 = OpUConvert %5 %44
%49 = OpLoad %6 %9
%50 = OpSampledImage %27 %49 %26
%51 = OpCompositeConstruct %31 %30 %30
%52 = OpBitcast %33 %47
%53 = OpBitcast %33 %48
%55 = OpCompositeConstruct %38 %52 %53
%54 = OpImageGather %11 %50 %51 %36 Offset %55
%56 = OpCompositeExtract %5 %54 0
%57 = OpCompositeExtract %5 %54 1
%58 = OpCompositeExtract %5 %54 2
%59 = OpCompositeExtract %5 %54 3
%60 = OpLoad %6 %10
%61 = OpSampledImage %27 %60 %26
%62 = OpCompositeConstruct %31 %30 %30
%65 = OpImageGather %11 %61 %62 %36 ConstOffset %66
%67 = OpImageGather %11 %61 %62 %68 ConstOffset %66
%69 = OpCompositeExtract %5 %65 0
%70 = OpCompositeExtract %5 %67 0
%72 = OpCompositeConstruct %71 %69 %70
%73 = OpBitcast %16 %72
%74 = OpCompositeExtract %5 %65 1
%75 = OpCompositeExtract %5 %67 1
%76 = OpCompositeConstruct %71 %74 %75
%77 = OpBitcast %16 %76
%78 = OpCompositeExtract %5 %65 2
%79 = OpCompositeExtract %5 %67 2
%80 = OpCompositeConstruct %71 %78 %79
%81 = OpBitcast %16 %80
%82 = OpCompositeExtract %5 %65 3
%83 = OpCompositeExtract %5 %67 3
%84 = OpCompositeConstruct %71 %82 %83
%85 = OpBitcast %16 %84
%86 = OpCompositeConstruct %17 %73 %77 %81 %85
%87 = OpCompositeExtract %16 %86 0
%88 = OpCompositeExtract %16 %86 1
%89 = OpCompositeExtract %16 %86 2
%90 = OpCompositeExtract %16 %86 3
%91 = OpUConvert %5 %45
%92 = OpUConvert %5 %46
%93 = OpCompositeConstruct %11 %47 %48 %91 %92
%95 = OpAccessChain %94 %15 %36 %36
OpStore %95 %93
%96 = OpCompositeConstruct %11 %56 %57 %58 %59
%97 = OpAccessChain %94 %15 %36 %68
OpStore %97 %96
%98 = OpCompositeConstruct %17 %87 %88 %89 %90
%100 = OpAccessChain %99 %21 %36 %68
OpStore %100 %98
OpReturn
OpFunctionEnd
#endif
