#version 460
#extension GL_EXT_shader_explicit_arithmetic_types_int16 : require
#extension GL_EXT_shader_16bit_storage : require
#if defined(GL_AMD_gpu_shader_half_float)
#extension GL_AMD_gpu_shader_half_float : require
#elif defined(GL_EXT_shader_explicit_arithmetic_types_float16)
#extension GL_EXT_shader_explicit_arithmetic_types_float16 : require
#else
#error No extension available for FP16.
#endif
#extension GL_EXT_buffer_reference2 : require
#extension GL_EXT_nonuniform_qualifier : require
#extension GL_KHR_shader_subgroup_ballot : require
layout(local_size_x = 2, local_size_y = 1, local_size_z = 1) in;

layout(set = 15, binding = 0, std430) restrict readonly buffer SSBO_Offsets
{
    uvec2 _m0[];
} _13;

layout(set = 4, binding = 0, std430) readonly buffer SSBO
{
    u16vec2 _m0[];
} _20[];

layout(set = 4, binding = 0, std430) writeonly buffer _22_25
{
    u16vec2 _m0[];
} _25[];

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

void main()
{
    uint _32 = registers._m4 + 1u;
    uvec2 _40 = _13._m0[subgroupBroadcastFirst(_32)] >> uvec2(2u);
    uvec2 _50 = _13._m0[subgroupBroadcastFirst(registers._m4)] >> uvec2(2u);
    f16vec2 _69 = uint16BitsToFloat16(_20[registers._m4]._m0[(gl_GlobalInvocationID.x < _50.y) ? (gl_GlobalInvocationID.x + _50.x) : 1073741823u]);
    _25[_32]._m0[(gl_GlobalInvocationID.x < _40.y) ? (gl_GlobalInvocationID.x + _40.x) : 1073741823u] = u16vec2(float16BitsToUint16(_69.x), float16BitsToUint16(_69.y));
}


#if 0
// SPIR-V disassembly
; SPIR-V
; Version: 1.3
; Generator: Unknown(30017); 21022
; Bound: 83
; Schema: 0
OpCapability Shader
OpCapability Float16
OpCapability Int16
OpCapability GroupNonUniformBallot
OpCapability StorageBuffer16BitAccess
OpCapability DenormPreserve
OpCapability RuntimeDescriptorArray
OpCapability PhysicalStorageBufferAddresses
OpExtension "SPV_EXT_descriptor_indexing"
OpExtension "SPV_KHR_float_controls"
OpExtension "SPV_KHR_physical_storage_buffer"
OpMemoryModel PhysicalStorageBuffer64 GLSL450
OpEntryPoint GLCompute %3 "main" %53
OpExecutionMode %3 LocalSize 2 1 1
OpExecutionMode %3 DenormPreserve 16
OpName %3 "main"
OpName %6 "RootConstants"
OpName %8 "registers"
OpName %11 "SSBO_Offsets"
OpName %17 "SSBO"
OpName %22 "SSBO"
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 %10 ArrayStride 8
OpMemberDecorate %11 0 Offset 0
OpDecorate %11 Block
OpDecorate %13 DescriptorSet 15
OpDecorate %13 Binding 0
OpDecorate %13 NonWritable
OpDecorate %13 Restrict
OpDecorate %16 ArrayStride 4
OpMemberDecorate %17 0 Offset 0
OpDecorate %17 Block
OpDecorate %20 DescriptorSet 4
OpDecorate %20 Binding 0
OpDecorate %20 NonWritable
OpDecorate %21 ArrayStride 4
OpMemberDecorate %22 0 Offset 0
OpDecorate %22 Block
OpDecorate %25 DescriptorSet 4
OpDecorate %25 Binding 0
OpDecorate %25 NonReadable
OpDecorate %53 BuiltIn GlobalInvocationId
%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 = OpTypeVector %5 2
%10 = OpTypeRuntimeArray %9
%11 = OpTypeStruct %10
%12 = OpTypePointer StorageBuffer %11
%13 = OpVariable %12 StorageBuffer
%14 = OpTypeInt 16 0
%15 = OpTypeVector %14 2
%16 = OpTypeRuntimeArray %15
%17 = OpTypeStruct %16
%18 = OpTypeRuntimeArray %17
%19 = OpTypePointer StorageBuffer %18
%20 = OpVariable %19 StorageBuffer
%21 = OpTypeRuntimeArray %15
%22 = OpTypeStruct %21
%23 = OpTypeRuntimeArray %22
%24 = OpTypePointer StorageBuffer %23
%25 = OpVariable %24 StorageBuffer
%26 = OpTypePointer StorageBuffer %22
%28 = OpTypePointer PushConstant %5
%30 = OpConstant %5 4
%33 = OpConstant %5 1
%35 = OpConstant %5 3
%36 = OpTypePointer StorageBuffer %9
%38 = OpConstant %5 0
%41 = OpConstant %5 2
%42 = OpConstantComposite %9 %41 %41
%43 = OpTypePointer StorageBuffer %17
%51 = OpTypeVector %5 3
%52 = OpTypePointer Input %51
%53 = OpVariable %52 Input
%54 = OpTypePointer Input %5
%60 = OpTypeBool
%63 = OpConstant %5 1073741823
%64 = OpTypePointer StorageBuffer %15
%67 = OpTypeFloat 16
%68 = OpTypeVector %67 2
%3 = OpFunction %1 None %2
%4 = OpLabel
OpBranch %81
%81 = OpLabel
%29 = OpAccessChain %28 %8 %30
%31 = OpLoad %5 %29
%32 = OpIAdd %5 %31 %33
%27 = OpAccessChain %26 %25 %32
%34 = OpGroupNonUniformBroadcastFirst %5 %35 %32
%37 = OpAccessChain %36 %13 %38 %34
%39 = OpLoad %9 %37
%40 = OpShiftRightLogical %9 %39 %42
%45 = OpAccessChain %28 %8 %30
%46 = OpLoad %5 %45
%44 = OpAccessChain %43 %20 %46
%47 = OpGroupNonUniformBroadcastFirst %5 %35 %46
%48 = OpAccessChain %36 %13 %38 %47
%49 = OpLoad %9 %48
%50 = OpShiftRightLogical %9 %49 %42
%55 = OpAccessChain %54 %53 %38
%56 = OpLoad %5 %55
%57 = OpCompositeExtract %5 %50 0
%58 = OpCompositeExtract %5 %50 1
%59 = OpIAdd %5 %56 %57
%61 = OpULessThan %60 %56 %58
%62 = OpSelect %5 %61 %59 %63
%65 = OpAccessChain %64 %44 %38 %62
%66 = OpLoad %15 %65
%69 = OpBitcast %68 %66
%70 = OpCompositeExtract %67 %69 0
%71 = OpCompositeExtract %67 %69 1
%72 = OpCompositeExtract %5 %40 0
%73 = OpCompositeExtract %5 %40 1
%74 = OpIAdd %5 %56 %72
%75 = OpULessThan %60 %56 %73
%76 = OpSelect %5 %75 %74 %63
%77 = OpBitcast %14 %70
%78 = OpBitcast %14 %71
%79 = OpCompositeConstruct %15 %77 %78
%80 = OpAccessChain %64 %27 %38 %76
OpStore %80 %79
OpReturn
OpFunctionEnd
#endif
