From b5c8fd4fcff9667c2a40c53f085f2a868287f114 Mon Sep 17 00:00:00 2001 From: Greg Fischer Date: Mon, 8 Mar 2021 14:02:06 -0700 Subject: [PATCH] Pass correct proxy type for atomicStore Fixes #2564 --- SPIRV/GlslangToSpv.cpp | 4 +- .../baseResults/spv.atomicStoreInt64.comp.out | 57 +++++++++++++++++++ Test/spv.atomicStoreInt64.comp | 11 ++++ gtests/Spv.FromFile.cpp | 1 + 4 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 Test/baseResults/spv.atomicStoreInt64.comp.out create mode 100644 Test/spv.atomicStoreInt64.comp diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp index 8a1b30d77..8eb06b7cd 100644 --- a/SPIRV/GlslangToSpv.cpp +++ b/SPIRV/GlslangToSpv.cpp @@ -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 index 000000000..3adadcb28 --- /dev/null +++ b/Test/baseResults/spv.atomicStoreInt64.comp.out @@ -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 index 000000000..879c37a87 --- /dev/null +++ b/Test/spv.atomicStoreInt64.comp @@ -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); +} diff --git a/gtests/Spv.FromFile.cpp b/gtests/Spv.FromFile.cpp index e2a837db0..5456fb893 100644 --- a/gtests/Spv.FromFile.cpp +++ b/gtests/Spv.FromFile.cpp @@ -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",