================ @@ -29,19 +29,48 @@ class DirectXTargetCodeGenInfo : public TargetCodeGenInfo { llvm::Type *DirectXTargetCodeGenInfo::getHLSLType(CodeGenModule &CGM, const Type *Ty) const { - auto *BuiltinTy = dyn_cast<BuiltinType>(Ty); - if (!BuiltinTy || BuiltinTy->getKind() != BuiltinType::HLSLResource) + auto *ResType = dyn_cast<HLSLAttributedResourceType>(Ty); + if (!ResType) return nullptr; llvm::LLVMContext &Ctx = CGM.getLLVMContext(); - // FIXME: translate __hlsl_resource_t to target("dx.TypedBuffer", <4 x float>, - // 1, 0, 0) only for now (RWBuffer<float4>); more work us needed to determine - // the target ext type and its parameters based on the handle type - // attributes (not yet implemented) - llvm::FixedVectorType *ElemType = - llvm::FixedVectorType::get(llvm::Type::getFloatTy(Ctx), 4); - unsigned Flags[] = {/*IsWriteable*/ 1, /*IsROV*/ 0, /*IsSigned*/ 0}; - return llvm::TargetExtType::get(Ctx, "dx.TypedBuffer", {ElemType}, Flags); + const HLSLAttributedResourceType::Attributes &ResAttrs = ResType->getAttrs(); + switch (ResAttrs.ResourceClass) { + case llvm::dxil::ResourceClass::UAV: + case llvm::dxil::ResourceClass::SRV: { + // convert element type + QualType ContainedTy = ResType->getContainedType(); + llvm::Type *ElemType = nullptr; + if (!ContainedTy.isNull()) + ElemType = CGM.getTypes().ConvertType(ContainedTy); + + if (ResAttrs.RawBuffer) { + // RawBuffer needs element type + if (ContainedTy.isNull()) + return nullptr; + return llvm::TargetExtType::get(Ctx, "dx.RawBuffer", {ElemType}, + {/*IsWriteable*/ ResAttrs.ResourceClass == + llvm::dxil::ResourceClass::UAV, + /*IsROV*/ ResAttrs.IsROV}); + } + + // TypedBuffer needs element type + if (ContainedTy.isNull()) + return nullptr; + return llvm::TargetExtType::get( + Ctx, "dx.TypedBuffer", {ElemType}, + {/*IsWriteable*/ ResAttrs.ResourceClass == + llvm::dxil::ResourceClass::UAV, + /*IsROV*/ ResAttrs.IsROV, + /*IsSigned*/ ContainedTy->isSignedIntegerType()}); ---------------- hekota wrote:
This code is incomplete but I get what you mean. I've rearranged the code based on your suggestion. https://github.com/llvm/llvm-project/pull/110327 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits