================
@@ -647,6 +647,75 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned
BuiltinID,
CI->setCallingConv(IntrFn->getCallingConv());
return CI;
}
+ case Builtin::BI__builtin_hlsl_resource_load_typed: {
+ Value *HandleOp = EmitScalarExpr(E->getArg(0));
+ Value *IndexOp = EmitScalarExpr(E->getArg(1));
+
+ QualType ElemQTy = E->getType();
+ QualType PtrQTy = getContext().getPointerType(
+ getContext().getAddrSpaceQualType(ElemQTy, LangAS::hlsl_device));
+ llvm::Type *PtrTy = ConvertType(PtrQTy);
+ llvm::Type *ElemTy = ConvertType(ElemQTy);
+
+ llvm::Function *IntrFn = llvm::Intrinsic::getOrInsertDeclaration(
+ &CGM.getModule(),
+ CGM.getHLSLRuntime().getCreateResourceGetPointerIntrinsic(),
+ {PtrTy, HandleOp->getType(), IndexOp->getType()});
+ llvm::CallInst *Ptr = EmitRuntimeCall(IntrFn, {HandleOp, IndexOp});
+ Ptr->setCallingConv(IntrFn->getCallingConv());
+
+ Address Addr(Ptr, ElemTy, getContext().getTypeAlignInChars(ElemQTy));
+ Value *Loaded = Builder.CreateLoad(Addr);
+
+ // Legacy row-major buffer order loads the transposed shape; transpose
back.
+ if (const auto *MatTy = ElemQTy->getAs<ConstantMatrixType>()) {
+ const HLSLAttributedResourceType *RT = getRequiredHandleType(E, 0);
+ if (RT->isRaw() && CGM.getTriple().isSPIRV() &&
+ getLangOpts().HLSLSpvUseLegacyBufferMatrixOrder) {
+ llvm::MatrixBuilder MB(Builder);
+ Loaded = MB.CreateMatrixTranspose(Loaded, MatTy->getNumColumns(),
+ MatTy->getNumRows());
+ }
+ }
+ return Loaded;
+ }
+ case Builtin::BI__builtin_hlsl_resource_store_typed: {
+ // Value is evaluated before Handle/Index to match the IR shape of the
+ // other (non-templated) Store overloads.
+ Value *ValueOp = EmitScalarExpr(E->getArg(2));
+ Value *HandleOp = EmitScalarExpr(E->getArg(0));
+ Value *IndexOp = EmitScalarExpr(E->getArg(1));
+
+ QualType ElemQTy = E->getArg(2)->getType();
+
+ // See the load_typed case above.
+ if (const auto *MatTy = ElemQTy->getAs<ConstantMatrixType>()) {
+ const HLSLAttributedResourceType *RT = getRequiredHandleType(E, 0);
+ if (RT->isRaw() && CGM.getTriple().isSPIRV() &&
----------------
farzonl wrote:
Even though we check the spirv target in the driver I can get around the driver
checks with `-cc1` So I figured if you did that and you are actually targeting
DirectX then lets just treat `HLSLSpvUseLegacyBufferMatrixOrder` as a noOpt and
do nothing in codegen.
https://github.com/llvm/llvm-project/pull/214575
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits