summaryrefslogtreecommitdiffstats
path: root/tests/glsl
diff options
context:
space:
mode:
Diffstat (limited to 'tests/glsl')
-rw-r--r--tests/glsl/ssboMemberMemoryQualifier.slang54
-rw-r--r--tests/glsl/ssboMemberMemoryQualifierReadError.slang17
-rw-r--r--tests/glsl/ssboMemberMemoryQualifierWriteError.slang24
-rw-r--r--tests/glsl/ssboMemoryQualifier.slang39
-rw-r--r--tests/glsl/ssboMemoryQualifierReadError.slang27
-rw-r--r--tests/glsl/ssboMemoryQualifierWriteError.slang29
-rw-r--r--tests/glsl/ssboStructInsideStructMemoryQualifierError.slang23
7 files changed, 213 insertions, 0 deletions
diff --git a/tests/glsl/ssboMemberMemoryQualifier.slang b/tests/glsl/ssboMemberMemoryQualifier.slang
new file mode 100644
index 000000000..78d029039
--- /dev/null
+++ b/tests/glsl/ssboMemberMemoryQualifier.slang
@@ -0,0 +1,54 @@
+//TEST:SIMPLE(filecheck=CHECK-GLSL): -stage compute -entry computeMain -allow-glsl -target glsl
+//TEST:SIMPLE(filecheck=CHECK-SPV): -stage compute -entry computeMain -allow-glsl -target spirv -emit-spirv-directly
+
+// due to implementation limitations (slang-check-expr.cpp, `void visitMemberExpr()`) we are unable to
+// implement and use .length with glsl vectors to test `readonly writeonly`
+//#define TEST_whenVectorLengthIsImplemented
+
+volatile buffer Block1
+{
+ restrict uint data1;
+ readonly uint data2;
+ readonly writeonly uint data3;
+ writeonly uint data4;
+ coherent uint data5;
+ volatile uint data6;
+} inputBuffer1;
+
+coherent buffer Block2 {
+ readonly vec4 member1;
+ vec4 member2;
+}inputBuffer2;
+
+buffer Block3 {
+ coherent readonly vec4 member1;
+ coherent vec4 member2;
+}inputBuffer3;
+
+buffer Block4 {
+ struct structTmp
+ {
+ int val;
+ };
+ readonly structTmp myStruct;
+ coherent readonly vec4 member1;
+ coherent vec4 member2;
+ readonly writeonly vec3 member3;
+}inputBuffer4;
+
+// CHECK-GLSL: main
+// CHECK-SPV: OpEntryPoint
+layout(local_size_x = 1) in;
+void computeMain()
+{
+ int v = inputBuffer1.data1;
+ v = inputBuffer1.data2;
+ inputBuffer1.data4 = 1;
+ inputBuffer1.data5 = 1;
+ inputBuffer1.data6 = 1;
+ inputBuffer2.member2 = inputBuffer2.member1;
+ inputBuffer3.member2 = inputBuffer3.member1;
+#ifdef TEST_whenVectorLengthIsImplemented
+ v = inputBuffer4.member3.length();
+#endif
+} \ No newline at end of file
diff --git a/tests/glsl/ssboMemberMemoryQualifierReadError.slang b/tests/glsl/ssboMemberMemoryQualifierReadError.slang
new file mode 100644
index 000000000..fe2ea1943
--- /dev/null
+++ b/tests/glsl/ssboMemberMemoryQualifierReadError.slang
@@ -0,0 +1,17 @@
+//TEST:SIMPLE(filecheck=CHECK): -stage compute -entry computeMain -allow-glsl -target glsl
+//TEST:SIMPLE(filecheck=CHECK): -stage compute -entry computeMain -allow-glsl -target spirv -emit-spirv-directly
+
+volatile buffer MyBlockName1
+{
+ readonly uint data2;
+ readonly writeonly uint data3;
+} inputBuffer1;
+
+layout(local_size_x = 1) in;
+void computeMain()
+{
+//CHECK: error 30011
+ inputBuffer1.data2 = 1;
+//CHECK: error 30011
+ inputBuffer1.data3 = 1;
+} \ No newline at end of file
diff --git a/tests/glsl/ssboMemberMemoryQualifierWriteError.slang b/tests/glsl/ssboMemberMemoryQualifierWriteError.slang
new file mode 100644
index 000000000..f4423be25
--- /dev/null
+++ b/tests/glsl/ssboMemberMemoryQualifierWriteError.slang
@@ -0,0 +1,24 @@
+//TEST:SIMPLE(filecheck=CHECK): -stage compute -entry computeMain -allow-glsl -target glsl
+//TEST:SIMPLE(filecheck=CHECK): -stage compute -entry computeMain -allow-glsl -target spirv -emit-spirv-directly
+
+volatile buffer MyBlockName1
+{
+ writeonly uint data2;
+ readonly writeonly uint data3;
+} inputBuffer1;
+
+buffer MyBlockName2
+{
+ uint data;
+} outputBuffer;
+
+layout(local_size_x = 1) in;
+void computeMain()
+{
+//CHECK: error 30101
+ int a = inputBuffer1.data2;
+//CHECK: error 30101
+ int b = inputBuffer1.data3;
+//CHECK: error 30101
+ outputBuffer.data = inputBuffer1.data2;
+} \ No newline at end of file
diff --git a/tests/glsl/ssboMemoryQualifier.slang b/tests/glsl/ssboMemoryQualifier.slang
new file mode 100644
index 000000000..67da12e9e
--- /dev/null
+++ b/tests/glsl/ssboMemoryQualifier.slang
@@ -0,0 +1,39 @@
+//TEST:SIMPLE(filecheck=CHECK-GLSL): -stage compute -entry computeMain -allow-glsl -target glsl
+//TEST:SIMPLE(filecheck=CHECK-SPV): -stage compute -entry computeMain -allow-glsl -target spirv -emit-spirv-directly
+
+volatile buffer MyBlockName1
+{
+ uint data1;
+} inputBuffer1;
+restrict buffer MyBlockName2
+{
+ uint data1;
+} inputBuffer2;
+readonly writeonly buffer MyBlockName3
+{
+ uint data1;
+} inputBuffer3;
+writeonly buffer MyBlockName4
+{
+ uint data1;
+} inputBuffer4;
+readonly buffer MyBlockName5
+{
+ uint data1;
+} inputBuffer5;
+coherent buffer MyBlockName6
+{
+ uint data1;
+} inputBuffer6;
+
+// CHECK-GLSL: main
+// CHECK-SPV: OpEntryPoint
+layout(local_size_x = 1) in;
+void computeMain()
+{
+ inputBuffer1.data1 = 1;
+ inputBuffer2.data1 = 1;
+ inputBuffer4.data1 = 1;
+ int v = inputBuffer5.data1;
+ inputBuffer6.data1 = 1;
+} \ No newline at end of file
diff --git a/tests/glsl/ssboMemoryQualifierReadError.slang b/tests/glsl/ssboMemoryQualifierReadError.slang
new file mode 100644
index 000000000..cdd47d5b2
--- /dev/null
+++ b/tests/glsl/ssboMemoryQualifierReadError.slang
@@ -0,0 +1,27 @@
+//TEST:SIMPLE(filecheck=CHECK): -stage compute -entry computeMain -allow-glsl -target glsl
+//TEST:SIMPLE(filecheck=CHECK): -stage compute -entry computeMain -allow-glsl -target spirv -emit-spirv-directly
+
+readonly writeonly buffer MyBlockName3
+{
+ uint data1;
+} inputBuffer1;
+
+readonly buffer MyBlockName5
+{
+ uint data1;
+} inputBuffer2;
+
+buffer dontOptimizeOutBlock
+{
+ uint data1;
+ uint data2;
+} optimizeBlock;
+
+layout(local_size_x = 1) in;
+void computeMain()
+{
+//CHECK: error 30011
+ inputBuffer1.data1 = optimizeBlock.data1;
+//CHECK: error 30011
+ inputBuffer2.data1 = optimizeBlock.data2;
+} \ No newline at end of file
diff --git a/tests/glsl/ssboMemoryQualifierWriteError.slang b/tests/glsl/ssboMemoryQualifierWriteError.slang
new file mode 100644
index 000000000..636641b3f
--- /dev/null
+++ b/tests/glsl/ssboMemoryQualifierWriteError.slang
@@ -0,0 +1,29 @@
+//TEST:SIMPLE(filecheck=CHECK): -stage compute -entry computeMain -allow-glsl -target glsl
+//TEST:SIMPLE(filecheck=CHECK): -stage compute -entry computeMain -allow-glsl -target spirv -emit-spirv-directly
+
+readonly writeonly buffer MyBlockName3
+{
+ uint data1;
+} inputBuffer1;
+
+writeonly buffer MyBlockName4
+{
+ uint data1;
+} inputBuffer2;
+
+buffer dontOptimizeOutBlock
+{
+ uint data1;
+ uint data2;
+} optimizeBlock;
+
+layout(local_size_x = 1) in;
+void computeMain()
+{
+//CHECK: error 30101
+ optimizeBlock.data1 = inputBuffer1.data1;
+//CHECK: error 30101
+ optimizeBlock.data2 = inputBuffer2.data1;
+//CHECK: error 30101
+ int a = inputBuffer2.data1;
+} \ No newline at end of file
diff --git a/tests/glsl/ssboStructInsideStructMemoryQualifierError.slang b/tests/glsl/ssboStructInsideStructMemoryQualifierError.slang
new file mode 100644
index 000000000..c5376b4a8
--- /dev/null
+++ b/tests/glsl/ssboStructInsideStructMemoryQualifierError.slang
@@ -0,0 +1,23 @@
+//TEST:SIMPLE(filecheck=CHECK-GLSL): -stage compute -entry computeMain -allow-glsl -target glsl
+//TEST:SIMPLE(filecheck=CHECK-SPV): -stage compute -entry computeMain -allow-glsl -target spirv -emit-spirv-directly
+
+// This code should error since memory qualifiers are only allowed inside:
+// Shader storage blocks, variables declared within shader storage blocks
+// and variables declared as image types. Named structs inside a Interface
+// block violates these rules
+// CHECK-GLSL: error
+// CHECK-SPV: error
+buffer Block4 {
+ struct StructTmp
+ {
+ readonly int val;
+ };
+ readonly structTmp myStruct;
+ coherent readonly vec4 member1;
+ coherent vec4 member2;
+}inputBuffer4;
+
+layout(local_size_x = 1) in;
+void computeMain()
+{
+} \ No newline at end of file