#version 460
#extension GL_EXT_buffer_reference2 : require
#extension GL_EXT_nonuniform_qualifier : require
#extension GL_EXT_buffer_reference_uvec2 : require
layout(local_size_x = 64, local_size_y = 1, local_size_z = 1) in;

layout(buffer_reference) buffer PhysicalPointerFloat4Array;

layout(buffer_reference, buffer_reference_align = 16, std430) buffer PhysicalPointerFloat4Array
{
    vec4 value[];
};

layout(push_constant, std430) uniform RootConstants
{
    uvec2 _m0;
    uvec2 _m1;
    uvec2 _m2;
    uvec2 _m3;
    uint root_constants_and_tables[16];
} registers;

layout(set = 4, binding = 0, r32ui) uniform writeonly uimageBuffer _15[];

void main()
{
    uint _22 = registers.root_constants_and_tables[4u] + 2u;
    uint _41 = 4u * ((gl_WorkGroupID.x << 1u) | 1u);
    PhysicalPointerFloat4Array(registers._m2).value[gl_GlobalInvocationID.x] = vec4(uintBitsToFloat(uvec4(registers.root_constants_and_tables[min((_41 + 0u), 15u)], registers.root_constants_and_tables[min((_41 + 1u), 15u)], registers.root_constants_and_tables[min((_41 + 2u), 15u)], registers.root_constants_and_tables[min((_41 + 3u), 15u)])));
    vec4 _89 = uintBitsToFloat(uvec4(registers.root_constants_and_tables[12u], registers.root_constants_and_tables[13u], registers.root_constants_and_tables[14u], registers.root_constants_and_tables[15u]));
    uint _94 = gl_GlobalInvocationID.x * 4u;
    imageStore(_15[_22], int(_94), uvec4(floatBitsToUint(_89.x)));
    imageStore(_15[_22], int(_94 + 1u), uvec4(floatBitsToUint(_89.y)));
    imageStore(_15[_22], int(_94 + 2u), uvec4(floatBitsToUint(_89.z)));
    imageStore(_15[_22], int(_94 + 3u), uvec4(floatBitsToUint(_89.w)));
}


