[require]
GLSL >= 1.50
GL_ARB_shader_storage_buffer_object

[vertex shader]
#extension GL_ARB_shader_storage_buffer_object: require
#extension GL_ARB_shader_bit_encoding: enable
#extension GL_ARB_gpu_shader5: enable

precision highp float;

struct S3 {
    vec4        fv3[2];
};

struct S4 {
    mat3x4      m34_1;
    S3          s1_3;
};

struct S5 {
    S4[3]       s1_4;
};


layout(std430) buffer SSBO1 {
    S5         s5_1[4];
    vec3       fv5;
    layout(row_major) mat4x3     m43_1;
} ssbo[2];

flat out int vertex_pass;
in vec4 piglit_vertex;

#if defined(GL_ARB_shader_bit_encoding) || defined(GL_ARB_gpu_shader5) || __VERSION__ >= 430
bool float_match(float u, float f, uint bits) { return floatBitsToUint(u) == bits; }
#else
bool float_match(float u, float f, uint bits) { return u == f; }
#endif

void main()
{
    /* std140 (or shared) layout prevents any fields or blocks from being
     * eliminated.  Section 2.11.6 of the OpenGL ES 3.0 spec makes this
     * explicit, but desktop GL specs only imply it.
     */
    bool pass = true;

    if (!float_match(ssbo[0].s5_1[0].s1_4[0].m34_1[0].x, -7894.19398795, 0xc5f6b18du))
        pass = false;
    if (!float_match(ssbo[1].s5_1[0].s1_4[0].m34_1[1].y, -17101.3336233, 0xc6859aabu))
        pass = false;
    if (!float_match(ssbo[1].s5_1[0].s1_4[0].m34_1[2].z, 1186.95371939, 0x44945e85u))
        pass = false;
    if (!float_match(ssbo[0].s5_1[0].s1_4[1].s1_3.fv3[1].x, -20871.93402, 0xc6a30fdeu))
        pass = false;

    vertex_pass = int(pass);
    gl_Position = piglit_vertex;
}

[fragment shader]
precision highp float;

out vec4 piglit_fragcolor;
flat in int vertex_pass;

void main()
{
    piglit_fragcolor = bool(vertex_pass) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
}

[test]
link success

verify program_interface_query GL_BUFFER_VARIABLE SSBO1.s5_1[0].s1_4[1].s1_3.fv3[0] GL_TYPE GL_FLOAT_VEC4
verify program_interface_query GL_BUFFER_VARIABLE SSBO1.s5_1[0].s1_4[1].s1_3.fv3[0] GL_TOP_LEVEL_ARRAY_SIZE 4
verify program_interface_query GL_BUFFER_VARIABLE SSBO1.s5_1[0].s1_4[1].s1_3.fv3[0] GL_OFFSET 128
verify program_interface_query GL_BUFFER_VARIABLE SSBO1.s5_1[0].s1_4[0].s1_3.fv3[0] GL_OFFSET 48
verify program_interface_query GL_BUFFER_VARIABLE SSBO1.s5_1[0].s1_4[0].m34_1 GL_TYPE GL_FLOAT_MAT3x4
verify program_interface_query GL_BUFFER_VARIABLE SSBO1.s5_1[0].s1_4[1].m34_1 GL_OFFSET 80
verify program_interface_query GL_BUFFER_VARIABLE SSBO1.s5_1[0].s1_4[1].m34_1 GL_ARRAY_STRIDE 0
verify program_interface_query GL_BUFFER_VARIABLE SSBO1.m43_1 GL_IS_ROW_MAJOR 1
verify program_interface_query GL_PROGRAM_INPUT piglit_vertex GL_TYPE GL_FLOAT_VEC4
verify program_interface_query GL_PROGRAM_OUTPUT piglit_fragcolor GL_TYPE GL_FLOAT_VEC4



