diff options
author | Hans-Kristian Arntzen <post@arntzen-software.no> | 2021-04-16 12:45:50 +0300 |
---|---|---|
committer | Hans-Kristian Arntzen <post@arntzen-software.no> | 2021-04-19 13:10:49 +0300 |
commit | c1edd35d579e708336cf8f8e2c981960ce6dd6e8 (patch) | |
tree | 972d1bb564e76eeb60208e91e26666f574d643fe /reference/opt/shaders-msl | |
parent | 7b9a591aa7f4cc29b3d8fdf30a84842afa46e750 (diff) |
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 ...
Diffstat (limited to 'reference/opt/shaders-msl')
12 files changed, 345 insertions, 17 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 <metal_stdlib> #include <simd/simd.h> using namespace metal; +template<typename T, size_t Num> +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<float, 2> 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 <metal_stdlib> #include <simd/simd.h> using namespace metal; +template<typename T, size_t Num> +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<float, 2> 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 <metal_stdlib> #include <simd/simd.h> using namespace metal; +template<typename T, size_t Num> +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<float, 2> 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 <metal_stdlib> #include <simd/simd.h> using namespace metal; +template<typename T, size_t Num> +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<float, 2> 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 <metal_stdlib> #include <simd/simd.h> using namespace metal; +template<typename T, size_t Num> +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<float, 2> 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 <metal_stdlib> #include <simd/simd.h> using namespace metal; +template<typename T, size_t Num> +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<float, 2> 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<float, 1> gl_ClipDistance; + spvUnsafeArray<float, 1> 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<float, 1> gl_ClipDistance; + spvUnsafeArray<float, 1> 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<float, 1> gl_ClipDistance; + spvUnsafeArray<float, 1> 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<float, 1> gl_ClipDistance; + spvUnsafeArray<float, 1> 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 <metal_stdlib> #include <simd/simd.h> using namespace metal; +template<typename T, size_t Num> +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<float, 4> 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 <metal_stdlib> #include <simd/simd.h> using namespace metal; +template<typename T, size_t Num> +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<float, 2> gl_TessLevelInner = {}; + spvUnsafeArray<float, 4> gl_TessLevelOuter = {}; gl_TessLevelInner[0] = patchIn.gl_TessLevel.w; gl_TessLevelOuter[0] = patchIn.gl_TessLevel.x; gl_TessLevelOuter[1] = patchIn.gl_TessLevel.y; |