From febbeb140bea65180ff4be9b164207c582235d4d Mon Sep 17 00:00:00 2001 From: Jay Kwak <82421531+jkwak-work@users.noreply.github.com> Date: Thu, 30 May 2024 16:47:39 -0700 Subject: Support SPIR-V DebugTypePointer (#4228) --- source/slang/slang-emit-spirv-ops-debug-info-ext.h | 7 ++++++ source/slang/slang-emit-spirv.cpp | 28 ++++++++++++++++++---- source/slang/slang-ir-util.cpp | 2 +- 3 files changed, 32 insertions(+), 5 deletions(-) (limited to 'source') 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 a48a9eb04..0969b65a4 100644 --- a/source/slang/slang-emit-spirv-ops-debug-info-ext.h +++ b/source/slang/slang-emit-spirv-ops-debug-info-ext.h @@ -105,6 +105,13 @@ SpvInst* emitOpDebugTypeMatrix(SpvInstParent* parent, IRInst* inst, const T& idR return emitInst(parent, inst, SpvOpExtInst, idResultType, kResultID, set, SpvWord(108), vectorType, vectorCount, columnMajor); } +template +SpvInst* emitOpDebugTypePointer(SpvInstParent* parent, IRInst* inst, const T& idResultType, SpvInst* set, SpvInst* baseType, IRInst* storageClass, IRInst* flags) +{ + static_assert(isSingular); + return emitInst(parent, inst, SpvOpExtInst, idResultType, kResultID, set, SpvWord(3), baseType, storageClass, flags); +} + template SpvInst* emitOpDebugScope(SpvInstParent* parent, IRInst* inst, const T& idResultType, SpvInst* set, SpvInst* scope) { diff --git a/source/slang/slang-emit-spirv.cpp b/source/slang/slang-emit-spirv.cpp index 8acc1505b..9ad8513fc 100644 --- a/source/slang/slang-emit-spirv.cpp +++ b/source/slang/slang-emit-spirv.cpp @@ -5700,16 +5700,36 @@ struct SPIRVEmitContext builder.getIntValue(builder.getUIntType(), spvEncoding), builder.getIntValue(builder.getUIntType(), kUnknownPhysicalLayout)); } - else if (as(type)) + else if (auto ptrType = as(type)) { - StringBuilder sbName; - getTypeNameHint(sbName, basicType); + IRType* baseType = ptrType->getValueType(); + if (as(baseType)) + { + // If the base type of the pointer is basic types, + // emit the basic types and emit DebugTypePointer with it. + SpvInst* debugBaseType = emitDebugType(baseType); + SpvStorageClass storageClass = SpvStorageClassFunction; + if (ptrType->hasAddressSpace()) + storageClass = (SpvStorageClass)ptrType->getAddressSpace(); + + return emitOpDebugTypePointer( + getSection(SpvLogicalSectionID::ConstantsAndTypes), + nullptr, + m_voidType, + getNonSemanticDebugInfoExtInst(), + debugBaseType, + builder.getIntValue(builder.getUIntType(), storageClass), + builder.getIntValue(builder.getUIntType(), kUnknownPhysicalLayout)); + } + + // If the base type of the pointer is more complex, + // emit the pointer as "uintptr" of DebugTypeBasic. return emitOpDebugTypeBasic( getSection(SpvLogicalSectionID::ConstantsAndTypes), nullptr, m_voidType, getNonSemanticDebugInfoExtInst(), - builder.getStringValue(sbName.getUnownedSlice()), + builder.getStringValue(String("uint64").getUnownedSlice()), builder.getIntValue(builder.getUIntType(), 64), builder.getIntValue(builder.getUIntType(), 0), builder.getIntValue(builder.getUIntType(), kUnknownPhysicalLayout)); diff --git a/source/slang/slang-ir-util.cpp b/source/slang/slang-ir-util.cpp index 967db3aff..40d169c48 100644 --- a/source/slang/slang-ir-util.cpp +++ b/source/slang/slang-ir-util.cpp @@ -227,10 +227,10 @@ bool isSimpleDataType(IRType* type) case kIROp_MatrixType: case kIROp_InterfaceType: case kIROp_AnyValueType: + case kIROp_PtrType: return true; case kIROp_ArrayType: case kIROp_UnsizedArrayType: - case kIROp_PtrType: return isSimpleDataType((IRType*)type->getOperand(0)); default: return false; -- cgit v1.2.3