Add missing capability when QueueFamily scope is used

Also, if this capability is added and the memory model is not
otherwise enabled by pragma, enable it as part of postprocessing.
This commit is contained in:
Jeff Bolz 2021-01-27 13:14:34 -06:00
parent 36df92e4a0
commit bfd84a39f2
5 changed files with 65 additions and 0 deletions

View File

@ -6996,6 +6996,10 @@ spv::Id TGlslangToSpvTraverser::createAtomicOperation(glslang::TOperator op, spv
builder.addCapability(spv::CapabilityVulkanMemoryModelKHR); builder.addCapability(spv::CapabilityVulkanMemoryModelKHR);
} }
if (builder.getConstantScalar(scopeId) == spv::ScopeQueueFamily) {
builder.addCapability(spv::CapabilityVulkanMemoryModelKHR);
}
if (glslangIntermediate->usingVulkanMemoryModel() && builder.getConstantScalar(scopeId) == spv::ScopeDevice) { if (glslangIntermediate->usingVulkanMemoryModel() && builder.getConstantScalar(scopeId) == spv::ScopeDevice) {
builder.addCapability(spv::CapabilityVulkanMemoryModelDeviceScopeKHR); builder.addCapability(spv::CapabilityVulkanMemoryModelDeviceScopeKHR);
} }

View File

@ -436,6 +436,13 @@ void Builder::postProcessFeatures() {
} }
} }
} }
// If any Vulkan memory model-specific functionality is used, update the
// OpMemoryModel to match.
if (capabilities.find(spv::CapabilityVulkanMemoryModelKHR) != capabilities.end()) {
memoryModel = spv::MemoryModelVulkanKHR;
addIncorporatedExtension(spv::E_SPV_KHR_vulkan_memory_model, spv::Spv_1_5);
}
} }
#endif #endif

View File

@ -0,0 +1,43 @@
spv.queueFamilyScope.comp
// Module Version 10300
// Generated by (magic number): 8000a
// Id's are bound by 21
Capability Shader
Capability VulkanMemoryModelKHR
Extension "SPV_KHR_vulkan_memory_model"
1: ExtInstImport "GLSL.std.450"
MemoryModel Logical VulkanKHR
EntryPoint GLCompute 4 "main"
ExecutionMode 4 LocalSize 1 1 1
Source GLSL 450
SourceExtension "GL_KHR_memory_scope_semantics"
Name 4 "main"
Name 7 "Buffer"
MemberName 7(Buffer) 0 "a"
Name 9 "A"
MemberDecorate 7(Buffer) 0 Offset 0
Decorate 7(Buffer) Block
Decorate 9(A) DescriptorSet 0
Decorate 9(A) Binding 0
2: TypeVoid
3: TypeFunction 2
6: TypeInt 32 0
7(Buffer): TypeStruct 6(int)
8: TypePointer StorageBuffer 7(Buffer)
9(A): 8(ptr) Variable StorageBuffer
10: TypeInt 32 1
11: 10(int) Constant 0
12: TypePointer StorageBuffer 6(int)
14: 10(int) Constant 5
15: 10(int) Constant 64
16: 10(int) Constant 2
17: 6(int) Constant 1
18: 6(int) Constant 0
19: 6(int) Constant 66
4(main): 2 Function None 3
5: Label
13: 12(ptr) AccessChain 9(A) 11
20: 6(int) AtomicLoad 13 14 19
Return
FunctionEnd

View File

@ -0,0 +1,10 @@
#version 450
#extension GL_KHR_memory_scope_semantics : require
layout (binding = 0) buffer Buffer { uint a; } A;
void main()
{
atomicLoad(A.a, gl_ScopeQueueFamily, gl_StorageSemanticsBuffer, gl_SemanticsAcquire);
}

View File

@ -503,6 +503,7 @@ INSTANTIATE_TEST_SUITE_P(
"spv.memoryScopeSemantics.comp", "spv.memoryScopeSemantics.comp",
"spv.memoryScopeSemantics_Error.comp", "spv.memoryScopeSemantics_Error.comp",
"spv.multiView.frag", "spv.multiView.frag",
"spv.queueFamilyScope.comp",
"spv.RayGenShader11.rgen", "spv.RayGenShader11.rgen",
"spv.subgroup.frag", "spv.subgroup.frag",
"spv.subgroup.geom", "spv.subgroup.geom",