diff options
author | Steven Perron <stevenperron@google.com> | 2025-06-13 12:21:38 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-06-13 12:21:38 -0400 |
commit | bd33eef7f1013bea24289a898f788a2efe9d8282 (patch) | |
tree | 52f5c0548cf1adc9001a8047af0e6affc9a9f28e /clang/lib | |
parent | dec576514cb7106c59a5059ac6d52ebdf5de5275 (diff) | |
download | llvm-bd33eef7f1013bea24289a898f788a2efe9d8282.zip llvm-bd33eef7f1013bea24289a898f788a2efe9d8282.tar.gz llvm-bd33eef7f1013bea24289a898f788a2efe9d8282.tar.bz2 |
[HLSL][SPIRV] Use resource names (#143412)
The SPIR-V backend does not have access to the original name of a
resource in the source, so it tries to create a name. This leads to some
problems with reflection.
That is why start to pass the name of the resource from Clang to the
SPIR-V backend.
Fixes #138533
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/CodeGen/CGHLSLBuiltins.cpp | 17 | ||||
-rw-r--r-- | clang/lib/CodeGen/CGHLSLRuntime.cpp | 49 | ||||
-rw-r--r-- | clang/lib/CodeGen/CGHLSLRuntime.h | 13 |
3 files changed, 20 insertions, 59 deletions
diff --git a/clang/lib/CodeGen/CGHLSLBuiltins.cpp b/clang/lib/CodeGen/CGHLSLBuiltins.cpp index abebc20..ccf45c0 100644 --- a/clang/lib/CodeGen/CGHLSLBuiltins.cpp +++ b/clang/lib/CodeGen/CGHLSLBuiltins.cpp @@ -295,17 +295,16 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID, Value *SpaceOp = EmitScalarExpr(E->getArg(2)); Value *RangeOp = EmitScalarExpr(E->getArg(3)); Value *IndexOp = EmitScalarExpr(E->getArg(4)); + Value *Name = EmitScalarExpr(E->getArg(5)); // FIXME: NonUniformResourceIndex bit is not yet implemented // (llvm/llvm-project#135452) Value *NonUniform = llvm::ConstantInt::get(llvm::Type::getInt1Ty(getLLVMContext()), false); - auto [IntrinsicID, HasNameArg] = + llvm::Intrinsic::ID IntrinsicID = CGM.getHLSLRuntime().getCreateHandleFromBindingIntrinsic(); - SmallVector<Value *> Args{SpaceOp, RegisterOp, RangeOp, IndexOp, - NonUniform}; - if (HasNameArg) - Args.push_back(EmitScalarExpr(E->getArg(5))); + SmallVector<Value *> Args{SpaceOp, RegisterOp, RangeOp, + IndexOp, NonUniform, Name}; return Builder.CreateIntrinsic(HandleTy, IntrinsicID, Args); } case Builtin::BI__builtin_hlsl_resource_handlefromimplicitbinding: { @@ -314,16 +313,16 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID, Value *RangeOp = EmitScalarExpr(E->getArg(2)); Value *IndexOp = EmitScalarExpr(E->getArg(3)); Value *OrderID = EmitScalarExpr(E->getArg(4)); + Value *Name = EmitScalarExpr(E->getArg(5)); // FIXME: NonUniformResourceIndex bit is not yet implemented // (llvm/llvm-project#135452) Value *NonUniform = llvm::ConstantInt::get(llvm::Type::getInt1Ty(getLLVMContext()), false); - auto [IntrinsicID, HasNameArg] = + llvm::Intrinsic::ID IntrinsicID = CGM.getHLSLRuntime().getCreateHandleFromImplicitBindingIntrinsic(); - SmallVector<Value *> Args{OrderID, SpaceOp, RangeOp, IndexOp, NonUniform}; - if (HasNameArg) - Args.push_back(EmitScalarExpr(E->getArg(5))); + SmallVector<Value *> Args{OrderID, SpaceOp, RangeOp, + IndexOp, NonUniform, Name}; return Builder.CreateIntrinsic(HandleTy, IntrinsicID, Args); } case Builtin::BI__builtin_hlsl_all: { diff --git a/clang/lib/CodeGen/CGHLSLRuntime.cpp b/clang/lib/CodeGen/CGHLSLRuntime.cpp index 720dac8..977ff79 100644 --- a/clang/lib/CodeGen/CGHLSLRuntime.cpp +++ b/clang/lib/CodeGen/CGHLSLRuntime.cpp @@ -237,35 +237,6 @@ static void fillPackoffsetLayout(const HLSLBufferDecl *BufDecl, } } -std::pair<llvm::Intrinsic::ID, bool> -CGHLSLRuntime::getCreateHandleFromBindingIntrinsic() { - switch (getArch()) { - case llvm::Triple::dxil: - return std::pair(llvm::Intrinsic::dx_resource_handlefrombinding, true); - case llvm::Triple::spirv: - return std::pair(llvm::Intrinsic::spv_resource_handlefrombinding, false); - default: - llvm_unreachable("Intrinsic resource_handlefrombinding not supported by " - "target architecture"); - } -} - -std::pair<llvm::Intrinsic::ID, bool> -CGHLSLRuntime::getCreateHandleFromImplicitBindingIntrinsic() { - switch (getArch()) { - case llvm::Triple::dxil: - return std::pair(llvm::Intrinsic::dx_resource_handlefromimplicitbinding, - true); - case llvm::Triple::spirv: - return std::pair(llvm::Intrinsic::spv_resource_handlefromimplicitbinding, - false); - default: - llvm_unreachable( - "Intrinsic resource_handlefromimplicitbinding not supported by " - "target architecture"); - } -} - // Codegen for HLSLBufferDecl void CGHLSLRuntime::addBuffer(const HLSLBufferDecl *BufDecl) { @@ -625,31 +596,27 @@ void CGHLSLRuntime::initializeBufferFromBinding(const HLSLBufferDecl *BufDecl, llvm::ConstantInt::get(CGM.IntTy, RBA ? RBA->getSpaceNumber() : 0); Value *Name = nullptr; - auto [IntrinsicID, HasNameArg] = + llvm::Intrinsic::ID IntrinsicID = RBA->hasRegisterSlot() ? CGM.getHLSLRuntime().getCreateHandleFromBindingIntrinsic() : CGM.getHLSLRuntime().getCreateHandleFromImplicitBindingIntrinsic(); - if (HasNameArg) { - std::string Str(BufDecl->getName()); - std::string GlobalName(Str + ".str"); - Name = CGM.GetAddrOfConstantCString(Str, GlobalName.c_str()).getPointer(); - } + std::string Str(BufDecl->getName()); + std::string GlobalName(Str + ".str"); + Name = CGM.GetAddrOfConstantCString(Str, GlobalName.c_str()).getPointer(); // buffer with explicit binding if (RBA->hasRegisterSlot()) { auto *RegSlot = llvm::ConstantInt::get(CGM.IntTy, RBA->getSlotNumber()); - SmallVector<Value *> Args{Space, RegSlot, RangeSize, Index, NonUniform}; - if (Name) - Args.push_back(Name); + SmallVector<Value *> Args{Space, RegSlot, RangeSize, + Index, NonUniform, Name}; initializeBuffer(CGM, GV, IntrinsicID, Args); } else { // buffer with implicit binding auto *OrderID = llvm::ConstantInt::get(CGM.IntTy, RBA->getImplicitBindingOrderID()); - SmallVector<Value *> Args{OrderID, Space, RangeSize, Index, NonUniform}; - if (Name) - Args.push_back(Name); + SmallVector<Value *> Args{OrderID, Space, RangeSize, + Index, NonUniform, Name}; initializeBuffer(CGM, GV, IntrinsicID, Args); } } diff --git a/clang/lib/CodeGen/CGHLSLRuntime.h b/clang/lib/CodeGen/CGHLSLRuntime.h index bb2b82f..89d2aff8 100644 --- a/clang/lib/CodeGen/CGHLSLRuntime.h +++ b/clang/lib/CodeGen/CGHLSLRuntime.h @@ -118,6 +118,10 @@ public: GENERATE_HLSL_INTRINSIC_FUNCTION(CreateResourceGetPointer, resource_getpointer) + GENERATE_HLSL_INTRINSIC_FUNCTION(CreateHandleFromBinding, + resource_handlefrombinding) + GENERATE_HLSL_INTRINSIC_FUNCTION(CreateHandleFromImplicitBinding, + resource_handlefromimplicitbinding) GENERATE_HLSL_INTRINSIC_FUNCTION(BufferUpdateCounter, resource_updatecounter) GENERATE_HLSL_INTRINSIC_FUNCTION(GroupMemoryBarrierWithGroupSync, group_memory_barrier_with_group_sync) @@ -126,15 +130,6 @@ public: // End of reserved area for HLSL intrinsic getters. //===----------------------------------------------------------------------===// - // Returns ID of the intrinsic that initializes resource handle from binding - // and a bool value indicating whether the last argument of the intrinsic is - // the resource name (not all targets need that). - std::pair<llvm::Intrinsic::ID, bool> getCreateHandleFromBindingIntrinsic(); - - // Same as above but for implicit binding. - std::pair<llvm::Intrinsic::ID, bool> - getCreateHandleFromImplicitBindingIntrinsic(); - protected: CodeGenModule &CGM; |