Only apply volatile semantics to atomics when using Vulkan Memory Model

This commit is contained in:
Jeff Bolz 2019-10-17 11:22:57 -05:00
parent a959deb007
commit 016ddee83a
4 changed files with 50 additions and 1 deletions

View File

@ -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;

View File

@ -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

View File

@ -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);
}

View File

@ -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",