Pass correct proxy type for atomicStore
authorGreg Fischer <greg@lunarg.com>
Mon, 8 Mar 2021 21:02:06 +0000 (14:02 -0700)
committerGreg Fischer <greg@lunarg.com>
Mon, 8 Mar 2021 21:19:31 +0000 (14:19 -0700)
Fixes #2564

SPIRV/GlslangToSpv.cpp
Test/baseResults/spv.atomicStoreInt64.comp.out [new file with mode: 0644]
Test/spv.atomicStoreInt64.comp [new file with mode: 0644]
gtests/Spv.FromFile.cpp

index 8a1b30d..8eb06b7 100644 (file)
@@ -3164,7 +3164,9 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt
 #endif
     if (atomic) {
         // Handle all atomics
-        result = createAtomicOperation(node->getOp(), precision, resultType(), operands, node->getBasicType(),
+        glslang::TBasicType typeProxy = (node->getOp() == glslang::EOpAtomicStore)
+            ? node->getSequence()[0]->getAsTyped()->getBasicType() : node->getBasicType();
+        result = createAtomicOperation(node->getOp(), precision, resultType(), operands, typeProxy,
             lvalueCoherentFlags);
     } else if (node->getOp() == glslang::EOpDebugPrintf) {
         if (!nonSemanticDebugPrintf) {
diff --git a/Test/baseResults/spv.atomicStoreInt64.comp.out b/Test/baseResults/spv.atomicStoreInt64.comp.out
new file mode 100644 (file)
index 0000000..3adadcb
--- /dev/null
@@ -0,0 +1,57 @@
+spv.atomicStoreInt64.comp
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 25
+
+                              Capability Shader
+                              Capability Int64
+                              Capability Int64Atomics
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint GLCompute 4  "main"
+                              ExecutionMode 4 LocalSize 1 1 1
+                              Source GLSL 450
+                              SourceExtension  "GL_EXT_shader_atomic_int64"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_int64"
+                              SourceExtension  "GL_KHR_memory_scope_semantics"
+                              Name 4  "main"
+                              Name 7  "ssbo"
+                              MemberName 7(ssbo) 0  "y"
+                              Name 9  ""
+                              Name 14  "ubo"
+                              MemberName 14(ubo) 0  "z"
+                              Name 16  ""
+                              MemberDecorate 7(ssbo) 0 Offset 0
+                              Decorate 7(ssbo) BufferBlock
+                              Decorate 9 DescriptorSet 0
+                              Decorate 9 Binding 0
+                              MemberDecorate 14(ubo) 0 Offset 0
+                              Decorate 14(ubo) Block
+                              Decorate 16 DescriptorSet 0
+                              Decorate 16 Binding 1
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 64 0
+         7(ssbo):             TypeStruct 6(int64_t)
+               8:             TypePointer Uniform 7(ssbo)
+               9:      8(ptr) Variable Uniform
+              10:             TypeInt 32 1
+              11:     10(int) Constant 0
+              12:             TypePointer Uniform 6(int64_t)
+         14(ubo):             TypeStruct 6(int64_t)
+              15:             TypePointer Uniform 14(ubo)
+              16:     15(ptr) Variable Uniform
+              19:     10(int) Constant 1
+              20:     10(int) Constant 64
+              21:             TypeInt 32 0
+              22:     21(int) Constant 1
+              23:     21(int) Constant 0
+              24:     21(int) Constant 64
+         4(main):           2 Function None 3
+               5:             Label
+              13:     12(ptr) AccessChain 9 11
+              17:     12(ptr) AccessChain 16 11
+              18:  6(int64_t) Load 17
+                              AtomicStore 13 19 24 18
+                              Return
+                              FunctionEnd
diff --git a/Test/spv.atomicStoreInt64.comp b/Test/spv.atomicStoreInt64.comp
new file mode 100644 (file)
index 0000000..879c37a
--- /dev/null
@@ -0,0 +1,11 @@
+#version 450
+#extension GL_EXT_shader_explicit_arithmetic_types_int64 : enable
+#extension GL_EXT_shader_atomic_int64 : enable
+#extension GL_KHR_memory_scope_semantics : enable
+
+layout(set = 0, binding = 0) buffer ssbo { uint64_t y; };
+layout(set = 0, binding = 1) uniform ubo { uint64_t z; };
+
+void main() {
+    atomicStore(y, z, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelaxed);
+}
index e2a837d..5456fb8 100644 (file)
@@ -714,6 +714,7 @@ INSTANTIATE_TEST_SUITE_P(
     "spv.multiviewPerViewAttributes.vert",
     "spv.multiviewPerViewAttributes.tesc",
     "spv.atomicInt64.comp",
+    "spv.atomicStoreInt64.comp",
     "spv.shadingRate.frag",
     "spv.RayGenShader.rgen",
     "spv.RayGenShaderArray.rgen",