summaryrefslogtreecommitdiffstats
path: root/tests/reflection
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/reflection
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/reflection')
-rw-r--r--tests/reflection/global-type-params.slang4
-rw-r--r--tests/reflection/global-type-params.slang.expected52
-rw-r--r--tests/reflection/global-uniforms.hlsl1
3 files changed, 29 insertions, 28 deletions
diff --git a/tests/reflection/global-type-params.slang b/tests/reflection/global-type-params.slang
index bfeb7fb2e..74961b7cc 100644
--- a/tests/reflection/global-type-params.slang
+++ b/tests/reflection/global-type-params.slang
@@ -3,7 +3,6 @@
// Confirm that we handle global generic parameters
-float4 u;
interface IBase
{};
@@ -24,10 +23,11 @@ SamplerState s;
cbuffer CB
{
+ float4 u;
float4 v;
+ float4 w;
}
-float4 w;
float4 main() : SV_Target
{
diff --git a/tests/reflection/global-type-params.slang.expected b/tests/reflection/global-type-params.slang.expected
index 308738b55..8f6ba2838 100644
--- a/tests/reflection/global-type-params.slang.expected
+++ b/tests/reflection/global-type-params.slang.expected
@@ -5,18 +5,6 @@ standard output = {
{
"parameters": [
{
- "name": "u",
- "binding": {"kind": "uniform", "offset": 0, "size": 16},
- "type": {
- "kind": "vector",
- "elementCount": 4,
- "elementType": {
- "kind": "scalar",
- "scalarType": "float32"
- }
- }
- },
- {
"name": "arg",
"binding": {"kind": "generic", "index": 0},
"type": {
@@ -65,14 +53,14 @@ standard output = {
},
{
"name": "CB",
- "binding": {"kind": "constantBuffer", "index": 1},
+ "binding": {"kind": "constantBuffer", "index": 0},
"type": {
"kind": "constantBuffer",
"elementType": {
"kind": "struct",
"fields": [
{
- "name": "v",
+ "name": "u",
"type": {
"kind": "vector",
"elementCount": 4,
@@ -82,22 +70,34 @@ standard output = {
}
},
"binding": {"kind": "uniform", "offset": 0, "size": 16}
+ },
+ {
+ "name": "v",
+ "type": {
+ "kind": "vector",
+ "elementCount": 4,
+ "elementType": {
+ "kind": "scalar",
+ "scalarType": "float32"
+ }
+ },
+ "binding": {"kind": "uniform", "offset": 16, "size": 16}
+ },
+ {
+ "name": "w",
+ "type": {
+ "kind": "vector",
+ "elementCount": 4,
+ "elementType": {
+ "kind": "scalar",
+ "scalarType": "float32"
+ }
+ },
+ "binding": {"kind": "uniform", "offset": 32, "size": 16}
}
]
}
}
- },
- {
- "name": "w",
- "binding": {"kind": "uniform", "offset": 16, "size": 16},
- "type": {
- "kind": "vector",
- "elementCount": 4,
- "elementType": {
- "kind": "scalar",
- "scalarType": "float32"
- }
- }
}
],
"entryPoints": [
diff --git a/tests/reflection/global-uniforms.hlsl b/tests/reflection/global-uniforms.hlsl
index 884042cfa..6d4992db2 100644
--- a/tests/reflection/global-uniforms.hlsl
+++ b/tests/reflection/global-uniforms.hlsl
@@ -1,3 +1,4 @@
+//TEST_IGNORE_FILE
//TEST:REFLECTION:-profile ps_4_0 -target hlsl
// Confirm that we handle uniforms at global scope