diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp index f4e0fdbc..ae5f24d3 100644 --- a/SPIRV/GlslangToSpv.cpp +++ b/SPIRV/GlslangToSpv.cpp @@ -6401,7 +6401,7 @@ spv::Id TGlslangToSpvTraverser::createAtomicOperation(glslang::TOperator op, spv scopeId = builder.makeUintConstant(spv::ScopeDevice); } // semantics default to relaxed - spv::Id semanticsId = builder.makeUintConstant(lvalueCoherentFlags.isVolatile() ? + spv::Id semanticsId = builder.makeUintConstant(lvalueCoherentFlags.isVolatile() && glslangIntermediate->usingVulkanMemoryModel() ? spv::MemorySemanticsVolatileMask : spv::MemorySemanticsMaskNone); spv::Id semanticsId2 = semanticsId; diff --git a/Test/baseResults/spv.volatileAtomic.comp.out b/Test/baseResults/spv.volatileAtomic.comp.out new file mode 100644 index 00000000..aa2d211a --- /dev/null +++ b/Test/baseResults/spv.volatileAtomic.comp.out @@ -0,0 +1,40 @@ +spv.volatileAtomic.comp +// Module Version 10000 +// Generated by (magic number): 80007 +// Id's are bound by 18 + + Capability Shader + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint GLCompute 4 "main" + ExecutionMode 4 LocalSize 1 1 1 + Source GLSL 450 + Name 4 "main" + Name 8 "D" + MemberName 8(D) 0 "d" + Name 10 "d" + Decorate 7 ArrayStride 4 + MemberDecorate 8(D) 0 Volatile + MemberDecorate 8(D) 0 Coherent + MemberDecorate 8(D) 0 Offset 0 + Decorate 8(D) BufferBlock + Decorate 10(d) DescriptorSet 0 + Decorate 10(d) Binding 3 + 2: TypeVoid + 3: TypeFunction 2 + 6: TypeInt 32 0 + 7: TypeRuntimeArray 6(int) + 8(D): TypeStruct 7 + 9: TypePointer Uniform 8(D) + 10(d): 9(ptr) Variable Uniform + 11: TypeInt 32 1 + 12: 11(int) Constant 0 + 13: TypePointer Uniform 6(int) + 15: 6(int) Constant 0 + 16: 6(int) Constant 1 + 4(main): 2 Function None 3 + 5: Label + 14: 13(ptr) AccessChain 10(d) 12 12 + 17: 6(int) AtomicExchange 14 16 15 15 + Return + FunctionEnd diff --git a/Test/spv.volatileAtomic.comp b/Test/spv.volatileAtomic.comp new file mode 100644 index 00000000..2b7e6c62 --- /dev/null +++ b/Test/spv.volatileAtomic.comp @@ -0,0 +1,8 @@ +#version 450 core + +layout(set=0, binding=3) volatile buffer D { uint d[]; } d; + +void main() +{ + atomicExchange(d.d[0], 0); +} diff --git a/gtests/Spv.FromFile.cpp b/gtests/Spv.FromFile.cpp index d0c07515..96203416 100644 --- a/gtests/Spv.FromFile.cpp +++ b/gtests/Spv.FromFile.cpp @@ -404,6 +404,7 @@ INSTANTIATE_TEST_CASE_P( "spv.storageBuffer.vert", "spv.precise.tese", "spv.precise.tesc", + "spv.volatileAtomic.comp", "spv.vulkan100.subgroupArithmetic.comp", "spv.vulkan100.subgroupPartitioned.comp", "spv.xfb.vert",