summaryrefslogtreecommitdiff
path: root/source/slang/slang-emit-metal.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2024-04-18 23:01:45 -0700
committerGitHub <noreply@github.com>2024-04-18 23:01:45 -0700
commita3a5e7ea4e2ec15dd385c169578f5770f49b6e1c (patch)
tree3c7a75a3ca0f8c38f5f92871629947b812865234 /source/slang/slang-emit-metal.cpp
parenta2b9e376b2d54283000a0fe0c48e6e1912d8a333 (diff)
Metal: rewrite global variables as explicit context. (#3981)
* Metal: rewrite global variables as explicit context. * Small tweaks.
Diffstat (limited to 'source/slang/slang-emit-metal.cpp')
-rw-r--r--source/slang/slang-emit-metal.cpp88
1 files changed, 78 insertions, 10 deletions
diff --git a/source/slang/slang-emit-metal.cpp b/source/slang/slang-emit-metal.cpp
index 1ce25a2da..17d074e75 100644
--- a/source/slang/slang-emit-metal.cpp
+++ b/source/slang/slang-emit-metal.cpp
@@ -100,7 +100,7 @@ void MetalSourceEmitter::_emitHLSLTextureType(IRTextureTypeBase* texType)
case SLANG_TEXTURE_2D: m_writer->emit("2d"); break;
case SLANG_TEXTURE_3D: m_writer->emit("3d"); break;
case SLANG_TEXTURE_CUBE: m_writer->emit("cube"); break;
- case SLANG_TEXTURE_BUFFER: m_writer->emit("1d"); break;
+ case SLANG_TEXTURE_BUFFER: m_writer->emit("_buffer"); break;
default:
SLANG_DIAGNOSE_UNEXPECTED(getSink(), SourceLoc(), "unhandled resource shape");
break;
@@ -274,7 +274,39 @@ bool MetalSourceEmitter::tryEmitInstExprImpl(IRInst* inst, const EmitOpInfo& inO
return true;
}
break;
-
+ case kIROp_RWStructuredBufferGetElementPtr:
+ {
+ EmitOpInfo outerPrec = inOuterPrec;
+ bool needClose = false;
+
+ auto prec = getInfo(EmitOp::Add);
+ needClose = maybeEmitParens(outerPrec, prec);
+ emitOperand(inst->getOperand(0), leftSide(outerPrec, prec));
+ m_writer->emit("+");
+ emitOperand(inst->getOperand(1), rightSide(prec, outerPrec));
+ maybeCloseParens(needClose);
+ return true;
+ }
+ case kIROp_StructuredBufferLoad:
+ case kIROp_RWStructuredBufferLoad:
+ {
+ auto prec = getInfo(EmitOp::Postfix);
+ emitOperand(inst->getOperand(0), leftSide(inOuterPrec, prec));
+ m_writer->emit("[");
+ emitOperand(inst->getOperand(1), getInfo(EmitOp::General));
+ m_writer->emit("]");
+ return true;
+ }
+ case kIROp_RWStructuredBufferStore:
+ {
+ auto prec = getInfo(EmitOp::Postfix);
+ emitOperand(inst->getOperand(0), leftSide(inOuterPrec, prec));
+ m_writer->emit("[");
+ emitOperand(inst->getOperand(1), getInfo(EmitOp::General));
+ m_writer->emit("] = ");
+ emitOperand(inst->getOperand(2), getInfo(EmitOp::General));
+ return true;
+ }
default: break;
}
// Not handled
@@ -479,12 +511,47 @@ void MetalSourceEmitter::emitSimpleTypeImpl(IRType* type)
case kIROp_ParameterBlockType:
case kIROp_ConstantBufferType:
{
- m_writer->emit("constant ");
emitType((IRType*)type->getOperand(0));
+ m_writer->emit(" constant*");
+ return;
+ }
+ case kIROp_PtrType:
+ case kIROp_InOutType:
+ case kIROp_OutType:
+ case kIROp_RefType:
+ case kIROp_ConstRefType:
+ {
+ auto ptrType = cast<IRPtrTypeBase>(type);
+ emitType((IRType*)ptrType->getValueType());
+ switch ((AddressSpace)ptrType->getAddressSpace())
+ {
+ case AddressSpace::Global:
+ m_writer->emit(" device");
+ break;
+ case AddressSpace::Uniform:
+ m_writer->emit(" constant");
+ break;
+ case AddressSpace::ThreadLocal:
+ m_writer->emit(" thread");
+ break;
+ case AddressSpace::GroupShared:
+ m_writer->emit(" threadgroup");
+ break;
+ }
m_writer->emit("*");
return;
}
- default: break;
+ case kIROp_ArrayType:
+ {
+ m_writer->emit("array<");
+ emitType((IRType*)type->getOperand(0));
+ m_writer->emit(", ");
+ emitVal(type->getOperand(1), getInfo(EmitOp::General));
+ m_writer->emit(">");
+ return;
+ }
+ default:
+ break;
}
if (auto texType = as<IRTextureType>(type))
@@ -499,9 +566,8 @@ void MetalSourceEmitter::emitSimpleTypeImpl(IRType* type)
}
else if (auto structuredBufferType = as<IRHLSLStructuredBufferTypeBase>(type))
{
- m_writer->emit("device ");
emitType(structuredBufferType->getElementType());
- m_writer->emit("*");
+ m_writer->emit(" device*");
return;
}
else if (const auto untypedBufferType = as<IRUntypedBufferResourceType>(type))
@@ -511,10 +577,11 @@ void MetalSourceEmitter::emitSimpleTypeImpl(IRType* type)
case kIROp_HLSLByteAddressBufferType:
case kIROp_HLSLRWByteAddressBufferType:
case kIROp_HLSLRasterizerOrderedByteAddressBufferType:
- m_writer->emit("device ");
- m_writer->emit("uint32_t *");
+ m_writer->emit("uint32_t device*");
+ break;
+ case kIROp_RaytracingAccelerationStructureType:
+ m_writer->emit("acceleration_structure<instancing>");
break;
- case kIROp_RaytracingAccelerationStructureType: m_writer->emit("acceleration_structure<instancing>"); break;
default:
SLANG_DIAGNOSE_UNEXPECTED(getSink(), SourceLoc(), "unhandled buffer type");
break;
@@ -650,7 +717,8 @@ void MetalSourceEmitter::handleRequiredCapabilitiesImpl(IRInst* inst)
void MetalSourceEmitter::emitFrontMatterImpl(TargetRequest*)
{
-
+ m_writer->emit("#include <metal_stdlib>\n");
+ m_writer->emit("using namespace metal;\n");
}
void MetalSourceEmitter::emitGlobalInstImpl(IRInst* inst)