KhronosGroup / KhronosGroup/SPIRV-Cross

MSL: Input variable that is array of structs hits index out of bounds error

Open
#1,832 3 comments 0 reactions 1 assignee Claimed by @billhollings View on GitHub
CTS
Dominant language
GLSL
Stars
2.5k
Forks
713
Avg merge
2d 18h
Merged PRs (30d)
16

Description

SPIR-V conversion to MSL fails with `Member index is out of bounds` error.

The SPIR-V defines an Input variable that contains an array of structs. This is not supported by MSL, so SPIRV-Cross attempts to build an output struct that flattens the array of structs. In referencing this array, a crash occurs while converting to MSL.

The (partial) MSL is:

```
struct _35
{
float2 _m0;
float4 _m1;
};

struct _36
{
float2 _m0;
_35 _m1;
};

struct main0_out
{
float m_80 [[user(locn0)]];
float4 gl_Position [[position]];
};

struct main0_in
{
float2 m_36_m0 [[attribute(0)]];
_35 m_36_m1 [[attribute(1)]];
};

struct main0_patchIn
{
patch_control_point gl_in;
};

[[ patch(triangle, 1) ]] vertex main0_out main0(main0_patchIn patchIn [[stage_in]], float3 gl_TessCoord [[position_in_patch]])
{
main0_out out = {};
out.gl_Position = float4((gl_TessCoord.xy * 2.0) - float2(1.0), 0.0, 1.0);
```

The equivalent GLSL is:

```
layout(location = 0) in _36
{
vec2 _m0;
_35 _m1;
} _40[32];

layout(location = 0) out float _80;

void main()
{
gl_Position = vec4((gl_TessCoord.xy * 2.0) - vec2(1.0), 0.0, 1.0);
float _34 = ((float(abs(_40[0]._m1._m1.x - (-4.0)) < 0.001000000047497451305389404296875) * float(abs(_40[0]._m1._m1.y - (-9.0)) < 0.001000000047497451305389404296875)) * float(abs(_40[0]._m1._m1.z - 3.0) < 0.001000000047497451305389404296875)) * float(abs(_40[0]._m1._m1.w - 7.0) < 0.001000000047497451305389404296875);
_80 = _34;
}
```

These CTS test fail as a result:

```
dEQP-VK.pipeline.interface_matching.vector_length.out_vec4_in_vec4_member_of_structure_in_block_vert_tesc_out_tese_in_frag
dEQP-VK.pipeline.interface_matching.vector_length.out_vec3_in_vec3_member_of_structure_in_block_vert_tesc_out_tese_in_frag
dEQP-VK.pipeline.interface_matching.vector_length.out_vec2_in_vec2_member_of_structure_in_block_vert_tesc_out_tese_in_frag
dEQP-VK.pipeline.interface_matching.vector_length.out_ivec4_in_ivec4_member_of_structure_in_block_vert_tesc_out_tese_in_frag
dEQP-VK.pipeline.interface_matching.vector_length.out_ivec3_in_ivec3_member_of_structure_in_block_vert_tesc_out_tese_in_frag
dEQP-VK.pipeline.interface_matching.vector_length.out_ivec2_in_ivec2_member_of_structure_in_block_vert_tesc_out_tese_in_frag
dEQP-VK.pipeline.interface_matching.vector_length.out_uvec4_in_uvec4_member_of_structure_in_block_vert_tesc_out_tese_in_frag
dEQP-VK.pipeline.interface_matching.vector_length.out_uvec3_in_uvec3_member_of_structure_in_block_vert_tesc_out_tese_in_frag
dEQP-VK.pipeline.interface_matching.vector_length.out_uvec2_in_uvec2_member_of_structure_in_block_vert_tesc_out_tese_in_frag
dEQP-VK.pipeline.interface_matching.vector_length.out_vec4_in_vec4_member_of_array_of_structures_in_block_vert_tesc_out_tese_in_frag
dEQP-VK.pipeline.interface_matching.vector_length.out_vec3_in_vec3_member_of_array_of_structures_in_block_vert_tesc_out_tese_in_frag
dEQP-VK.pipeline.interface_matching.vector_length.out_ivec4_in_ivec4_member_of_array_of_structures_in_block_vert_tesc_out_tese_in_frag
dEQP-VK.pipeline.interface_matching.vector_length.out_ivec3_in_ivec3_member_of_array_of_structures_in_block_vert_tesc_out_tese_in_frag
dEQP-VK.pipeline.interface_matching.vector_length.out_uvec4_in_uvec4_member_of_array_of_structures_in_block_vert_tesc_out_tese_in_frag
dEQP-VK.pipeline.interface_matching.vector_length.out_uvec3_in_uvec3_member_of_array_of_structures_in_block_vert_tesc_out_tese_in_frag
dEQP-VK.pipeline.interface_matching.decoration_mismatch.out_none_in_noperspective_member_of_structure_in_block_vert_tesc_out_tese_in_frag
dEQP-VK.pipeline.interface_matching.decoration_mismatch.out_none_in_flat_member_of_structure_in_block_vert_tesc_out_tese_in_frag
dEQP-VK.pipeline.interface_matching.decoration_mismatch.out_flat_in_noperspective_member_of_structure_in_block_vert_tesc_out_tese_in_frag
dEQP-VK.pipeline.interface_matching.decoration_mismatch.out_flat_in_none_member_of_structure_in_block_vert_tesc_out_tese_in_frag
dEQP-VK.pipeline.interface_matching.decoration_mismatch.out_noperspective_in_flat_member_of_structure_in_block_vert_tesc_out_tese_in_frag
dEQP-VK.pipeline.interface_matching.decoration_mismatch.out_noperspective_in_none_member_of_structure_in_block_vert_tesc_out_tese_in_frag
dEQP-VK.pipeline.interface_matching.decoration_mismatch.out_none_in_noperspective_member_of_array_of_structures_in_block_vert_tesc_out_tese_in_frag
dEQP-VK.pipeline.interface_matching.decoration_mismatch.out_none_in_flat_member_of_array_of_structures_in_block_vert_tesc_out_tese_in_frag
dEQP-VK.pipeline.interface_matching.decoration_mismatch.out_flat_in_noperspective_member_of_array_of_structures_in_block_vert_tesc_out_tese_in_frag
dEQP-VK.pipeline.interface_matching.decoration_mismatch.out_none_in_flat_member_of_array_of_structures_in_block_vert_tesc_out_tese_in_frag
dEQP-VK.pipeline.interface_matching.decoration_mismatch.out_flat_in_noperspective_member_of_array_of_structures_in_block_vert_tesc_out_tese_in_frag
dEQP-VK.pipeline.interface_matching.decoration_mismatch.out_flat_in_none_member_of_array_of_structures_in_block_vert_tesc_out_tese_in_frag
dEQP-VK.pipeline.interface_matching.decoration_mismatch.out_noperspective_in_flat_member_of_array_of_structures_in_block_vert_tesc_out_tese_in_frag
dEQP-VK.pipeline.interface_matching.decoration_mismatch.out_noperspective_in_none_member_of_array_of_structures_in_block_vert_tesc_out_tese_in_frag
```

SPIR-V file:
[member_array_index_out_of_bounds.spv.zip](https://github.com/KhronosGroup/SPIRV-Cross/files/7789942/member_array_index_out_of_bounds.spv.zip)

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.