From bfd84a39f2271940e04a081383d07c169b33d51f Mon Sep 17 00:00:00 2001 From: Jeff Bolz Date: Wed, 27 Jan 2021 13:14:34 -0600 Subject: [PATCH] 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. --- SPIRV/GlslangToSpv.cpp | 4 ++ SPIRV/SpvPostProcess.cpp | 7 +++ .../baseResults/spv.queueFamilyScope.comp.out | 43 +++++++++++++++++++ Test/spv.queueFamilyScope.comp | 10 +++++ gtests/Spv.FromFile.cpp | 1 + 5 files changed, 65 insertions(+) create mode 100644 Test/baseResults/spv.queueFamilyScope.comp.out create mode 100644 Test/spv.queueFamilyScope.comp diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp index 8e063f8f..49baf978 100644 --- a/SPIRV/GlslangToSpv.cpp +++ b/SPIRV/GlslangToSpv.cpp @@ -6996,6 +6996,10 @@ spv::Id TGlslangToSpvTraverser::createAtomicOperation(glslang::TOperator op, spv builder.addCapability(spv::CapabilityVulkanMemoryModelKHR); } + if (builder.getConstantScalar(scopeId) == spv::ScopeQueueFamily) { + builder.addCapability(spv::CapabilityVulkanMemoryModelKHR); + } + if (glslangIntermediate->usingVulkanMemoryModel() && builder.getConstantScalar(scopeId) == spv::ScopeDevice) { builder.addCapability(spv::CapabilityVulkanMemoryModelDeviceScopeKHR); } diff --git a/SPIRV/SpvPostProcess.cpp b/SPIRV/SpvPostProcess.cpp index d40174d1..36d568f0 100644 --- a/SPIRV/SpvPostProcess.cpp +++ b/SPIRV/SpvPostProcess.cpp @@ -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 diff --git a/Test/baseResults/spv.queueFamilyScope.comp.out b/Test/baseResults/spv.queueFamilyScope.comp.out new file mode 100644 index 00000000..9c239df2 --- /dev/null +++ b/Test/baseResults/spv.queueFamilyScope.comp.out @@ -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 diff --git a/Test/spv.queueFamilyScope.comp b/Test/spv.queueFamilyScope.comp new file mode 100644 index 00000000..0d798508 --- /dev/null +++ b/Test/spv.queueFamilyScope.comp @@ -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); +} + diff --git a/gtests/Spv.FromFile.cpp b/gtests/Spv.FromFile.cpp index 81af5af6..83aac827 100644 --- a/gtests/Spv.FromFile.cpp +++ b/gtests/Spv.FromFile.cpp @@ -503,6 +503,7 @@ INSTANTIATE_TEST_SUITE_P( "spv.memoryScopeSemantics.comp", "spv.memoryScopeSemantics_Error.comp", "spv.multiView.frag", + "spv.queueFamilyScope.comp", "spv.RayGenShader11.rgen", "spv.subgroup.frag", "spv.subgroup.geom",