diff options
author | Hans-Kristian Arntzen <post@arntzen-software.no> | 2021-04-16 13:18:31 +0300 |
---|---|---|
committer | Hans-Kristian Arntzen <post@arntzen-software.no> | 2021-04-19 13:10:49 +0300 |
commit | 682a227f4b2e251a5bae89fa76849ace743926ad (patch) | |
tree | 386a3a10015b231332157c317f170c2c4479040f /reference/shaders-msl | |
parent | c1edd35d579e708336cf8f8e2c981960ce6dd6e8 (diff) |
MSL: Make builtin argument type declaration context sensitive.
Sometimes we'll need array template, sometimes not :shrug:.
Diffstat (limited to 'reference/shaders-msl')
4 files changed, 81 insertions, 3 deletions
diff --git a/reference/shaders-msl/frag/read-cull-clip-distance-in-function.frag b/reference/shaders-msl/frag/read-cull-clip-distance-in-function.frag new file mode 100644 index 00000000..02d57d9b --- /dev/null +++ b/reference/shaders-msl/frag/read-cull-clip-distance-in-function.frag @@ -0,0 +1,78 @@ +#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)]]; +}; + +struct main0_in +{ + float gl_ClipDistance_0 [[user(clip0)]]; + float gl_ClipDistance_1 [[user(clip1)]]; + float gl_CullDistance_0 [[user(cull0)]]; + float gl_CullDistance_1 [[user(cull1)]]; +}; + +static inline __attribute__((always_inline)) +float4 read_in_func(thread spvUnsafeArray<float, 2>& gl_CullDistance, thread spvUnsafeArray<float, 2>& gl_ClipDistance) +{ + return float4(gl_CullDistance[0], gl_CullDistance[1], gl_ClipDistance[0], gl_ClipDistance[1]); +} + +fragment main0_out main0(main0_in in [[stage_in]]) +{ + main0_out out = {}; + spvUnsafeArray<float, 2> gl_CullDistance = {}; + spvUnsafeArray<float, 2> gl_ClipDistance = {}; + gl_CullDistance[0] = in.gl_CullDistance_0; + gl_CullDistance[1] = in.gl_CullDistance_1; + gl_ClipDistance[0] = in.gl_ClipDistance_0; + gl_ClipDistance[1] = in.gl_ClipDistance_1; + out.FragColor = read_in_func(gl_CullDistance, 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 a004a380..53f76b57 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 @@ -53,7 +53,7 @@ struct main0_out }; static inline __attribute__((always_inline)) -void write_in_func(thread float4& v0, device float4& v1, device float4& gl_Position, device float& gl_PointSize, device float (&gl_ClipDistance)[2]) +void write_in_func(thread float4& v0, device float4& v1, device float4& gl_Position, device float& gl_PointSize, device spvUnsafeArray<float, 2>& gl_ClipDistance) { v0 = float4(1.0); v1 = float4(2.0); 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 02288822..8f9cfce5 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 @@ -53,7 +53,7 @@ struct main0_out }; static inline __attribute__((always_inline)) -void write_in_func(device float4& v0, thread float4& v1, device float4& gl_Position, device float& gl_PointSize, device float (&gl_ClipDistance)[2]) +void write_in_func(device float4& v0, thread float4& v1, device float4& gl_Position, device float& gl_PointSize, device spvUnsafeArray<float, 2>& gl_ClipDistance) { v0 = float4(1.0); v1 = float4(2.0); 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 1307b5b8..07494ea3 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 @@ -53,7 +53,7 @@ struct main0_out }; static inline __attribute__((always_inline)) -void write_in_func(device float4& v0, device float4& v1, device float4& gl_Position, thread float& gl_PointSize, device float (&gl_ClipDistance)[2]) +void write_in_func(device float4& v0, device float4& v1, device float4& gl_Position, thread float& gl_PointSize, device spvUnsafeArray<float, 2>& gl_ClipDistance) { v0 = float4(1.0); v1 = float4(2.0); |