summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Foley <tfoleyNV@users.noreply.github.com>2017-11-22 13:58:16 -0800
committerGitHub <noreply@github.com>2017-11-22 13:58:16 -0800
commit581b30dd5a4263c90539a8c5cc6063b2485885cd (patch)
tree7e96f26c6b6e6bf6a8b15ba1820e844e78a31394
parentcd2d64657e3e07fba0a2021d5e47b7a55bd293e6 (diff)
parent56e49feea3956d66e41b819c26628c65b3c28197 (diff)
Merge branch 'master' into generic-param-fix
-rw-r--r--source/slang/emit.cpp18
-rw-r--r--tests/bugs/gh-295.hlsl40
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;
+}