summaryrefslogtreecommitdiff
path: root/tests/diagnostics
diff options
context:
space:
mode:
authorTim Foley <tfoleyNV@users.noreply.github.com>2019-01-14 14:27:44 -0800
committerGitHub <noreply@github.com>2019-01-14 14:27:44 -0800
commit5b0c5076326b98d0e9ee0f7bddda7f619676707c (patch)
treea08bc1710042bed328541a1d1b4e439ef4a70f50 /tests/diagnostics
parent35dfe37695b5703bc7d61aa03b17f195ee4c9e07 (diff)
Add an error for global uniform parameter declarations (#773)
A global uniform parameter in HLSL might canonically be defined like this: ```hlsl uniform float gSomeParameter; ``` The fxc and dxc compilers automatically collect all such parameters into a synthesized constant buffer, along the lines of: ```hlsl cbuffer $Globals { float gSomeParameter; } ``` Slang currently supports parsing and semantic checking of declarations like the above, and computes shader parameter layout/binding information that is appropriate for a constant buffer like `$Globals` above, but it does not include the support to emit HLSL or GLSL code that matches that layout, so that use of global uniforms in Slang is silently unsupported. Making this problem worse, the HLSL language is quite lax, and will parse the following as shader parameters as well: ```hlsl int gCounter = 0; const float kScaleFactor = 2.0f; ``` Each of those declarations introduces a global shader parameter, and then provides a default value for it via the initializer. These declarations do *not* introduce an ordinary global variable or constant as might be expected. (For anybody who wants to know, `static` is required to introduce a "real" global variable (although it will be a *thread-local* global in practice), while `static const` is required to introduce a global constant) I was not too worried about users trying to use global-scope uniforms and failing (since that has fallen out of common HLSL/GLSL practice), but the possibility that users might try to declare global variables/constants and get shader parameters by mistake creates more of a risk so that this hole is worth plugging. The right long-term fix is of course to support the intended semantics of global-scope uniforms, but that feature needs to be prioritized against other requests. A few of the Slang tests were unwittingly relying on this functionality, including some compute tests that seemingly got away with it based on the DXBC generated from the HLSL output by Slang just happening to match the layout they expected. These tests have all been tweaked to use explicit `cbuffer`s or `ParameterBlock`s instead.
Diffstat (limited to 'tests/diagnostics')
-rw-r--r--tests/diagnostics/global-uniform.slang13
-rw-r--r--tests/diagnostics/global-uniform.slang.expected8
2 files changed, 21 insertions, 0 deletions
diff --git a/tests/diagnostics/global-uniform.slang b/tests/diagnostics/global-uniform.slang
new file mode 100644
index 000000000..a3f17e536
--- /dev/null
+++ b/tests/diagnostics/global-uniform.slang
@@ -0,0 +1,13 @@
+// global-uniform.slang
+//TEST:SIMPLE:-target hlsl
+
+
+// Any attempt to declare a global variable that actually declares a
+// global uniform should be diagnosed as unsupported.
+
+uniform float a;
+
+const uint4 b = uint4(0,1,2,3);
+
+struct C { float x; int y; };
+C c;
diff --git a/tests/diagnostics/global-uniform.slang.expected b/tests/diagnostics/global-uniform.slang.expected
new file mode 100644
index 000000000..a77144c4f
--- /dev/null
+++ b/tests/diagnostics/global-uniform.slang.expected
@@ -0,0 +1,8 @@
+result code = -1
+standard error = {
+tests/diagnostics/global-uniform.slang(8): error 39016: 'a' is implicitly a global uniform shader parameter, which is currently unsupported by Slang. If a uniform parameter is intended, use a constant buffer or parameter block. If a global is intended, use the 'static' modifier.
+tests/diagnostics/global-uniform.slang(10): error 39016: 'b' is implicitly a global uniform shader parameter, which is currently unsupported by Slang. If a uniform parameter is intended, use a constant buffer or parameter block. If a global is intended, use the 'static' modifier.
+tests/diagnostics/global-uniform.slang(13): error 39016: 'c' is implicitly a global uniform shader parameter, which is currently unsupported by Slang. If a uniform parameter is intended, use a constant buffer or parameter block. If a global is intended, use the 'static' modifier.
+}
+standard output = {
+}