#if 0
// SPIR-V disassembly
; SPIR-V
; Version: 1.3
; Generator: Unknown(30017); 21022
; Bound: 108
; Schema: 0
OpCapability Shader
OpCapability ImageBuffer
OpCapability RuntimeDescriptorArray
OpCapability PhysicalStorageBufferAddresses
OpExtension "SPV_EXT_descriptor_indexing"
OpExtension "SPV_KHR_physical_storage_buffer"
%44 = OpExtInstImport "GLSL.std.450"
OpMemoryModel PhysicalStorageBuffer64 GLSL450
OpEntryPoint GLCompute %3 "main" %30 %35
OpExecutionMode %3 LocalSize 64 1 1
OpName %3 "main"
OpName %9 "RootConstants"
OpMemberName %9 4 "root_constants_and_tables"
OpName %11 "registers"
OpName %71 "PhysicalPointerFloat4Array"
OpMemberName %71 0 "value"
OpDecorate %8 ArrayStride 4
OpDecorate %9 Block
OpMemberDecorate %9 0 Offset 0
OpMemberDecorate %9 1 Offset 8
OpMemberDecorate %9 2 Offset 16
OpMemberDecorate %9 3 Offset 24
OpMemberDecorate %9 4 Offset 32
OpDecorate %15 DescriptorSet 4
OpDecorate %15 Binding 0
OpDecorate %15 NonReadable
OpDecorate %30 BuiltIn GlobalInvocationId
OpDecorate %35 BuiltIn WorkgroupId
OpDecorate %70 ArrayStride 16
OpMemberDecorate %71 0 Offset 0
OpDecorate %71 Block
%1 = OpTypeVoid
%2 = OpTypeFunction %1
%5 = OpTypeInt 32 0
%6 = OpTypeVector %5 2
%7 = OpConstant %5 16
%8 = OpTypeArray %5 %7
%9 = OpTypeStruct %6 %6 %6 %6 %8
%10 = OpTypePointer PushConstant %9
%11 = OpVariable %10 PushConstant
%12 = OpTypeImage %5 Buffer 0 0 0 2 R32ui
%13 = OpTypeRuntimeArray %12
%14 = OpTypePointer UniformConstant %13
%15 = OpVariable %14 UniformConstant
%16 = OpTypePointer UniformConstant %12
%18 = OpTypePointer PushConstant %5
%20 = OpConstant %5 4
%23 = OpConstant %5 2
%25 = OpTypePointer PushConstant %6
%28 = OpTypeVector %5 3
%29 = OpTypePointer Input %28
%30 = OpVariable %29 Input
%31 = OpTypePointer Input %5
%33 = OpConstant %5 0
%35 = OpVariable %29 Input
%39 = OpConstant %5 1
%46 = OpConstant %5 15
%58 = OpConstant %5 3
%61 = OpTypeVector %5 4
%63 = OpTypeFloat 32
%64 = OpTypeVector %63 4
%70 = OpTypeRuntimeArray %64
%71 = OpTypeStruct %70
%72 = OpTypePointer PhysicalStorageBuffer %71
%74 = OpTypePointer PhysicalStorageBuffer %64
%78 = OpConstant %5 12
%81 = OpConstant %5 13
%84 = OpConstant %5 14
%3 = OpFunction %1 None %2
%4 = OpLabel
OpBranch %106
%106 = OpLabel
%19 = OpAccessChain %18 %11 %20 %20
%21 = OpLoad %5 %19
%22 = OpIAdd %5 %21 %23
%17 = OpAccessChain %16 %15 %22
%24 = OpLoad %12 %17
%26 = OpAccessChain %25 %11 %23
%27 = OpLoad %6 %26
%32 = OpAccessChain %31 %30 %33
%34 = OpLoad %5 %32
%36 = OpAccessChain %31 %35 %33
%37 = OpLoad %5 %36
%38 = OpShiftLeftLogical %5 %37 %39
%40 = OpBitwiseOr %5 %38 %39
%41 = OpIMul %5 %20 %40
%43 = OpIAdd %5 %41 %33
%45 = OpExtInst %5 %44 UMin %43 %46
%42 = OpAccessChain %18 %11 %20 %45
%47 = OpLoad %5 %42
%49 = OpIAdd %5 %41 %39
%50 = OpExtInst %5 %44 UMin %49 %46
%48 = OpAccessChain %18 %11 %20 %50
%51 = OpLoad %5 %48
%53 = OpIAdd %5 %41 %23
%54 = OpExtInst %5 %44 UMin %53 %46
%52 = OpAccessChain %18 %11 %20 %54
%55 = OpLoad %5 %52
%57 = OpIAdd %5 %41 %58
%59 = OpExtInst %5 %44 UMin %57 %46
%56 = OpAccessChain %18 %11 %20 %59
%60 = OpLoad %5 %56
%62 = OpCompositeConstruct %61 %47 %51 %55 %60
%65 = OpBitcast %64 %62
%66 = OpCompositeExtract %63 %65 0
%67 = OpCompositeExtract %63 %65 1
%68 = OpCompositeExtract %63 %65 2
%69 = OpCompositeExtract %63 %65 3
%73 = OpBitcast %72 %27
%75 = OpInBoundsAccessChain %74 %73 %33 %34
%76 = OpCompositeConstruct %64 %66 %67 %68 %69
OpStore %75 %76 Aligned 16
%77 = OpAccessChain %18 %11 %20 %78
%79 = OpLoad %5 %77
%80 = OpAccessChain %18 %11 %20 %81
%82 = OpLoad %5 %80
%83 = OpAccessChain %18 %11 %20 %84
%85 = OpLoad %5 %83
%86 = OpAccessChain %18 %11 %20 %46
%87 = OpLoad %5 %86
%88 = OpCompositeConstruct %61 %79 %82 %85 %87
%89 = OpBitcast %64 %88
%90 = OpCompositeExtract %63 %89 0
%91 = OpCompositeExtract %63 %89 1
%92 = OpCompositeExtract %63 %89 2
%93 = OpCompositeExtract %63 %89 3
%94 = OpIMul %5 %34 %20
%95 = OpBitcast %5 %90
%96 = OpBitcast %5 %91
%97 = OpBitcast %5 %92
%98 = OpBitcast %5 %93
%99 = OpCompositeConstruct %61 %95 %95 %95 %95
OpImageWrite %24 %94 %99
%100 = OpCompositeConstruct %61 %96 %96 %96 %96
%101 = OpIAdd %5 %94 %39
OpImageWrite %24 %101 %100
%102 = OpCompositeConstruct %61 %97 %97 %97 %97
%103 = OpIAdd %5 %94 %23
OpImageWrite %24 %103 %102
%104 = OpCompositeConstruct %61 %98 %98 %98 %98
%105 = OpIAdd %5 %94 %58
OpImageWrite %24 %105 %104
OpReturn
OpFunctionEnd
#endif
