From 361fe52c9dfebf83c79d64daabf08e1111ab3fbf Mon Sep 17 00:00:00 2001 From: Hans-Kristian Arntzen Date: Mon, 6 Aug 2018 15:41:10 +0200 Subject: MSL: Properly support passing parameters by value. MSL would force thread const& which would not work if the input argument came from a different storage class. Emit proper non-reference arguments for such values. --- .../shaders-hlsl/asm/frag/pass-by-value.asm.frag | 24 ++++++++++++++++++++++ .../shaders-msl/asm/frag/pass-by-value.asm.frag | 22 ++++++++++++++++++++ .../opt/shaders/asm/frag/pass-by-value.asm.frag | 16 +++++++++++++++ 3 files changed, 62 insertions(+) create mode 100644 reference/opt/shaders-hlsl/asm/frag/pass-by-value.asm.frag create mode 100644 reference/opt/shaders-msl/asm/frag/pass-by-value.asm.frag create mode 100644 reference/opt/shaders/asm/frag/pass-by-value.asm.frag (limited to 'reference/opt') diff --git a/reference/opt/shaders-hlsl/asm/frag/pass-by-value.asm.frag b/reference/opt/shaders-hlsl/asm/frag/pass-by-value.asm.frag new file mode 100644 index 00000000..4fe2a197 --- /dev/null +++ b/reference/opt/shaders-hlsl/asm/frag/pass-by-value.asm.frag @@ -0,0 +1,24 @@ +cbuffer registers +{ + float registers_foo : packoffset(c0); +}; + +static float FragColor; + +struct SPIRV_Cross_Output +{ + float FragColor : SV_Target0; +}; + +void frag_main() +{ + FragColor = 10.0f + registers_foo; +} + +SPIRV_Cross_Output main() +{ + frag_main(); + SPIRV_Cross_Output stage_output; + stage_output.FragColor = FragColor; + return stage_output; +} diff --git a/reference/opt/shaders-msl/asm/frag/pass-by-value.asm.frag b/reference/opt/shaders-msl/asm/frag/pass-by-value.asm.frag new file mode 100644 index 00000000..3858f6da --- /dev/null +++ b/reference/opt/shaders-msl/asm/frag/pass-by-value.asm.frag @@ -0,0 +1,22 @@ +#include +#include + +using namespace metal; + +struct Registers +{ + float foo; +}; + +struct main0_out +{ + float FragColor [[color(0)]]; +}; + +fragment main0_out main0(constant Registers& registers [[buffer(0)]]) +{ + main0_out out = {}; + out.FragColor = 10.0 + registers.foo; + return out; +} + diff --git a/reference/opt/shaders/asm/frag/pass-by-value.asm.frag b/reference/opt/shaders/asm/frag/pass-by-value.asm.frag new file mode 100644 index 00000000..fbbfe18b --- /dev/null +++ b/reference/opt/shaders/asm/frag/pass-by-value.asm.frag @@ -0,0 +1,16 @@ +#version 450 + +struct Registers +{ + float foo; +}; + +uniform Registers registers; + +layout(location = 0) out float FragColor; + +void main() +{ + FragColor = 10.0 + registers.foo; +} + -- cgit v1.2.3