diff options
| author | Tim Foley <tfoleyNV@users.noreply.github.com> | 2017-11-22 13:58:16 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-11-22 13:58:16 -0800 |
| commit | 581b30dd5a4263c90539a8c5cc6063b2485885cd (patch) | |
| tree | 7e96f26c6b6e6bf6a8b15ba1820e844e78a31394 | |
| parent | cd2d64657e3e07fba0a2021d5e47b7a55bd293e6 (diff) | |
| parent | 56e49feea3956d66e41b819c26628c65b3c28197 (diff) | |
Merge branch 'master' into generic-param-fix
| -rw-r--r-- | source/slang/emit.cpp | 18 | ||||
| -rw-r--r-- | tests/bugs/gh-295.hlsl | 40 |
2 files changed, 46 insertions, 12 deletions
diff --git a/source/slang/emit.cpp b/source/slang/emit.cpp index 4cad7b28d..22dcf4333 100644 --- a/source/slang/emit.cpp +++ b/source/slang/emit.cpp @@ -2708,18 +2708,12 @@ struct EmitVisitor for(auto attr : decl->GetModifiersOfType<HLSLUncheckedAttribute>()) { - if(getText(attr->getName()) == "loop") - { - Emit("[loop]"); - } - else if(getText(attr->getName()) == "unroll") - { - Emit("[unroll]"); - } - else if(getText(attr->getName()) == "allow_uav_condition") - { - Emit("[allow_uav_condition]"); - } + // Emit whatever attributes the user might have attached, + // whether or not we think they make semantic sense. + // + Emit("["); + emit(attr->getName()); + Emit("]"); } } 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; +} |
