From c1edd35d579e708336cf8f8e2c981960ce6dd6e8 Mon Sep 17 00:00:00 2001 From: Hans-Kristian Arntzen Date: Fri, 16 Apr 2021 11:45:50 +0200 Subject: [PATCH] MSL: Use spvUnsafeArray for builtin arrays after all. It will get too messy to deal with constant initializers any other way, so just deal with complexity in argument_decl instead ... --- .../frag/clip-distance-varying.frag | 43 +++++++++++++++- .../frag/cull-distance-varying.frag | 43 +++++++++++++++- .../write-outputs.mask-clip-distance.vert | 43 +++++++++++++++- ...rite-outputs.mask-location-0.for-tess.vert | 43 +++++++++++++++- ...rite-outputs.mask-location-1.for-tess.vert | 43 +++++++++++++++- ...rite-outputs.mask-point-size.for-tess.vert | 43 +++++++++++++++- ...e-outputs.mask-point-size.multi-patch.tesc | 4 +- .../write-outputs.mask-point-size.tesc | 4 +- ...ite-outputs.mask-position.multi-patch.tesc | 4 +- .../masking/write-outputs.mask-position.tesc | 4 +- .../tese/read-tess-level-in-func.msl2.tese | 43 +++++++++++++++- .../shaders-msl/tese/triangle-tess-level.tese | 45 ++++++++++++++++- ...lizers-block.mask-point-size.msl2.asm.tesc | 12 ++--- ....mask-point-size.multi-patch.msl2.asm.tesc | 12 ++--- ...ializers-block.mask-position.msl2.asm.tesc | 12 ++--- ...ck.mask-position.multi-patch.msl2.asm.tesc | 12 ++--- ...initializers.mask-location-0.msl2.asm.tesc | 12 ++--- ....mask-location-0.msl2.multi-patch.asm.tesc | 12 ++--- .../initializers.mask-location-1.asm.tesc | 12 ++--- ...izers.mask-location-1.multi-patch.asm.tesc | 12 ++--- ...initializers.mask-point-size.msl2.asm.tesc | 12 ++--- ....mask-point-size.msl2.multi-patch.asm.tesc | 12 ++--- .../initializers.mask-position.msl2.asm.tesc | 12 ++--- ...rs.mask-position.msl2.multi-patch.asm.tesc | 12 ++--- .../passthrough-clip-cull.multi-patch.tesc | 49 +++++++++++++++++-- .../vert/cull-distance.for-tess.vert | 43 +++++++++++++++- .../frag/clip-distance-varying.frag | 43 +++++++++++++++- .../frag/cull-distance-varying.frag | 43 +++++++++++++++- .../write-outputs.mask-clip-distance.vert | 41 +++++++++++++++- ...rite-outputs.mask-location-0.for-tess.vert | 41 +++++++++++++++- ...rite-outputs.mask-location-1.for-tess.vert | 41 +++++++++++++++- ...rite-outputs.mask-point-size.for-tess.vert | 41 +++++++++++++++- ...e-outputs.mask-point-size.multi-patch.tesc | 4 +- .../write-outputs.mask-point-size.tesc | 4 +- ...ite-outputs.mask-position.multi-patch.tesc | 4 +- .../masking/write-outputs.mask-position.tesc | 4 +- .../tese/read-tess-level-in-func.msl2.tese | 41 +++++++++++++++- .../shaders-msl/tese/triangle-tess-level.tese | 45 ++++++++++++++++- spirv_msl.cpp | 45 ++++------------- 39 files changed, 848 insertions(+), 147 deletions(-) diff --git a/reference/opt/shaders-msl/frag/clip-distance-varying.frag b/reference/opt/shaders-msl/frag/clip-distance-varying.frag index 6c3f1739..9a72d5ba 100644 --- a/reference/opt/shaders-msl/frag/clip-distance-varying.frag +++ b/reference/opt/shaders-msl/frag/clip-distance-varying.frag @@ -1,8 +1,49 @@ +#pragma clang diagnostic ignored "-Wmissing-prototypes" +#pragma clang diagnostic ignored "-Wmissing-braces" + #include #include using namespace metal; +template +struct spvUnsafeArray +{ + T elements[Num ? Num : 1]; + + thread T& operator [] (size_t pos) thread + { + return elements[pos]; + } + constexpr const thread T& operator [] (size_t pos) const thread + { + return elements[pos]; + } + + device T& operator [] (size_t pos) device + { + return elements[pos]; + } + constexpr const device T& operator [] (size_t pos) const device + { + return elements[pos]; + } + + constexpr const constant T& operator [] (size_t pos) const constant + { + return elements[pos]; + } + + threadgroup T& operator [] (size_t pos) threadgroup + { + return elements[pos]; + } + constexpr const threadgroup T& operator [] (size_t pos) const threadgroup + { + return elements[pos]; + } +}; + struct main0_out { float4 FragColor [[color(0)]]; @@ -17,7 +58,7 @@ struct main0_in fragment main0_out main0(main0_in in [[stage_in]]) { main0_out out = {}; - float gl_ClipDistance[2] = {}; + spvUnsafeArray gl_ClipDistance = {}; gl_ClipDistance[0] = in.gl_ClipDistance_0; gl_ClipDistance[1] = in.gl_ClipDistance_1; out.FragColor = float4((1.0 - gl_ClipDistance[0]) - gl_ClipDistance[1]); diff --git a/reference/opt/shaders-msl/frag/cull-distance-varying.frag b/reference/opt/shaders-msl/frag/cull-distance-varying.frag index ddde8e1d..708a2957 100644 --- a/reference/opt/shaders-msl/frag/cull-distance-varying.frag +++ b/reference/opt/shaders-msl/frag/cull-distance-varying.frag @@ -1,8 +1,49 @@ +#pragma clang diagnostic ignored "-Wmissing-prototypes" +#pragma clang diagnostic ignored "-Wmissing-braces" + #include #include using namespace metal; +template +struct spvUnsafeArray +{ + T elements[Num ? Num : 1]; + + thread T& operator [] (size_t pos) thread + { + return elements[pos]; + } + constexpr const thread T& operator [] (size_t pos) const thread + { + return elements[pos]; + } + + device T& operator [] (size_t pos) device + { + return elements[pos]; + } + constexpr const device T& operator [] (size_t pos) const device + { + return elements[pos]; + } + + constexpr const constant T& operator [] (size_t pos) const constant + { + return elements[pos]; + } + + threadgroup T& operator [] (size_t pos) threadgroup + { + return elements[pos]; + } + constexpr const threadgroup T& operator [] (size_t pos) const threadgroup + { + return elements[pos]; + } +}; + struct main0_out { float4 FragColor [[color(0)]]; @@ -17,7 +58,7 @@ struct main0_in fragment main0_out main0(main0_in in [[stage_in]]) { main0_out out = {}; - float gl_CullDistance[2] = {}; + spvUnsafeArray gl_CullDistance = {}; gl_CullDistance[0] = in.gl_CullDistance_0; gl_CullDistance[1] = in.gl_CullDistance_1; out.FragColor = float4((1.0 - gl_CullDistance[0]) - gl_CullDistance[1]); diff --git a/reference/opt/shaders-msl/masking/write-outputs.mask-clip-distance.vert b/reference/opt/shaders-msl/masking/write-outputs.mask-clip-distance.vert index 39fd02c0..1f56f34a 100644 --- a/reference/opt/shaders-msl/masking/write-outputs.mask-clip-distance.vert +++ b/reference/opt/shaders-msl/masking/write-outputs.mask-clip-distance.vert @@ -1,8 +1,49 @@ +#pragma clang diagnostic ignored "-Wmissing-prototypes" +#pragma clang diagnostic ignored "-Wmissing-braces" + #include #include using namespace metal; +template +struct spvUnsafeArray +{ + T elements[Num ? Num : 1]; + + thread T& operator [] (size_t pos) thread + { + return elements[pos]; + } + constexpr const thread T& operator [] (size_t pos) const thread + { + return elements[pos]; + } + + device T& operator [] (size_t pos) device + { + return elements[pos]; + } + constexpr const device T& operator [] (size_t pos) const device + { + return elements[pos]; + } + + constexpr const constant T& operator [] (size_t pos) const constant + { + return elements[pos]; + } + + threadgroup T& operator [] (size_t pos) threadgroup + { + return elements[pos]; + } + constexpr const threadgroup T& operator [] (size_t pos) const threadgroup + { + return elements[pos]; + } +}; + struct main0_out { float4 v0 [[user(locn0)]]; @@ -14,7 +55,7 @@ struct main0_out vertex main0_out main0() { main0_out out = {}; - float gl_ClipDistance[2] = {}; + spvUnsafeArray gl_ClipDistance = {}; out.v0 = float4(1.0); out.v1 = float4(2.0); out.gl_Position = float4(3.0); diff --git a/reference/opt/shaders-msl/masking/write-outputs.mask-location-0.for-tess.vert b/reference/opt/shaders-msl/masking/write-outputs.mask-location-0.for-tess.vert index 497cf2d5..1c0aab50 100644 --- a/reference/opt/shaders-msl/masking/write-outputs.mask-location-0.for-tess.vert +++ b/reference/opt/shaders-msl/masking/write-outputs.mask-location-0.for-tess.vert @@ -1,14 +1,55 @@ +#pragma clang diagnostic ignored "-Wmissing-prototypes" +#pragma clang diagnostic ignored "-Wmissing-braces" + #include #include using namespace metal; +template +struct spvUnsafeArray +{ + T elements[Num ? Num : 1]; + + thread T& operator [] (size_t pos) thread + { + return elements[pos]; + } + constexpr const thread T& operator [] (size_t pos) const thread + { + return elements[pos]; + } + + device T& operator [] (size_t pos) device + { + return elements[pos]; + } + constexpr const device T& operator [] (size_t pos) const device + { + return elements[pos]; + } + + constexpr const constant T& operator [] (size_t pos) const constant + { + return elements[pos]; + } + + threadgroup T& operator [] (size_t pos) threadgroup + { + return elements[pos]; + } + constexpr const threadgroup T& operator [] (size_t pos) const threadgroup + { + return elements[pos]; + } +}; + struct main0_out { float4 v1; float4 gl_Position; float gl_PointSize; - float gl_ClipDistance[2]; + spvUnsafeArray gl_ClipDistance; }; kernel void main0(uint3 gl_GlobalInvocationID [[thread_position_in_grid]], uint3 spvStageInputSize [[grid_size]], device main0_out* spvOut [[buffer(28)]]) diff --git a/reference/opt/shaders-msl/masking/write-outputs.mask-location-1.for-tess.vert b/reference/opt/shaders-msl/masking/write-outputs.mask-location-1.for-tess.vert index aaa41d42..d558b7ae 100644 --- a/reference/opt/shaders-msl/masking/write-outputs.mask-location-1.for-tess.vert +++ b/reference/opt/shaders-msl/masking/write-outputs.mask-location-1.for-tess.vert @@ -1,14 +1,55 @@ +#pragma clang diagnostic ignored "-Wmissing-prototypes" +#pragma clang diagnostic ignored "-Wmissing-braces" + #include #include using namespace metal; +template +struct spvUnsafeArray +{ + T elements[Num ? Num : 1]; + + thread T& operator [] (size_t pos) thread + { + return elements[pos]; + } + constexpr const thread T& operator [] (size_t pos) const thread + { + return elements[pos]; + } + + device T& operator [] (size_t pos) device + { + return elements[pos]; + } + constexpr const device T& operator [] (size_t pos) const device + { + return elements[pos]; + } + + constexpr const constant T& operator [] (size_t pos) const constant + { + return elements[pos]; + } + + threadgroup T& operator [] (size_t pos) threadgroup + { + return elements[pos]; + } + constexpr const threadgroup T& operator [] (size_t pos) const threadgroup + { + return elements[pos]; + } +}; + struct main0_out { float4 v0; float4 gl_Position; float gl_PointSize; - float gl_ClipDistance[2]; + spvUnsafeArray gl_ClipDistance; }; kernel void main0(uint3 gl_GlobalInvocationID [[thread_position_in_grid]], uint3 spvStageInputSize [[grid_size]], device main0_out* spvOut [[buffer(28)]]) diff --git a/reference/opt/shaders-msl/masking/write-outputs.mask-point-size.for-tess.vert b/reference/opt/shaders-msl/masking/write-outputs.mask-point-size.for-tess.vert index 3142d14c..463ecc87 100644 --- a/reference/opt/shaders-msl/masking/write-outputs.mask-point-size.for-tess.vert +++ b/reference/opt/shaders-msl/masking/write-outputs.mask-point-size.for-tess.vert @@ -1,14 +1,55 @@ +#pragma clang diagnostic ignored "-Wmissing-prototypes" +#pragma clang diagnostic ignored "-Wmissing-braces" + #include #include using namespace metal; +template +struct spvUnsafeArray +{ + T elements[Num ? Num : 1]; + + thread T& operator [] (size_t pos) thread + { + return elements[pos]; + } + constexpr const thread T& operator [] (size_t pos) const thread + { + return elements[pos]; + } + + device T& operator [] (size_t pos) device + { + return elements[pos]; + } + constexpr const device T& operator [] (size_t pos) const device + { + return elements[pos]; + } + + constexpr const constant T& operator [] (size_t pos) const constant + { + return elements[pos]; + } + + threadgroup T& operator [] (size_t pos) threadgroup + { + return elements[pos]; + } + constexpr const threadgroup T& operator [] (size_t pos) const threadgroup + { + return elements[pos]; + } +}; + struct main0_out { float4 v0; float4 v1; float4 gl_Position; - float gl_ClipDistance[2]; + spvUnsafeArray gl_ClipDistance; }; kernel void main0(uint3 gl_GlobalInvocationID [[thread_position_in_grid]], uint3 spvStageInputSize [[grid_size]], device main0_out* spvOut [[buffer(28)]]) diff --git a/reference/opt/shaders-msl/masking/write-outputs.mask-point-size.multi-patch.tesc b/reference/opt/shaders-msl/masking/write-outputs.mask-point-size.multi-patch.tesc index 21360341..3b336780 100644 --- a/reference/opt/shaders-msl/masking/write-outputs.mask-point-size.multi-patch.tesc +++ b/reference/opt/shaders-msl/masking/write-outputs.mask-point-size.multi-patch.tesc @@ -48,8 +48,8 @@ struct gl_PerVertex { float4 gl_Position; float gl_PointSize; - float gl_ClipDistance[1]; - float gl_CullDistance[1]; + spvUnsafeArray gl_ClipDistance; + spvUnsafeArray gl_CullDistance; }; struct main0_out diff --git a/reference/opt/shaders-msl/masking/write-outputs.mask-point-size.tesc b/reference/opt/shaders-msl/masking/write-outputs.mask-point-size.tesc index bc61d6ff..da976c9a 100644 --- a/reference/opt/shaders-msl/masking/write-outputs.mask-point-size.tesc +++ b/reference/opt/shaders-msl/masking/write-outputs.mask-point-size.tesc @@ -48,8 +48,8 @@ struct gl_PerVertex { float4 gl_Position; float gl_PointSize; - float gl_ClipDistance[1]; - float gl_CullDistance[1]; + spvUnsafeArray gl_ClipDistance; + spvUnsafeArray gl_CullDistance; }; struct main0_out diff --git a/reference/opt/shaders-msl/masking/write-outputs.mask-position.multi-patch.tesc b/reference/opt/shaders-msl/masking/write-outputs.mask-position.multi-patch.tesc index 3aea5798..7ef25b9f 100644 --- a/reference/opt/shaders-msl/masking/write-outputs.mask-position.multi-patch.tesc +++ b/reference/opt/shaders-msl/masking/write-outputs.mask-position.multi-patch.tesc @@ -48,8 +48,8 @@ struct gl_PerVertex { float4 gl_Position; float gl_PointSize; - float gl_ClipDistance[1]; - float gl_CullDistance[1]; + spvUnsafeArray gl_ClipDistance; + spvUnsafeArray gl_CullDistance; }; struct main0_out diff --git a/reference/opt/shaders-msl/masking/write-outputs.mask-position.tesc b/reference/opt/shaders-msl/masking/write-outputs.mask-position.tesc index fe814f4f..04584de4 100644 --- a/reference/opt/shaders-msl/masking/write-outputs.mask-position.tesc +++ b/reference/opt/shaders-msl/masking/write-outputs.mask-position.tesc @@ -48,8 +48,8 @@ struct gl_PerVertex { float4 gl_Position; float gl_PointSize; - float gl_ClipDistance[1]; - float gl_CullDistance[1]; + spvUnsafeArray gl_ClipDistance; + spvUnsafeArray gl_CullDistance; }; struct main0_out diff --git a/reference/opt/shaders-msl/tese/read-tess-level-in-func.msl2.tese b/reference/opt/shaders-msl/tese/read-tess-level-in-func.msl2.tese index b5b7c15f..43da4ae8 100644 --- a/reference/opt/shaders-msl/tese/read-tess-level-in-func.msl2.tese +++ b/reference/opt/shaders-msl/tese/read-tess-level-in-func.msl2.tese @@ -1,8 +1,49 @@ +#pragma clang diagnostic ignored "-Wmissing-prototypes" +#pragma clang diagnostic ignored "-Wmissing-braces" + #include #include using namespace metal; +template +struct spvUnsafeArray +{ + T elements[Num ? Num : 1]; + + thread T& operator [] (size_t pos) thread + { + return elements[pos]; + } + constexpr const thread T& operator [] (size_t pos) const thread + { + return elements[pos]; + } + + device T& operator [] (size_t pos) device + { + return elements[pos]; + } + constexpr const device T& operator [] (size_t pos) const device + { + return elements[pos]; + } + + constexpr const constant T& operator [] (size_t pos) const constant + { + return elements[pos]; + } + + threadgroup T& operator [] (size_t pos) threadgroup + { + return elements[pos]; + } + constexpr const threadgroup T& operator [] (size_t pos) const threadgroup + { + return elements[pos]; + } +}; + struct main0_out { float4 gl_Position [[position]]; @@ -16,7 +57,7 @@ struct main0_patchIn [[ patch(triangle, 0) ]] vertex main0_out main0(main0_patchIn patchIn [[stage_in]]) { main0_out out = {}; - float gl_TessLevelOuter[4] = {}; + spvUnsafeArray gl_TessLevelOuter = {}; gl_TessLevelOuter[0] = patchIn.gl_TessLevel.x; gl_TessLevelOuter[1] = patchIn.gl_TessLevel.y; gl_TessLevelOuter[2] = patchIn.gl_TessLevel.z; diff --git a/reference/opt/shaders-msl/tese/triangle-tess-level.tese b/reference/opt/shaders-msl/tese/triangle-tess-level.tese index 975e6298..6930e147 100644 --- a/reference/opt/shaders-msl/tese/triangle-tess-level.tese +++ b/reference/opt/shaders-msl/tese/triangle-tess-level.tese @@ -1,8 +1,49 @@ +#pragma clang diagnostic ignored "-Wmissing-prototypes" +#pragma clang diagnostic ignored "-Wmissing-braces" + #include #include using namespace metal; +template +struct spvUnsafeArray +{ + T elements[Num ? Num : 1]; + + thread T& operator [] (size_t pos) thread + { + return elements[pos]; + } + constexpr const thread T& operator [] (size_t pos) const thread + { + return elements[pos]; + } + + device T& operator [] (size_t pos) device + { + return elements[pos]; + } + constexpr const device T& operator [] (size_t pos) const device + { + return elements[pos]; + } + + constexpr const constant T& operator [] (size_t pos) const constant + { + return elements[pos]; + } + + threadgroup T& operator [] (size_t pos) threadgroup + { + return elements[pos]; + } + constexpr const threadgroup T& operator [] (size_t pos) const threadgroup + { + return elements[pos]; + } +}; + struct main0_out { float4 gl_Position [[position]]; @@ -16,8 +57,8 @@ struct main0_patchIn [[ patch(triangle, 0) ]] vertex main0_out main0(main0_patchIn patchIn [[stage_in]], float3 gl_TessCoord [[position_in_patch]]) { main0_out out = {}; - float gl_TessLevelInner[2] = {}; - float gl_TessLevelOuter[4] = {}; + spvUnsafeArray gl_TessLevelInner = {}; + spvUnsafeArray gl_TessLevelOuter = {}; gl_TessLevelInner[0] = patchIn.gl_TessLevel.w; gl_TessLevelOuter[0] = patchIn.gl_TessLevel.x; gl_TessLevelOuter[1] = patchIn.gl_TessLevel.y; diff --git a/reference/shaders-msl-no-opt/asm/masking/initializers-block.mask-point-size.msl2.asm.tesc b/reference/shaders-msl-no-opt/asm/masking/initializers-block.mask-point-size.msl2.asm.tesc index 9dfd7d4e..fc872a1a 100644 --- a/reference/shaders-msl-no-opt/asm/masking/initializers-block.mask-point-size.msl2.asm.tesc +++ b/reference/shaders-msl-no-opt/asm/masking/initializers-block.mask-point-size.msl2.asm.tesc @@ -58,8 +58,8 @@ struct gl_PerVertex { float4 gl_Position; float gl_PointSize; - float gl_ClipDistance[1]; - float gl_CullDistance[1]; + spvUnsafeArray gl_ClipDistance; + spvUnsafeArray gl_CullDistance; }; constant spvUnsafeArray _51 = spvUnsafeArray({ 0.0 }); @@ -69,8 +69,8 @@ struct main0_out { float4 C_v; float4 gl_Position; - float gl_ClipDistance[1]; - float gl_CullDistance[1]; + spvUnsafeArray gl_ClipDistance; + spvUnsafeArray gl_CullDistance; }; struct main0_patchOut @@ -87,8 +87,8 @@ kernel void main0(uint gl_InvocationID [[thread_index_in_threadgroup]], uint gl_ device main0_out* gl_out = &spvOut[gl_PrimitiveID * 4]; gl_out[gl_InvocationID].C_v = _18[gl_InvocationID].v; gl_out[gl_InvocationID].gl_Position = _33[gl_InvocationID].gl_Position; - gl_out[gl_InvocationID].gl_ClipDistance[0] = _33[gl_InvocationID].gl_ClipDistance[0]; - gl_out[gl_InvocationID].gl_CullDistance[0] = _33[gl_InvocationID].gl_CullDistance[0]; + gl_out[gl_InvocationID].gl_ClipDistance = _33[gl_InvocationID].gl_ClipDistance; + gl_out[gl_InvocationID].gl_CullDistance = _33[gl_InvocationID].gl_CullDistance; gl_out_masked[gl_InvocationID] = _33[gl_InvocationID]; device main0_patchOut& patchOut = spvPatchOut[gl_PrimitiveID]; patchOut.P_v = float4(0.0); diff --git a/reference/shaders-msl-no-opt/asm/masking/initializers-block.mask-point-size.multi-patch.msl2.asm.tesc b/reference/shaders-msl-no-opt/asm/masking/initializers-block.mask-point-size.multi-patch.msl2.asm.tesc index aec4d3c8..daf07834 100644 --- a/reference/shaders-msl-no-opt/asm/masking/initializers-block.mask-point-size.multi-patch.msl2.asm.tesc +++ b/reference/shaders-msl-no-opt/asm/masking/initializers-block.mask-point-size.multi-patch.msl2.asm.tesc @@ -58,8 +58,8 @@ struct gl_PerVertex { float4 gl_Position; float gl_PointSize; - float gl_ClipDistance[1]; - float gl_CullDistance[1]; + spvUnsafeArray gl_ClipDistance; + spvUnsafeArray gl_CullDistance; }; constant spvUnsafeArray _51 = spvUnsafeArray({ 0.0 }); @@ -69,8 +69,8 @@ struct main0_out { float4 C_v; float4 gl_Position; - float gl_ClipDistance[1]; - float gl_CullDistance[1]; + spvUnsafeArray gl_ClipDistance; + spvUnsafeArray gl_CullDistance; }; struct main0_patchOut @@ -86,8 +86,8 @@ kernel void main0(uint3 gl_GlobalInvocationID [[thread_position_in_grid]], devic device main0_out* gl_out = &spvOut[gl_GlobalInvocationID.x - gl_GlobalInvocationID.x % 4]; gl_out[gl_GlobalInvocationID.x % 4].C_v = _18[gl_GlobalInvocationID.x % 4].v; gl_out[gl_GlobalInvocationID.x % 4].gl_Position = _33[gl_GlobalInvocationID.x % 4].gl_Position; - gl_out[gl_GlobalInvocationID.x % 4].gl_ClipDistance[0] = _33[gl_GlobalInvocationID.x % 4].gl_ClipDistance[0]; - gl_out[gl_GlobalInvocationID.x % 4].gl_CullDistance[0] = _33[gl_GlobalInvocationID.x % 4].gl_CullDistance[0]; + gl_out[gl_GlobalInvocationID.x % 4].gl_ClipDistance = _33[gl_GlobalInvocationID.x % 4].gl_ClipDistance; + gl_out[gl_GlobalInvocationID.x % 4].gl_CullDistance = _33[gl_GlobalInvocationID.x % 4].gl_CullDistance; threadgroup gl_PerVertex spvStoragegl_out_masked[8][4]; threadgroup gl_PerVertex (&gl_out_masked)[4] = spvStoragegl_out_masked[(gl_GlobalInvocationID.x / 4) % 8]; gl_out_masked[gl_GlobalInvocationID.x % 4] = _33[gl_GlobalInvocationID.x % 4]; diff --git a/reference/shaders-msl-no-opt/asm/masking/initializers-block.mask-position.msl2.asm.tesc b/reference/shaders-msl-no-opt/asm/masking/initializers-block.mask-position.msl2.asm.tesc index cdd14d91..62b528b9 100644 --- a/reference/shaders-msl-no-opt/asm/masking/initializers-block.mask-position.msl2.asm.tesc +++ b/reference/shaders-msl-no-opt/asm/masking/initializers-block.mask-position.msl2.asm.tesc @@ -58,8 +58,8 @@ struct gl_PerVertex { float4 gl_Position; float gl_PointSize; - float gl_ClipDistance[1]; - float gl_CullDistance[1]; + spvUnsafeArray gl_ClipDistance; + spvUnsafeArray gl_CullDistance; }; constant spvUnsafeArray _51 = spvUnsafeArray({ 0.0 }); @@ -69,8 +69,8 @@ struct main0_out { float4 C_v; float gl_PointSize; - float gl_ClipDistance[1]; - float gl_CullDistance[1]; + spvUnsafeArray gl_ClipDistance; + spvUnsafeArray gl_CullDistance; }; struct main0_patchOut @@ -87,8 +87,8 @@ kernel void main0(uint gl_InvocationID [[thread_index_in_threadgroup]], uint gl_ device main0_out* gl_out = &spvOut[gl_PrimitiveID * 4]; gl_out[gl_InvocationID].C_v = _18[gl_InvocationID].v; gl_out[gl_InvocationID].gl_PointSize = _33[gl_InvocationID].gl_PointSize; - gl_out[gl_InvocationID].gl_ClipDistance[0] = _33[gl_InvocationID].gl_ClipDistance[0]; - gl_out[gl_InvocationID].gl_CullDistance[0] = _33[gl_InvocationID].gl_CullDistance[0]; + gl_out[gl_InvocationID].gl_ClipDistance = _33[gl_InvocationID].gl_ClipDistance; + gl_out[gl_InvocationID].gl_CullDistance = _33[gl_InvocationID].gl_CullDistance; gl_out_masked[gl_InvocationID] = _33[gl_InvocationID]; device main0_patchOut& patchOut = spvPatchOut[gl_PrimitiveID]; patchOut.P_v = float4(0.0); diff --git a/reference/shaders-msl-no-opt/asm/masking/initializers-block.mask-position.multi-patch.msl2.asm.tesc b/reference/shaders-msl-no-opt/asm/masking/initializers-block.mask-position.multi-patch.msl2.asm.tesc index ec00a00d..c20467af 100644 --- a/reference/shaders-msl-no-opt/asm/masking/initializers-block.mask-position.multi-patch.msl2.asm.tesc +++ b/reference/shaders-msl-no-opt/asm/masking/initializers-block.mask-position.multi-patch.msl2.asm.tesc @@ -58,8 +58,8 @@ struct gl_PerVertex { float4 gl_Position; float gl_PointSize; - float gl_ClipDistance[1]; - float gl_CullDistance[1]; + spvUnsafeArray gl_ClipDistance; + spvUnsafeArray gl_CullDistance; }; constant spvUnsafeArray _51 = spvUnsafeArray({ 0.0 }); @@ -69,8 +69,8 @@ struct main0_out { float4 C_v; float gl_PointSize; - float gl_ClipDistance[1]; - float gl_CullDistance[1]; + spvUnsafeArray gl_ClipDistance; + spvUnsafeArray gl_CullDistance; }; struct main0_patchOut @@ -86,8 +86,8 @@ kernel void main0(uint3 gl_GlobalInvocationID [[thread_position_in_grid]], devic device main0_out* gl_out = &spvOut[gl_GlobalInvocationID.x - gl_GlobalInvocationID.x % 4]; gl_out[gl_GlobalInvocationID.x % 4].C_v = _18[gl_GlobalInvocationID.x % 4].v; gl_out[gl_GlobalInvocationID.x % 4].gl_PointSize = _33[gl_GlobalInvocationID.x % 4].gl_PointSize; - gl_out[gl_GlobalInvocationID.x % 4].gl_ClipDistance[0] = _33[gl_GlobalInvocationID.x % 4].gl_ClipDistance[0]; - gl_out[gl_GlobalInvocationID.x % 4].gl_CullDistance[0] = _33[gl_GlobalInvocationID.x % 4].gl_CullDistance[0]; + gl_out[gl_GlobalInvocationID.x % 4].gl_ClipDistance = _33[gl_GlobalInvocationID.x % 4].gl_ClipDistance; + gl_out[gl_GlobalInvocationID.x % 4].gl_CullDistance = _33[gl_GlobalInvocationID.x % 4].gl_CullDistance; threadgroup gl_PerVertex spvStoragegl_out_masked[8][4]; threadgroup gl_PerVertex (&gl_out_masked)[4] = spvStoragegl_out_masked[(gl_GlobalInvocationID.x / 4) % 8]; gl_out_masked[gl_GlobalInvocationID.x % 4] = _33[gl_GlobalInvocationID.x % 4]; diff --git a/reference/shaders-msl-no-opt/asm/masking/initializers.mask-location-0.msl2.asm.tesc b/reference/shaders-msl-no-opt/asm/masking/initializers.mask-location-0.msl2.asm.tesc index 5fcd3b3e..25fe13bf 100644 --- a/reference/shaders-msl-no-opt/asm/masking/initializers.mask-location-0.msl2.asm.tesc +++ b/reference/shaders-msl-no-opt/asm/masking/initializers.mask-location-0.msl2.asm.tesc @@ -48,8 +48,8 @@ struct _RESERVED_IDENTIFIER_FIXUP_gl_PerVertex { float4 _RESERVED_IDENTIFIER_FIXUP_gl_Position; float _RESERVED_IDENTIFIER_FIXUP_gl_PointSize; - float _RESERVED_IDENTIFIER_FIXUP_gl_ClipDistance[1]; - float _RESERVED_IDENTIFIER_FIXUP_gl_CullDistance[1]; + spvUnsafeArray _RESERVED_IDENTIFIER_FIXUP_gl_ClipDistance; + spvUnsafeArray _RESERVED_IDENTIFIER_FIXUP_gl_CullDistance; }; constant spvUnsafeArray _15 = spvUnsafeArray({ float4(0.0), float4(0.0), float4(0.0), float4(0.0) }); @@ -60,8 +60,8 @@ struct main0_out { float4 gl_Position; float gl_PointSize; - float gl_ClipDistance[1]; - float gl_CullDistance[1]; + spvUnsafeArray gl_ClipDistance; + spvUnsafeArray gl_CullDistance; }; struct main0_patchOut @@ -78,8 +78,8 @@ kernel void main0(uint gl_InvocationID [[thread_index_in_threadgroup]], uint gl_ foo[gl_InvocationID] = _15[gl_InvocationID]; gl_out[gl_InvocationID].gl_Position = _29[gl_InvocationID]._RESERVED_IDENTIFIER_FIXUP_gl_Position; gl_out[gl_InvocationID].gl_PointSize = _29[gl_InvocationID]._RESERVED_IDENTIFIER_FIXUP_gl_PointSize; - gl_out[gl_InvocationID].gl_ClipDistance[0] = _29[gl_InvocationID]._RESERVED_IDENTIFIER_FIXUP_gl_ClipDistance[0]; - gl_out[gl_InvocationID].gl_CullDistance[0] = _29[gl_InvocationID]._RESERVED_IDENTIFIER_FIXUP_gl_CullDistance[0]; + gl_out[gl_InvocationID].gl_ClipDistance = _29[gl_InvocationID]._RESERVED_IDENTIFIER_FIXUP_gl_ClipDistance; + gl_out[gl_InvocationID].gl_CullDistance = _29[gl_InvocationID]._RESERVED_IDENTIFIER_FIXUP_gl_CullDistance; device main0_patchOut& patchOut = spvPatchOut[gl_PrimitiveID]; patchOut.foo_patch = float4(0.0); foo[gl_InvocationID] = float4(1.0); diff --git a/reference/shaders-msl-no-opt/asm/masking/initializers.mask-location-0.msl2.multi-patch.asm.tesc b/reference/shaders-msl-no-opt/asm/masking/initializers.mask-location-0.msl2.multi-patch.asm.tesc index a598710a..b58ba996 100644 --- a/reference/shaders-msl-no-opt/asm/masking/initializers.mask-location-0.msl2.multi-patch.asm.tesc +++ b/reference/shaders-msl-no-opt/asm/masking/initializers.mask-location-0.msl2.multi-patch.asm.tesc @@ -48,8 +48,8 @@ struct _RESERVED_IDENTIFIER_FIXUP_gl_PerVertex { float4 _RESERVED_IDENTIFIER_FIXUP_gl_Position; float _RESERVED_IDENTIFIER_FIXUP_gl_PointSize; - float _RESERVED_IDENTIFIER_FIXUP_gl_ClipDistance[1]; - float _RESERVED_IDENTIFIER_FIXUP_gl_CullDistance[1]; + spvUnsafeArray _RESERVED_IDENTIFIER_FIXUP_gl_ClipDistance; + spvUnsafeArray _RESERVED_IDENTIFIER_FIXUP_gl_CullDistance; }; constant spvUnsafeArray _15 = spvUnsafeArray({ float4(0.0), float4(0.0), float4(0.0), float4(0.0) }); @@ -60,8 +60,8 @@ struct main0_out { float4 gl_Position; float gl_PointSize; - float gl_ClipDistance[1]; - float gl_CullDistance[1]; + spvUnsafeArray gl_ClipDistance; + spvUnsafeArray gl_CullDistance; }; struct main0_patchOut @@ -79,8 +79,8 @@ kernel void main0(uint3 gl_GlobalInvocationID [[thread_position_in_grid]], devic foo[gl_GlobalInvocationID.x % 4] = _15[gl_GlobalInvocationID.x % 4]; gl_out[gl_GlobalInvocationID.x % 4].gl_Position = _29[gl_GlobalInvocationID.x % 4]._RESERVED_IDENTIFIER_FIXUP_gl_Position; gl_out[gl_GlobalInvocationID.x % 4].gl_PointSize = _29[gl_GlobalInvocationID.x % 4]._RESERVED_IDENTIFIER_FIXUP_gl_PointSize; - gl_out[gl_GlobalInvocationID.x % 4].gl_ClipDistance[0] = _29[gl_GlobalInvocationID.x % 4]._RESERVED_IDENTIFIER_FIXUP_gl_ClipDistance[0]; - gl_out[gl_GlobalInvocationID.x % 4].gl_CullDistance[0] = _29[gl_GlobalInvocationID.x % 4]._RESERVED_IDENTIFIER_FIXUP_gl_CullDistance[0]; + gl_out[gl_GlobalInvocationID.x % 4].gl_ClipDistance = _29[gl_GlobalInvocationID.x % 4]._RESERVED_IDENTIFIER_FIXUP_gl_ClipDistance; + gl_out[gl_GlobalInvocationID.x % 4].gl_CullDistance = _29[gl_GlobalInvocationID.x % 4]._RESERVED_IDENTIFIER_FIXUP_gl_CullDistance; device main0_patchOut& patchOut = spvPatchOut[gl_GlobalInvocationID.x / 4]; patchOut.foo_patch = float4(0.0); uint gl_InvocationID = gl_GlobalInvocationID.x % 4; diff --git a/reference/shaders-msl-no-opt/asm/masking/initializers.mask-location-1.asm.tesc b/reference/shaders-msl-no-opt/asm/masking/initializers.mask-location-1.asm.tesc index 0e188838..e8f1146b 100644 --- a/reference/shaders-msl-no-opt/asm/masking/initializers.mask-location-1.asm.tesc +++ b/reference/shaders-msl-no-opt/asm/masking/initializers.mask-location-1.asm.tesc @@ -48,8 +48,8 @@ struct _RESERVED_IDENTIFIER_FIXUP_gl_PerVertex { float4 _RESERVED_IDENTIFIER_FIXUP_gl_Position; float _RESERVED_IDENTIFIER_FIXUP_gl_PointSize; - float _RESERVED_IDENTIFIER_FIXUP_gl_ClipDistance[1]; - float _RESERVED_IDENTIFIER_FIXUP_gl_CullDistance[1]; + spvUnsafeArray _RESERVED_IDENTIFIER_FIXUP_gl_ClipDistance; + spvUnsafeArray _RESERVED_IDENTIFIER_FIXUP_gl_CullDistance; }; constant spvUnsafeArray _15 = spvUnsafeArray({ float4(0.0), float4(0.0), float4(0.0), float4(0.0) }); @@ -61,8 +61,8 @@ struct main0_out float4 foo; float4 gl_Position; float gl_PointSize; - float gl_ClipDistance[1]; - float gl_CullDistance[1]; + spvUnsafeArray gl_ClipDistance; + spvUnsafeArray gl_CullDistance; }; struct main0_patchOut @@ -77,8 +77,8 @@ kernel void main0(uint gl_InvocationID [[thread_index_in_threadgroup]], uint gl_ gl_out[gl_InvocationID].foo = _15[gl_InvocationID]; gl_out[gl_InvocationID].gl_Position = _29[gl_InvocationID]._RESERVED_IDENTIFIER_FIXUP_gl_Position; gl_out[gl_InvocationID].gl_PointSize = _29[gl_InvocationID]._RESERVED_IDENTIFIER_FIXUP_gl_PointSize; - gl_out[gl_InvocationID].gl_ClipDistance[0] = _29[gl_InvocationID]._RESERVED_IDENTIFIER_FIXUP_gl_ClipDistance[0]; - gl_out[gl_InvocationID].gl_CullDistance[0] = _29[gl_InvocationID]._RESERVED_IDENTIFIER_FIXUP_gl_CullDistance[0]; + gl_out[gl_InvocationID].gl_ClipDistance = _29[gl_InvocationID]._RESERVED_IDENTIFIER_FIXUP_gl_ClipDistance; + gl_out[gl_InvocationID].gl_CullDistance = _29[gl_InvocationID]._RESERVED_IDENTIFIER_FIXUP_gl_CullDistance; device main0_patchOut& patchOut = spvPatchOut[gl_PrimitiveID]; foo_patch = float4(0.0); gl_out[gl_InvocationID].foo = float4(1.0); diff --git a/reference/shaders-msl-no-opt/asm/masking/initializers.mask-location-1.multi-patch.asm.tesc b/reference/shaders-msl-no-opt/asm/masking/initializers.mask-location-1.multi-patch.asm.tesc index 57e5ce12..167c24c5 100644 --- a/reference/shaders-msl-no-opt/asm/masking/initializers.mask-location-1.multi-patch.asm.tesc +++ b/reference/shaders-msl-no-opt/asm/masking/initializers.mask-location-1.multi-patch.asm.tesc @@ -48,8 +48,8 @@ struct _RESERVED_IDENTIFIER_FIXUP_gl_PerVertex { float4 _RESERVED_IDENTIFIER_FIXUP_gl_Position; float _RESERVED_IDENTIFIER_FIXUP_gl_PointSize; - float _RESERVED_IDENTIFIER_FIXUP_gl_ClipDistance[1]; - float _RESERVED_IDENTIFIER_FIXUP_gl_CullDistance[1]; + spvUnsafeArray _RESERVED_IDENTIFIER_FIXUP_gl_ClipDistance; + spvUnsafeArray _RESERVED_IDENTIFIER_FIXUP_gl_CullDistance; }; constant spvUnsafeArray _15 = spvUnsafeArray({ float4(0.0), float4(0.0), float4(0.0), float4(0.0) }); @@ -61,8 +61,8 @@ struct main0_out float4 foo; float4 gl_Position; float gl_PointSize; - float gl_ClipDistance[1]; - float gl_CullDistance[1]; + spvUnsafeArray gl_ClipDistance; + spvUnsafeArray gl_CullDistance; }; struct main0_patchOut @@ -76,8 +76,8 @@ kernel void main0(uint3 gl_GlobalInvocationID [[thread_position_in_grid]], devic gl_out[gl_GlobalInvocationID.x % 4].foo = _15[gl_GlobalInvocationID.x % 4]; gl_out[gl_GlobalInvocationID.x % 4].gl_Position = _29[gl_GlobalInvocationID.x % 4]._RESERVED_IDENTIFIER_FIXUP_gl_Position; gl_out[gl_GlobalInvocationID.x % 4].gl_PointSize = _29[gl_GlobalInvocationID.x % 4]._RESERVED_IDENTIFIER_FIXUP_gl_PointSize; - gl_out[gl_GlobalInvocationID.x % 4].gl_ClipDistance[0] = _29[gl_GlobalInvocationID.x % 4]._RESERVED_IDENTIFIER_FIXUP_gl_ClipDistance[0]; - gl_out[gl_GlobalInvocationID.x % 4].gl_CullDistance[0] = _29[gl_GlobalInvocationID.x % 4]._RESERVED_IDENTIFIER_FIXUP_gl_CullDistance[0]; + gl_out[gl_GlobalInvocationID.x % 4].gl_ClipDistance = _29[gl_GlobalInvocationID.x % 4]._RESERVED_IDENTIFIER_FIXUP_gl_ClipDistance; + gl_out[gl_GlobalInvocationID.x % 4].gl_CullDistance = _29[gl_GlobalInvocationID.x % 4]._RESERVED_IDENTIFIER_FIXUP_gl_CullDistance; device main0_patchOut& patchOut = spvPatchOut[gl_GlobalInvocationID.x / 4]; threadgroup float4 spvStoragefoo_patch[8]; threadgroup float4 (&foo_patch) = spvStoragefoo_patch[(gl_GlobalInvocationID.x / 4) % 8]; diff --git a/reference/shaders-msl-no-opt/asm/masking/initializers.mask-point-size.msl2.asm.tesc b/reference/shaders-msl-no-opt/asm/masking/initializers.mask-point-size.msl2.asm.tesc index 355d4237..344751b0 100644 --- a/reference/shaders-msl-no-opt/asm/masking/initializers.mask-point-size.msl2.asm.tesc +++ b/reference/shaders-msl-no-opt/asm/masking/initializers.mask-point-size.msl2.asm.tesc @@ -48,8 +48,8 @@ struct gl_PerVertex { float4 gl_Position; float gl_PointSize; - float gl_ClipDistance[1]; - float gl_CullDistance[1]; + spvUnsafeArray gl_ClipDistance; + spvUnsafeArray gl_CullDistance; }; constant spvUnsafeArray _15 = spvUnsafeArray({ float4(0.0), float4(0.0), float4(0.0), float4(0.0) }); @@ -60,8 +60,8 @@ struct main0_out { float4 foo; float4 gl_Position; - float gl_ClipDistance[1]; - float gl_CullDistance[1]; + spvUnsafeArray gl_ClipDistance; + spvUnsafeArray gl_CullDistance; }; struct main0_patchOut @@ -77,8 +77,8 @@ kernel void main0(uint gl_InvocationID [[thread_index_in_threadgroup]], uint gl_ device main0_out* gl_out = &spvOut[gl_PrimitiveID * 4]; gl_out[gl_InvocationID].foo = _15[gl_InvocationID]; gl_out[gl_InvocationID].gl_Position = _29[gl_InvocationID].gl_Position; - gl_out[gl_InvocationID].gl_ClipDistance[0] = _29[gl_InvocationID].gl_ClipDistance[0]; - gl_out[gl_InvocationID].gl_CullDistance[0] = _29[gl_InvocationID].gl_CullDistance[0]; + gl_out[gl_InvocationID].gl_ClipDistance = _29[gl_InvocationID].gl_ClipDistance; + gl_out[gl_InvocationID].gl_CullDistance = _29[gl_InvocationID].gl_CullDistance; gl_out_masked[gl_InvocationID] = _29[gl_InvocationID]; device main0_patchOut& patchOut = spvPatchOut[gl_PrimitiveID]; patchOut.foo_patch = float4(0.0); diff --git a/reference/shaders-msl-no-opt/asm/masking/initializers.mask-point-size.msl2.multi-patch.asm.tesc b/reference/shaders-msl-no-opt/asm/masking/initializers.mask-point-size.msl2.multi-patch.asm.tesc index e81dbad6..33379f2c 100644 --- a/reference/shaders-msl-no-opt/asm/masking/initializers.mask-point-size.msl2.multi-patch.asm.tesc +++ b/reference/shaders-msl-no-opt/asm/masking/initializers.mask-point-size.msl2.multi-patch.asm.tesc @@ -48,8 +48,8 @@ struct gl_PerVertex { float4 gl_Position; float gl_PointSize; - float gl_ClipDistance[1]; - float gl_CullDistance[1]; + spvUnsafeArray gl_ClipDistance; + spvUnsafeArray gl_CullDistance; }; constant spvUnsafeArray _15 = spvUnsafeArray({ float4(0.0), float4(0.0), float4(0.0), float4(0.0) }); @@ -60,8 +60,8 @@ struct main0_out { float4 foo; float4 gl_Position; - float gl_ClipDistance[1]; - float gl_CullDistance[1]; + spvUnsafeArray gl_ClipDistance; + spvUnsafeArray gl_CullDistance; }; struct main0_patchOut @@ -76,8 +76,8 @@ kernel void main0(uint3 gl_GlobalInvocationID [[thread_position_in_grid]], devic device main0_out* gl_out = &spvOut[gl_GlobalInvocationID.x - gl_GlobalInvocationID.x % 4]; gl_out[gl_GlobalInvocationID.x % 4].foo = _15[gl_GlobalInvocationID.x % 4]; gl_out[gl_GlobalInvocationID.x % 4].gl_Position = _29[gl_GlobalInvocationID.x % 4].gl_Position; - gl_out[gl_GlobalInvocationID.x % 4].gl_ClipDistance[0] = _29[gl_GlobalInvocationID.x % 4].gl_ClipDistance[0]; - gl_out[gl_GlobalInvocationID.x % 4].gl_CullDistance[0] = _29[gl_GlobalInvocationID.x % 4].gl_CullDistance[0]; + gl_out[gl_GlobalInvocationID.x % 4].gl_ClipDistance = _29[gl_GlobalInvocationID.x % 4].gl_ClipDistance; + gl_out[gl_GlobalInvocationID.x % 4].gl_CullDistance = _29[gl_GlobalInvocationID.x % 4].gl_CullDistance; threadgroup gl_PerVertex spvStoragegl_out_masked[8][4]; threadgroup gl_PerVertex (&gl_out_masked)[4] = spvStoragegl_out_masked[(gl_GlobalInvocationID.x / 4) % 8]; gl_out_masked[gl_GlobalInvocationID.x % 4] = _29[gl_GlobalInvocationID.x % 4]; diff --git a/reference/shaders-msl-no-opt/asm/masking/initializers.mask-position.msl2.asm.tesc b/reference/shaders-msl-no-opt/asm/masking/initializers.mask-position.msl2.asm.tesc index 1845d8e7..2f11636a 100644 --- a/reference/shaders-msl-no-opt/asm/masking/initializers.mask-position.msl2.asm.tesc +++ b/reference/shaders-msl-no-opt/asm/masking/initializers.mask-position.msl2.asm.tesc @@ -48,8 +48,8 @@ struct gl_PerVertex { float4 gl_Position; float gl_PointSize; - float gl_ClipDistance[1]; - float gl_CullDistance[1]; + spvUnsafeArray gl_ClipDistance; + spvUnsafeArray gl_CullDistance; }; constant spvUnsafeArray _15 = spvUnsafeArray({ float4(0.0), float4(0.0), float4(0.0), float4(0.0) }); @@ -60,8 +60,8 @@ struct main0_out { float4 foo; float gl_PointSize; - float gl_ClipDistance[1]; - float gl_CullDistance[1]; + spvUnsafeArray gl_ClipDistance; + spvUnsafeArray gl_CullDistance; }; struct main0_patchOut @@ -77,8 +77,8 @@ kernel void main0(uint gl_InvocationID [[thread_index_in_threadgroup]], uint gl_ device main0_out* gl_out = &spvOut[gl_PrimitiveID * 4]; gl_out[gl_InvocationID].foo = _15[gl_InvocationID]; gl_out[gl_InvocationID].gl_PointSize = _29[gl_InvocationID].gl_PointSize; - gl_out[gl_InvocationID].gl_ClipDistance[0] = _29[gl_InvocationID].gl_ClipDistance[0]; - gl_out[gl_InvocationID].gl_CullDistance[0] = _29[gl_InvocationID].gl_CullDistance[0]; + gl_out[gl_InvocationID].gl_ClipDistance = _29[gl_InvocationID].gl_ClipDistance; + gl_out[gl_InvocationID].gl_CullDistance = _29[gl_InvocationID].gl_CullDistance; gl_out_masked[gl_InvocationID] = _29[gl_InvocationID]; device main0_patchOut& patchOut = spvPatchOut[gl_PrimitiveID]; patchOut.foo_patch = float4(0.0); diff --git a/reference/shaders-msl-no-opt/asm/masking/initializers.mask-position.msl2.multi-patch.asm.tesc b/reference/shaders-msl-no-opt/asm/masking/initializers.mask-position.msl2.multi-patch.asm.tesc index af8be746..1fa5d1eb 100644 --- a/reference/shaders-msl-no-opt/asm/masking/initializers.mask-position.msl2.multi-patch.asm.tesc +++ b/reference/shaders-msl-no-opt/asm/masking/initializers.mask-position.msl2.multi-patch.asm.tesc @@ -48,8 +48,8 @@ struct gl_PerVertex { float4 gl_Position; float gl_PointSize; - float gl_ClipDistance[1]; - float gl_CullDistance[1]; + spvUnsafeArray gl_ClipDistance; + spvUnsafeArray gl_CullDistance; }; constant spvUnsafeArray _15 = spvUnsafeArray({ float4(0.0), float4(0.0), float4(0.0), float4(0.0) }); @@ -60,8 +60,8 @@ struct main0_out { float4 foo; float gl_PointSize; - float gl_ClipDistance[1]; - float gl_CullDistance[1]; + spvUnsafeArray gl_ClipDistance; + spvUnsafeArray gl_CullDistance; }; struct main0_patchOut @@ -76,8 +76,8 @@ kernel void main0(uint3 gl_GlobalInvocationID [[thread_position_in_grid]], devic device main0_out* gl_out = &spvOut[gl_GlobalInvocationID.x - gl_GlobalInvocationID.x % 4]; gl_out[gl_GlobalInvocationID.x % 4].foo = _15[gl_GlobalInvocationID.x % 4]; gl_out[gl_GlobalInvocationID.x % 4].gl_PointSize = _29[gl_GlobalInvocationID.x % 4].gl_PointSize; - gl_out[gl_GlobalInvocationID.x % 4].gl_ClipDistance[0] = _29[gl_GlobalInvocationID.x % 4].gl_ClipDistance[0]; - gl_out[gl_GlobalInvocationID.x % 4].gl_CullDistance[0] = _29[gl_GlobalInvocationID.x % 4].gl_CullDistance[0]; + gl_out[gl_GlobalInvocationID.x % 4].gl_ClipDistance = _29[gl_GlobalInvocationID.x % 4].gl_ClipDistance; + gl_out[gl_GlobalInvocationID.x % 4].gl_CullDistance = _29[gl_GlobalInvocationID.x % 4].gl_CullDistance; threadgroup gl_PerVertex spvStoragegl_out_masked[8][4]; threadgroup gl_PerVertex (&gl_out_masked)[4] = spvStoragegl_out_masked[(gl_GlobalInvocationID.x / 4) % 8]; gl_out_masked[gl_GlobalInvocationID.x % 4] = _29[gl_GlobalInvocationID.x % 4]; diff --git a/reference/shaders-msl-no-opt/tesc/passthrough-clip-cull.multi-patch.tesc b/reference/shaders-msl-no-opt/tesc/passthrough-clip-cull.multi-patch.tesc index c2c3c4b6..34a1bf4b 100644 --- a/reference/shaders-msl-no-opt/tesc/passthrough-clip-cull.multi-patch.tesc +++ b/reference/shaders-msl-no-opt/tesc/passthrough-clip-cull.multi-patch.tesc @@ -1,20 +1,61 @@ +#pragma clang diagnostic ignored "-Wmissing-prototypes" +#pragma clang diagnostic ignored "-Wmissing-braces" + #include #include using namespace metal; +template +struct spvUnsafeArray +{ + T elements[Num ? Num : 1]; + + thread T& operator [] (size_t pos) thread + { + return elements[pos]; + } + constexpr const thread T& operator [] (size_t pos) const thread + { + return elements[pos]; + } + + device T& operator [] (size_t pos) device + { + return elements[pos]; + } + constexpr const device T& operator [] (size_t pos) const device + { + return elements[pos]; + } + + constexpr const constant T& operator [] (size_t pos) const constant + { + return elements[pos]; + } + + threadgroup T& operator [] (size_t pos) threadgroup + { + return elements[pos]; + } + constexpr const threadgroup T& operator [] (size_t pos) const threadgroup + { + return elements[pos]; + } +}; + struct main0_out { - float gl_ClipDistance[2]; - float gl_CullDistance[1]; + spvUnsafeArray gl_ClipDistance; + spvUnsafeArray gl_CullDistance; }; struct main0_in { uint3 m_57; ushort2 m_61; - float gl_ClipDistance[2]; - float gl_CullDistance[1]; + spvUnsafeArray gl_ClipDistance; + spvUnsafeArray gl_CullDistance; }; kernel void main0(uint3 gl_GlobalInvocationID [[thread_position_in_grid]], device main0_out* spvOut [[buffer(28)]], constant uint* spvIndirectParams [[buffer(29)]], device MTLQuadTessellationFactorsHalf* spvTessLevel [[buffer(26)]], device main0_in* spvIn [[buffer(22)]]) diff --git a/reference/shaders-msl-no-opt/vert/cull-distance.for-tess.vert b/reference/shaders-msl-no-opt/vert/cull-distance.for-tess.vert index 0e66293d..5c2311d7 100644 --- a/reference/shaders-msl-no-opt/vert/cull-distance.for-tess.vert +++ b/reference/shaders-msl-no-opt/vert/cull-distance.for-tess.vert @@ -1,12 +1,53 @@ +#pragma clang diagnostic ignored "-Wmissing-prototypes" +#pragma clang diagnostic ignored "-Wmissing-braces" + #include #include using namespace metal; +template +struct spvUnsafeArray +{ + T elements[Num ? Num : 1]; + + thread T& operator [] (size_t pos) thread + { + return elements[pos]; + } + constexpr const thread T& operator [] (size_t pos) const thread + { + return elements[pos]; + } + + device T& operator [] (size_t pos) device + { + return elements[pos]; + } + constexpr const device T& operator [] (size_t pos) const device + { + return elements[pos]; + } + + constexpr const constant T& operator [] (size_t pos) const constant + { + return elements[pos]; + } + + threadgroup T& operator [] (size_t pos) threadgroup + { + return elements[pos]; + } + constexpr const threadgroup T& operator [] (size_t pos) const threadgroup + { + return elements[pos]; + } +}; + struct main0_out { float4 gl_Position; - float gl_CullDistance[2]; + spvUnsafeArray gl_CullDistance; }; kernel void main0(uint3 gl_GlobalInvocationID [[thread_position_in_grid]], uint3 spvStageInputSize [[grid_size]], device main0_out* spvOut [[buffer(28)]]) diff --git a/reference/shaders-msl/frag/clip-distance-varying.frag b/reference/shaders-msl/frag/clip-distance-varying.frag index 6c3f1739..9a72d5ba 100644 --- a/reference/shaders-msl/frag/clip-distance-varying.frag +++ b/reference/shaders-msl/frag/clip-distance-varying.frag @@ -1,8 +1,49 @@ +#pragma clang diagnostic ignored "-Wmissing-prototypes" +#pragma clang diagnostic ignored "-Wmissing-braces" + #include #include using namespace metal; +template +struct spvUnsafeArray +{ + T elements[Num ? Num : 1]; + + thread T& operator [] (size_t pos) thread + { + return elements[pos]; + } + constexpr const thread T& operator [] (size_t pos) const thread + { + return elements[pos]; + } + + device T& operator [] (size_t pos) device + { + return elements[pos]; + } + constexpr const device T& operator [] (size_t pos) const device + { + return elements[pos]; + } + + constexpr const constant T& operator [] (size_t pos) const constant + { + return elements[pos]; + } + + threadgroup T& operator [] (size_t pos) threadgroup + { + return elements[pos]; + } + constexpr const threadgroup T& operator [] (size_t pos) const threadgroup + { + return elements[pos]; + } +}; + struct main0_out { float4 FragColor [[color(0)]]; @@ -17,7 +58,7 @@ struct main0_in fragment main0_out main0(main0_in in [[stage_in]]) { main0_out out = {}; - float gl_ClipDistance[2] = {}; + spvUnsafeArray gl_ClipDistance = {}; gl_ClipDistance[0] = in.gl_ClipDistance_0; gl_ClipDistance[1] = in.gl_ClipDistance_1; out.FragColor = float4((1.0 - gl_ClipDistance[0]) - gl_ClipDistance[1]); diff --git a/reference/shaders-msl/frag/cull-distance-varying.frag b/reference/shaders-msl/frag/cull-distance-varying.frag index ddde8e1d..708a2957 100644 --- a/reference/shaders-msl/frag/cull-distance-varying.frag +++ b/reference/shaders-msl/frag/cull-distance-varying.frag @@ -1,8 +1,49 @@ +#pragma clang diagnostic ignored "-Wmissing-prototypes" +#pragma clang diagnostic ignored "-Wmissing-braces" + #include #include using namespace metal; +template +struct spvUnsafeArray +{ + T elements[Num ? Num : 1]; + + thread T& operator [] (size_t pos) thread + { + return elements[pos]; + } + constexpr const thread T& operator [] (size_t pos) const thread + { + return elements[pos]; + } + + device T& operator [] (size_t pos) device + { + return elements[pos]; + } + constexpr const device T& operator [] (size_t pos) const device + { + return elements[pos]; + } + + constexpr const constant T& operator [] (size_t pos) const constant + { + return elements[pos]; + } + + threadgroup T& operator [] (size_t pos) threadgroup + { + return elements[pos]; + } + constexpr const threadgroup T& operator [] (size_t pos) const threadgroup + { + return elements[pos]; + } +}; + struct main0_out { float4 FragColor [[color(0)]]; @@ -17,7 +58,7 @@ struct main0_in fragment main0_out main0(main0_in in [[stage_in]]) { main0_out out = {}; - float gl_CullDistance[2] = {}; + spvUnsafeArray gl_CullDistance = {}; gl_CullDistance[0] = in.gl_CullDistance_0; gl_CullDistance[1] = in.gl_CullDistance_1; out.FragColor = float4((1.0 - gl_CullDistance[0]) - gl_CullDistance[1]); diff --git a/reference/shaders-msl/masking/write-outputs.mask-clip-distance.vert b/reference/shaders-msl/masking/write-outputs.mask-clip-distance.vert index b0fb7441..6f63fb41 100644 --- a/reference/shaders-msl/masking/write-outputs.mask-clip-distance.vert +++ b/reference/shaders-msl/masking/write-outputs.mask-clip-distance.vert @@ -1,10 +1,49 @@ #pragma clang diagnostic ignored "-Wmissing-prototypes" +#pragma clang diagnostic ignored "-Wmissing-braces" #include #include using namespace metal; +template +struct spvUnsafeArray +{ + T elements[Num ? Num : 1]; + + thread T& operator [] (size_t pos) thread + { + return elements[pos]; + } + constexpr const thread T& operator [] (size_t pos) const thread + { + return elements[pos]; + } + + device T& operator [] (size_t pos) device + { + return elements[pos]; + } + constexpr const device T& operator [] (size_t pos) const device + { + return elements[pos]; + } + + constexpr const constant T& operator [] (size_t pos) const constant + { + return elements[pos]; + } + + threadgroup T& operator [] (size_t pos) threadgroup + { + return elements[pos]; + } + constexpr const threadgroup T& operator [] (size_t pos) const threadgroup + { + return elements[pos]; + } +}; + struct main0_out { float4 v0 [[user(locn0)]]; @@ -27,7 +66,7 @@ void write_in_func(thread float4& v0, thread float4& v1, thread float4& gl_Posit vertex main0_out main0() { main0_out out = {}; - float gl_ClipDistance[2] = {}; + spvUnsafeArray gl_ClipDistance = {}; write_in_func(out.v0, out.v1, out.gl_Position, out.gl_PointSize, gl_ClipDistance); return out; } diff --git a/reference/shaders-msl/masking/write-outputs.mask-location-0.for-tess.vert b/reference/shaders-msl/masking/write-outputs.mask-location-0.for-tess.vert index 6aaefd1e..a004a380 100644 --- a/reference/shaders-msl/masking/write-outputs.mask-location-0.for-tess.vert +++ b/reference/shaders-msl/masking/write-outputs.mask-location-0.for-tess.vert @@ -1,16 +1,55 @@ #pragma clang diagnostic ignored "-Wmissing-prototypes" +#pragma clang diagnostic ignored "-Wmissing-braces" #include #include using namespace metal; +template +struct spvUnsafeArray +{ + T elements[Num ? Num : 1]; + + thread T& operator [] (size_t pos) thread + { + return elements[pos]; + } + constexpr const thread T& operator [] (size_t pos) const thread + { + return elements[pos]; + } + + device T& operator [] (size_t pos) device + { + return elements[pos]; + } + constexpr const device T& operator [] (size_t pos) const device + { + return elements[pos]; + } + + constexpr const constant T& operator [] (size_t pos) const constant + { + return elements[pos]; + } + + threadgroup T& operator [] (size_t pos) threadgroup + { + return elements[pos]; + } + constexpr const threadgroup T& operator [] (size_t pos) const threadgroup + { + return elements[pos]; + } +}; + struct main0_out { float4 v1; float4 gl_Position; float gl_PointSize; - float gl_ClipDistance[2]; + spvUnsafeArray gl_ClipDistance; }; static inline __attribute__((always_inline)) diff --git a/reference/shaders-msl/masking/write-outputs.mask-location-1.for-tess.vert b/reference/shaders-msl/masking/write-outputs.mask-location-1.for-tess.vert index 7f77f945..02288822 100644 --- a/reference/shaders-msl/masking/write-outputs.mask-location-1.for-tess.vert +++ b/reference/shaders-msl/masking/write-outputs.mask-location-1.for-tess.vert @@ -1,16 +1,55 @@ #pragma clang diagnostic ignored "-Wmissing-prototypes" +#pragma clang diagnostic ignored "-Wmissing-braces" #include #include using namespace metal; +template +struct spvUnsafeArray +{ + T elements[Num ? Num : 1]; + + thread T& operator [] (size_t pos) thread + { + return elements[pos]; + } + constexpr const thread T& operator [] (size_t pos) const thread + { + return elements[pos]; + } + + device T& operator [] (size_t pos) device + { + return elements[pos]; + } + constexpr const device T& operator [] (size_t pos) const device + { + return elements[pos]; + } + + constexpr const constant T& operator [] (size_t pos) const constant + { + return elements[pos]; + } + + threadgroup T& operator [] (size_t pos) threadgroup + { + return elements[pos]; + } + constexpr const threadgroup T& operator [] (size_t pos) const threadgroup + { + return elements[pos]; + } +}; + struct main0_out { float4 v0; float4 gl_Position; float gl_PointSize; - float gl_ClipDistance[2]; + spvUnsafeArray gl_ClipDistance; }; static inline __attribute__((always_inline)) diff --git a/reference/shaders-msl/masking/write-outputs.mask-point-size.for-tess.vert b/reference/shaders-msl/masking/write-outputs.mask-point-size.for-tess.vert index 63ebd678..1307b5b8 100644 --- a/reference/shaders-msl/masking/write-outputs.mask-point-size.for-tess.vert +++ b/reference/shaders-msl/masking/write-outputs.mask-point-size.for-tess.vert @@ -1,16 +1,55 @@ #pragma clang diagnostic ignored "-Wmissing-prototypes" +#pragma clang diagnostic ignored "-Wmissing-braces" #include #include using namespace metal; +template +struct spvUnsafeArray +{ + T elements[Num ? Num : 1]; + + thread T& operator [] (size_t pos) thread + { + return elements[pos]; + } + constexpr const thread T& operator [] (size_t pos) const thread + { + return elements[pos]; + } + + device T& operator [] (size_t pos) device + { + return elements[pos]; + } + constexpr const device T& operator [] (size_t pos) const device + { + return elements[pos]; + } + + constexpr const constant T& operator [] (size_t pos) const constant + { + return elements[pos]; + } + + threadgroup T& operator [] (size_t pos) threadgroup + { + return elements[pos]; + } + constexpr const threadgroup T& operator [] (size_t pos) const threadgroup + { + return elements[pos]; + } +}; + struct main0_out { float4 v0; float4 v1; float4 gl_Position; - float gl_ClipDistance[2]; + spvUnsafeArray gl_ClipDistance; }; static inline __attribute__((always_inline)) diff --git a/reference/shaders-msl/masking/write-outputs.mask-point-size.multi-patch.tesc b/reference/shaders-msl/masking/write-outputs.mask-point-size.multi-patch.tesc index d2c5a13f..a5ed8fdf 100644 --- a/reference/shaders-msl/masking/write-outputs.mask-point-size.multi-patch.tesc +++ b/reference/shaders-msl/masking/write-outputs.mask-point-size.multi-patch.tesc @@ -48,8 +48,8 @@ struct gl_PerVertex { float4 gl_Position; float gl_PointSize; - float gl_ClipDistance[1]; - float gl_CullDistance[1]; + spvUnsafeArray gl_ClipDistance; + spvUnsafeArray gl_CullDistance; }; struct main0_out diff --git a/reference/shaders-msl/masking/write-outputs.mask-point-size.tesc b/reference/shaders-msl/masking/write-outputs.mask-point-size.tesc index 8bc18b64..8ec2a663 100644 --- a/reference/shaders-msl/masking/write-outputs.mask-point-size.tesc +++ b/reference/shaders-msl/masking/write-outputs.mask-point-size.tesc @@ -48,8 +48,8 @@ struct gl_PerVertex { float4 gl_Position; float gl_PointSize; - float gl_ClipDistance[1]; - float gl_CullDistance[1]; + spvUnsafeArray gl_ClipDistance; + spvUnsafeArray gl_CullDistance; }; struct main0_out diff --git a/reference/shaders-msl/masking/write-outputs.mask-position.multi-patch.tesc b/reference/shaders-msl/masking/write-outputs.mask-position.multi-patch.tesc index f48d707e..84d7da36 100644 --- a/reference/shaders-msl/masking/write-outputs.mask-position.multi-patch.tesc +++ b/reference/shaders-msl/masking/write-outputs.mask-position.multi-patch.tesc @@ -48,8 +48,8 @@ struct gl_PerVertex { float4 gl_Position; float gl_PointSize; - float gl_ClipDistance[1]; - float gl_CullDistance[1]; + spvUnsafeArray gl_ClipDistance; + spvUnsafeArray gl_CullDistance; }; struct main0_out diff --git a/reference/shaders-msl/masking/write-outputs.mask-position.tesc b/reference/shaders-msl/masking/write-outputs.mask-position.tesc index e39db69c..da0d2a2d 100644 --- a/reference/shaders-msl/masking/write-outputs.mask-position.tesc +++ b/reference/shaders-msl/masking/write-outputs.mask-position.tesc @@ -48,8 +48,8 @@ struct gl_PerVertex { float4 gl_Position; float gl_PointSize; - float gl_ClipDistance[1]; - float gl_CullDistance[1]; + spvUnsafeArray gl_ClipDistance; + spvUnsafeArray gl_CullDistance; }; struct main0_out diff --git a/reference/shaders-msl/tese/read-tess-level-in-func.msl2.tese b/reference/shaders-msl/tese/read-tess-level-in-func.msl2.tese index 4bcf22d6..1dc3be33 100644 --- a/reference/shaders-msl/tese/read-tess-level-in-func.msl2.tese +++ b/reference/shaders-msl/tese/read-tess-level-in-func.msl2.tese @@ -1,10 +1,49 @@ #pragma clang diagnostic ignored "-Wmissing-prototypes" +#pragma clang diagnostic ignored "-Wmissing-braces" #include #include using namespace metal; +template +struct spvUnsafeArray +{ + T elements[Num ? Num : 1]; + + thread T& operator [] (size_t pos) thread + { + return elements[pos]; + } + constexpr const thread T& operator [] (size_t pos) const thread + { + return elements[pos]; + } + + device T& operator [] (size_t pos) device + { + return elements[pos]; + } + constexpr const device T& operator [] (size_t pos) const device + { + return elements[pos]; + } + + constexpr const constant T& operator [] (size_t pos) const constant + { + return elements[pos]; + } + + threadgroup T& operator [] (size_t pos) threadgroup + { + return elements[pos]; + } + constexpr const threadgroup T& operator [] (size_t pos) const threadgroup + { + return elements[pos]; + } +}; + struct main0_out { float4 gl_Position [[position]]; @@ -24,7 +63,7 @@ float4 read_tess_levels(thread float (&gl_TessLevelOuter)[4]) [[ patch(triangle, 0) ]] vertex main0_out main0(main0_patchIn patchIn [[stage_in]]) { main0_out out = {}; - float gl_TessLevelOuter[4] = {}; + spvUnsafeArray gl_TessLevelOuter = {}; gl_TessLevelOuter[0] = patchIn.gl_TessLevel.x; gl_TessLevelOuter[1] = patchIn.gl_TessLevel.y; gl_TessLevelOuter[2] = patchIn.gl_TessLevel.z; diff --git a/reference/shaders-msl/tese/triangle-tess-level.tese b/reference/shaders-msl/tese/triangle-tess-level.tese index 975e6298..6930e147 100644 --- a/reference/shaders-msl/tese/triangle-tess-level.tese +++ b/reference/shaders-msl/tese/triangle-tess-level.tese @@ -1,8 +1,49 @@ +#pragma clang diagnostic ignored "-Wmissing-prototypes" +#pragma clang diagnostic ignored "-Wmissing-braces" + #include #include using namespace metal; +template +struct spvUnsafeArray +{ + T elements[Num ? Num : 1]; + + thread T& operator [] (size_t pos) thread + { + return elements[pos]; + } + constexpr const thread T& operator [] (size_t pos) const thread + { + return elements[pos]; + } + + device T& operator [] (size_t pos) device + { + return elements[pos]; + } + constexpr const device T& operator [] (size_t pos) const device + { + return elements[pos]; + } + + constexpr const constant T& operator [] (size_t pos) const constant + { + return elements[pos]; + } + + threadgroup T& operator [] (size_t pos) threadgroup + { + return elements[pos]; + } + constexpr const threadgroup T& operator [] (size_t pos) const threadgroup + { + return elements[pos]; + } +}; + struct main0_out { float4 gl_Position [[position]]; @@ -16,8 +57,8 @@ struct main0_patchIn [[ patch(triangle, 0) ]] vertex main0_out main0(main0_patchIn patchIn [[stage_in]], float3 gl_TessCoord [[position_in_patch]]) { main0_out out = {}; - float gl_TessLevelInner[2] = {}; - float gl_TessLevelOuter[4] = {}; + spvUnsafeArray gl_TessLevelInner = {}; + spvUnsafeArray gl_TessLevelOuter = {}; gl_TessLevelInner[0] = patchIn.gl_TessLevel.w; gl_TessLevelOuter[0] = patchIn.gl_TessLevel.x; gl_TessLevelOuter[1] = patchIn.gl_TessLevel.y; diff --git a/spirv_msl.cpp b/spirv_msl.cpp index 4e716d06..f13e8451 100644 --- a/spirv_msl.cpp +++ b/spirv_msl.cpp @@ -2771,34 +2771,12 @@ void CompilerMSL::add_plain_member_variable_to_interface_block(StorageClass stor auto &type = this->get(var.basetype); uint32_t index = get_extended_member_decoration(var.self, mbr_idx, SPIRVCrossDecorationInterfaceMemberIndex); - auto &mbr_type = this->get(type.member_types[mbr_idx]); - - bool unroll_array = !mbr_type.array.empty() && is_builtin; - auto invocation = to_tesc_invocation_id(); auto constant_chain = join(to_expression(var.initializer), "[", invocation, "]"); - - if (unroll_array) - { - // Member arrays in these blocks are always native arrays, unroll copy. - uint32_t len = to_array_size_literal(mbr_type); - - for (uint32_t i = 0; i < len; i++) - { - statement(to_expression(stage_out_ptr_var_id), "[", - invocation, "].", - to_member_name(ib_type, index), "[", i, "] = ", - constant_chain, ".", - to_member_name(type, mbr_idx), "[", i, "];"); - } - } - else - { - statement(to_expression(stage_out_ptr_var_id), "[", - invocation, "].", - to_member_name(ib_type, index), " = ", - constant_chain, ".", to_member_name(type, mbr_idx), ";"); - } + statement(to_expression(stage_out_ptr_var_id), "[", + invocation, "].", + to_member_name(ib_type, index), " = ", + constant_chain, ".", to_member_name(type, mbr_idx), ";"); }); } else @@ -10419,8 +10397,10 @@ string CompilerMSL::to_struct_member(const SPIRType &type, uint32_t member_type_ // we need flat arrays, but if we're somehow declaring gl_PerVertex for constant array reasons, we want // template array types to be declared. bool is_ib_in_out = - ((stage_out_var_id && get_stage_out_struct_type().self == type.self) || - (stage_in_var_id && get_stage_in_struct_type().self == type.self)); + ((stage_out_var_id && get_stage_out_struct_type().self == type.self && + variable_storage_requires_stage_io(StorageClassOutput)) || + (stage_in_var_id && get_stage_in_struct_type().self == type.self && + variable_storage_requires_stage_io(StorageClassInput))); if (is_ib_in_out && is_member_builtin(type, index, &builtin)) is_using_builtin_array = true; array_type = type_to_array_glsl(physical_type); @@ -10446,11 +10426,8 @@ void CompilerMSL::emit_struct_member(const SPIRType &type, uint32_t member_type_ // Handle HLSL-style 0-based vertex/instance index. builtin_declaration = true; - bool old_is_using_builtin_array = is_using_builtin_array; - is_using_builtin_array = has_member_decoration(type.self, index, DecorationBuiltIn); statement(to_struct_member(type, member_type_id, index, qualifier)); builtin_declaration = false; - is_using_builtin_array = old_is_using_builtin_array; } void CompilerMSL::emit_struct_padding_target(const SPIRType &type) @@ -13256,11 +13233,7 @@ std::string CompilerMSL::variable_decl(const SPIRVariable &variable) bool old_is_using_builtin_array = is_using_builtin_array; // Threadgroup arrays can't have a wrapper type. - // More special cases. ClipDistance and CullDistance are emitted as plain arrays in stage out, - // so preserve that property when emitting them as masked variables. Avoids lots of extra special casing - // in argument_decl(). Similar argument for TessLevels. - if (variable_decl_is_remapped_storage(variable, StorageClassWorkgroup) || - has_decoration(variable.self, DecorationBuiltIn)) + if (variable_decl_is_remapped_storage(variable, StorageClassWorkgroup)) is_using_builtin_array = true; std::string expr = CompilerGLSL::variable_decl(variable);