summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-emit-spirv.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/slang/slang-emit-spirv.cpp')
-rw-r--r--source/slang/slang-emit-spirv.cpp24
1 files changed, 18 insertions, 6 deletions
diff --git a/source/slang/slang-emit-spirv.cpp b/source/slang/slang-emit-spirv.cpp
index 2127141bd..5036333c1 100644
--- a/source/slang/slang-emit-spirv.cpp
+++ b/source/slang/slang-emit-spirv.cpp
@@ -1844,7 +1844,8 @@ struct SPIRVEmitContext : public SourceEmitterBase, public SPIRVEmitSharedContex
(IRPtrTypeBase*)inst))
emitOpTypeForwardPointer(resultSpvType, storageClass);
}
- if (storageClass == SpvStorageClassPhysicalStorageBuffer)
+ if (storageClass == SpvStorageClassPhysicalStorageBuffer ||
+ storageClass == SpvStorageClassStorageBuffer)
{
if (m_decoratedSpvInsts.add(getID(resultSpvType)))
{
@@ -3271,6 +3272,7 @@ struct SPIRVEmitContext : public SourceEmitterBase, public SPIRVEmitSharedContex
builder.getPtrType(
kIROp_PtrType,
spvAsmBuiltinVar->getDataType(),
+ AccessQualifier::ReadWrite,
AddressSpace::BuiltinInput),
kind,
spvAsmBuiltinVar);
@@ -3868,20 +3870,24 @@ struct SPIRVEmitContext : public SourceEmitterBase, public SPIRVEmitSharedContex
return spvDebugLocalVar;
}
- bool isLegalType(IRInst* type)
+ // Returns true if the given type is allowed to emit for a `DebugVar`.
+ // Other types may not be illegal, but Slang currently does not support
+ // emitting these other DebugVar types.
+ bool isAllowedDebugVarType(IRInst* type)
{
switch (type->getOp())
{
case kIROp_UnsizedArrayType:
return false;
case kIROp_ArrayType:
- return isLegalType(as<IRArrayType>(type)->getElementType());
+ return isAllowedDebugVarType(as<IRArrayType>(type)->getElementType());
case kIROp_VectorType:
case kIROp_StructType:
case kIROp_MatrixType:
return true;
case kIROp_PtrType:
- return as<IRPtrTypeBase>(type)->getAddressSpace() == AddressSpace::UserPointer;
+ return as<IRPtrTypeBase>(type)->getAddressSpace() == AddressSpace::UserPointer ||
+ as<IRPtrTypeBase>(type)->getAddressSpace() == AddressSpace::GroupShared;
default:
if (as<IRBasicType>(type))
return true;
@@ -3899,7 +3905,7 @@ struct SPIRVEmitContext : public SourceEmitterBase, public SPIRVEmitSharedContex
builder.setInsertBefore(debugVar);
auto varType = tryGetPointedToType(&builder, debugVar->getDataType());
- if (!isLegalType(varType))
+ if (!isAllowedDebugVarType(varType))
return nullptr;
IRSizeAndAlignment sizeAlignment;
@@ -9473,10 +9479,16 @@ struct SPIRVEmitContext : public SourceEmitterBase, public SPIRVEmitSharedContex
{
if (auto ptrType = as<IRPtrTypeBase>(type))
{
- if (ptrType->getAddressSpace() == AddressSpace::StorageBuffer)
+ switch (ptrType->getAddressSpace())
{
+ case AddressSpace::StorageBuffer:
+ ensureExtensionDeclaration(UnownedStringSlice("SPV_KHR_variable_pointers"));
+ requireSPIRVCapability(SpvCapabilityVariablePointersStorageBuffer);
+ break;
+ case AddressSpace::GroupShared:
ensureExtensionDeclaration(UnownedStringSlice("SPV_KHR_variable_pointers"));
requireSPIRVCapability(SpvCapabilityVariablePointers);
+ break;
}
}
}