summaryrefslogtreecommitdiff
path: root/tests/language-feature
diff options
context:
space:
mode:
authorTim Foley <tfoleyNV@users.noreply.github.com>2021-03-26 10:53:58 -0700
committerGitHub <noreply@github.com>2021-03-26 10:53:58 -0700
commit129faf8c4af4a57b7f1c71749f45b31aebfab038 (patch)
tree8ce3f618abf76d9144e28ac5860e425866cb866a /tests/language-feature
parentabb020b15c4f1057657e5f8f63c02b15615bf6ec (diff)
Append proper suffixes to 16-bit literals for GLSL (#1767)
* Append proper suffixes to 16-bit literals for GLSL The GLSL output path wasn't putting suffixes on literals of 16-bit types, and that was leading to compilation errors in downstream `glslang`. This change adds the suffixes defined by `GL_EXT_shader_explicit_arithmetic_types`. This change also wraps up 8-bit literals so that they are emitted as, e.g., `int8_t(1)` instead of just `1`, to make sure we don't have implicit conversions in the output GLSL that weren't implicit in the Slang IR. We similarly wrap floating-point special values like infinities in their desired types when the type is `float` (e.g., `double(1.0 / 0.0)` for a double-precision infinity). Note: Standad IEEE 754 half-precision doesn't provide an encoding for infinite or not-a-number values, so it might be considered an error if we emit `half(1.0 / 0.0)` but there really isn't a significantly better alternative for us to emit. * fixup
Diffstat (limited to 'tests/language-feature')
-rw-r--r--tests/language-feature/initializer-lists/default-init-16bit-types.slang35
-rw-r--r--tests/language-feature/initializer-lists/default-init-16bit-types.slang.expected.txt4
2 files changed, 39 insertions, 0 deletions
diff --git a/tests/language-feature/initializer-lists/default-init-16bit-types.slang b/tests/language-feature/initializer-lists/default-init-16bit-types.slang
new file mode 100644
index 000000000..5fb578ca4
--- /dev/null
+++ b/tests/language-feature/initializer-lists/default-init-16bit-types.slang
@@ -0,0 +1,35 @@
+// simple-namespace.slang
+
+//TEST(compute):COMPARE_COMPUTE:-vk
+
+// Test that default initialization works with 16-bit types under Vulkan.
+
+struct S
+{
+ int a;
+ int16_t b;
+ float16_t c;
+ int d;
+}
+
+int test(int val)
+{
+ S s = {};
+ s.a += val;
+ s.b += int16_t(val*16);
+ s.c += float16_t(val*16*16);
+ s.d += val*16*16*16;
+ return s.a + s.b + int(s.c) + s.d;
+}
+
+//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name=outputBuffer
+RWStructuredBuffer<int> outputBuffer;
+
+[numthreads(4, 1, 1)]
+void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID)
+{
+ uint tid = dispatchThreadID.x;
+ int inVal = tid;
+ int outVal = test(inVal);
+ outputBuffer[tid] = outVal;
+}
diff --git a/tests/language-feature/initializer-lists/default-init-16bit-types.slang.expected.txt b/tests/language-feature/initializer-lists/default-init-16bit-types.slang.expected.txt
new file mode 100644
index 000000000..6dbd5c939
--- /dev/null
+++ b/tests/language-feature/initializer-lists/default-init-16bit-types.slang.expected.txt
@@ -0,0 +1,4 @@
+0
+1111
+2222
+3333