From 155e0804edbc9e7175cb0a6ed60d3daff0ba5e01 Mon Sep 17 00:00:00 2001 From: Darren Wihandi <65404740+fairywreath@users.noreply.github.com> Date: Wed, 19 Mar 2025 16:26:26 -0400 Subject: Add SPIRV atomic debug type (#6616) Co-authored-by: Ellie Hermaszewska --- source/slang/slang-emit-spirv-ops-debug-info-ext.h | 22 ++++++++++++++++++++++ source/slang/slang-emit-spirv.cpp | 14 ++++++++++++++ 2 files changed, 36 insertions(+) (limited to 'source/slang') diff --git a/source/slang/slang-emit-spirv-ops-debug-info-ext.h b/source/slang/slang-emit-spirv-ops-debug-info-ext.h index 5f1e8c1ec..41c6e1faa 100644 --- a/source/slang/slang-emit-spirv-ops-debug-info-ext.h +++ b/source/slang/slang-emit-spirv-ops-debug-info-ext.h @@ -400,6 +400,28 @@ SpvInst* emitOpDebugTypePointer( flags); } +template +SpvInst* emitOpDebugTypeQualifier( + SpvInstParent* parent, + IRInst* inst, + const T& idResultType, + SpvInst* set, + SpvInst* baseType, + IRInst* typeQualifier) +{ + static_assert(isSingular); + return emitInst( + parent, + inst, + SpvOpExtInst, + idResultType, + kResultID, + set, + SpvWord(4), + baseType, + typeQualifier); +} + template SpvInst* emitOpDebugScope( SpvInstParent* parent, diff --git a/source/slang/slang-emit-spirv.cpp b/source/slang/slang-emit-spirv.cpp index d43af8ac2..758e1ca7e 100644 --- a/source/slang/slang-emit-spirv.cpp +++ b/source/slang/slang-emit-spirv.cpp @@ -7440,6 +7440,7 @@ struct SPIRVEmitContext : public SourceEmitterBase, public SPIRVEmitSharedContex HashSet m_emittingTypes; // Types that are being emitted. Dictionary m_mapForwardRefsToDebugType; static constexpr const int kUnknownPhysicalLayout = 1 << 17; + static constexpr const int kDebugTypeAtomicQualifier = 3; SpvInst* emitDebugTypeImpl(IRType* type) { @@ -7692,6 +7693,19 @@ struct SPIRVEmitContext : public SourceEmitterBase, public SPIRVEmitSharedContex builder.getIntValue(builder.getUIntType(), storageClass), builder.getIntValue(builder.getUIntType(), kUnknownPhysicalLayout)); } + else if (auto atomicType = as(type)) + { + auto baseType = atomicType->getElementType(); + auto debugBaseType = emitDebugType(baseType); + + return emitOpDebugTypeQualifier( + getSection(SpvLogicalSectionID::ConstantsAndTypes), + nullptr, + m_voidType, + getNonSemanticDebugInfoExtInst(), + debugBaseType, + builder.getIntValue(builder.getUIntType(), kDebugTypeAtomicQualifier)); + } return ensureInst(m_voidType); } -- cgit v1.2.3