From 56e49feea3956d66e41b819c26628c65b3c28197 Mon Sep 17 00:00:00 2001 From: Tim Foley Date: Wed, 22 Nov 2017 11:28:29 -0800 Subject: Fix emitting of loop attributes for HLSL pass-through (#296) Fixes #295. The code previously had a white list of attributes that it passed through, implemented in `emit.cpp` in an ad hoc fashion. The fix here is to just pass through whatever attributes the user wrote, and then let the downstream compiler diagnose if any of them are errorneous. --- tests/bugs/gh-295.hlsl | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 tests/bugs/gh-295.hlsl (limited to 'tests/bugs') diff --git a/tests/bugs/gh-295.hlsl b/tests/bugs/gh-295.hlsl new file mode 100644 index 000000000..724684662 --- /dev/null +++ b/tests/bugs/gh-295.hlsl @@ -0,0 +1,40 @@ +//TEST:COMPARE_HLSL: -profile vs_4_0 -target dxbc-assembly -no-checking + +// Confirm that we pass through `[fastopt]` attributes +// +// This shader does indexing into the elements of +// a vector, fetched from a `cbuffer`, based on +// a loop counter (or a loop with a small trip +// count), so `fxc` seems to want to unroll the +// loop. The `[fastopt]` attribute changes this +// behavior and results in a `loop` instruction +// in the DX bytecode, so we can use this to +// test whether Slang is passing through the +// attribute or not. + +// Import Slang code so that we aren't just in +// the 100% pass-through mode. +#ifdef __SLANG__ +__import empty; +#endif + +cbuffer C +{ + float4 b[4]; +} +float test(float x, float c) +{ + [fastopt] + for(int ii = 0; ii < 2; ++ii) + { + x = x*x + c + b[ii][ii]; + } + return x; +} + +float4 main(float4 a : A) : SV_Position +{ + a.x = test(a.x, a.y); + + return a; +} -- cgit v1.2.3