Skip to content

Commit a0b6179

Browse files
committed
[DirectX] Add resource name argument to llvm.dx.handlefrombinding intrinsic (DirectX only)
Also adding the resource name to llvm.dx.handlefromimplicitbinding
1 parent 8776c02 commit a0b6179

File tree

66 files changed

+319
-266
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

66 files changed

+319
-266
lines changed

clang/lib/CodeGen/CGHLSLBuiltins.cpp

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -299,9 +299,20 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID,
299299
// (llvm/llvm-project#135452)
300300
Value *NonUniform =
301301
llvm::ConstantInt::get(llvm::Type::getInt1Ty(getLLVMContext()), false);
302-
return Builder.CreateIntrinsic(
303-
HandleTy, CGM.getHLSLRuntime().getCreateHandleFromBindingIntrinsic(),
304-
ArrayRef<Value *>{SpaceOp, RegisterOp, RangeOp, IndexOp, NonUniform});
302+
303+
Intrinsic::ID IID =
304+
CGM.getHLSLRuntime().getCreateHandleFromBindingIntrinsic();
305+
// SPIR-V intrinsic does not have include the resource name
306+
if (IID == Intrinsic::spv_resource_handlefrombinding)
307+
return Builder.CreateIntrinsic(
308+
HandleTy, IID,
309+
ArrayRef<Value *>{SpaceOp, RegisterOp, RangeOp, IndexOp, NonUniform});
310+
311+
Value *NameOp = EmitScalarExpr(E->getArg(5));
312+
return Builder.CreateIntrinsic(HandleTy, IID,
313+
ArrayRef<Value *>{SpaceOp, RegisterOp,
314+
RangeOp, IndexOp,
315+
NonUniform, NameOp});
305316
}
306317
case Builtin::BI__builtin_hlsl_resource_handlefromimplicitbinding: {
307318
llvm::Type *HandleTy = CGM.getTypes().ConvertType(E->getType());
@@ -313,10 +324,20 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID,
313324
// (llvm/llvm-project#135452)
314325
Value *NonUniform =
315326
llvm::ConstantInt::get(llvm::Type::getInt1Ty(getLLVMContext()), false);
316-
return Builder.CreateIntrinsic(
317-
HandleTy,
318-
CGM.getHLSLRuntime().getCreateHandleFromImplicitBindingIntrinsic(),
319-
ArrayRef<Value *>{OrderID, SpaceOp, RangeOp, IndexOp, NonUniform});
327+
328+
Intrinsic::ID IID =
329+
CGM.getHLSLRuntime().getCreateHandleFromImplicitBindingIntrinsic();
330+
// SPIR-V intrinsic does not include the resource name
331+
if (IID == Intrinsic::spv_resource_handlefromimplicitbinding)
332+
return Builder.CreateIntrinsic(
333+
HandleTy, IID,
334+
ArrayRef<Value *>{OrderID, SpaceOp, RangeOp, IndexOp, NonUniform});
335+
336+
Value *NameOp = EmitScalarExpr(E->getArg(5));
337+
return Builder.CreateIntrinsic(HandleTy, IID,
338+
ArrayRef<Value *>{OrderID, SpaceOp, RangeOp,
339+
IndexOp, NonUniform,
340+
NameOp});
320341
}
321342
case Builtin::BI__builtin_hlsl_all: {
322343
Value *Op0 = EmitScalarExpr(E->getArg(0));

clang/lib/CodeGen/CGHLSLRuntime.cpp

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,6 @@ using namespace llvm;
4242

4343
using llvm::hlsl::CBufferRowSizeInBytes;
4444

45-
static void initializeBufferFromBinding(CodeGenModule &CGM,
46-
llvm::GlobalVariable *GV,
47-
HLSLResourceBindingAttr *RBA);
48-
4945
namespace {
5046

5147
void addDxilValVersion(StringRef ValVersionStr, llvm::Module &M) {
@@ -275,7 +271,7 @@ void CGHLSLRuntime::addBuffer(const HLSLBufferDecl *BufDecl) {
275271
HLSLResourceBindingAttr *RBA = BufDecl->getAttr<HLSLResourceBindingAttr>();
276272
assert(RBA &&
277273
"cbuffer/tbuffer should always have resource binding attribute");
278-
initializeBufferFromBinding(CGM, BufGV, RBA);
274+
initializeBufferFromBinding(BufDecl, BufGV, RBA);
279275
}
280276

281277
llvm::TargetExtType *
@@ -557,29 +553,47 @@ static void initializeBuffer(CodeGenModule &CGM, llvm::GlobalVariable *GV,
557553
CGM.AddCXXGlobalInit(InitResFunc);
558554
}
559555

560-
static void initializeBufferFromBinding(CodeGenModule &CGM,
561-
llvm::GlobalVariable *GV,
562-
HLSLResourceBindingAttr *RBA) {
556+
void CGHLSLRuntime::initializeBufferFromBinding(const HLSLBufferDecl *BufDecl,
557+
llvm::GlobalVariable *GV,
558+
HLSLResourceBindingAttr *RBA) {
563559
llvm::Type *Int1Ty = llvm::Type::getInt1Ty(CGM.getLLVMContext());
564560
auto *NonUniform = llvm::ConstantInt::get(Int1Ty, false);
565561
auto *Index = llvm::ConstantInt::get(CGM.IntTy, 0);
566562
auto *RangeSize = llvm::ConstantInt::get(CGM.IntTy, 1);
567563
auto *Space =
568564
llvm::ConstantInt::get(CGM.IntTy, RBA ? RBA->getSpaceNumber() : 0);
565+
Value *Name = nullptr;
566+
567+
// DXIL intrinsic includes resource name
568+
if (getArch() == Triple::dxil) {
569+
std::string Str = std::string(BufDecl->getName());
570+
std::string GlobalName = Str + ".str";
571+
Name = CGM.GetAddrOfConstantCString(Str, GlobalName.c_str()).getPointer();
572+
}
569573

574+
// buffer with explicit binding
570575
if (RBA->hasRegisterSlot()) {
571576
auto *RegSlot = llvm::ConstantInt::get(CGM.IntTy, RBA->getSlotNumber());
572577
Intrinsic::ID Intr =
573578
CGM.getHLSLRuntime().getCreateHandleFromBindingIntrinsic();
574-
initializeBuffer(CGM, GV, Intr,
575-
{Space, RegSlot, RangeSize, Index, NonUniform});
579+
if (Name)
580+
initializeBuffer(CGM, GV, Intr,
581+
{Space, RegSlot, RangeSize, Index, NonUniform, Name});
582+
else
583+
initializeBuffer(CGM, GV, Intr,
584+
{Space, RegSlot, RangeSize, Index, NonUniform});
576585
} else {
586+
// buffer with implicit binding
577587
auto *OrderID =
578588
llvm::ConstantInt::get(CGM.IntTy, RBA->getImplicitBindingOrderID());
579589
Intrinsic::ID Intr =
580590
CGM.getHLSLRuntime().getCreateHandleFromImplicitBindingIntrinsic();
581-
initializeBuffer(CGM, GV, Intr,
582-
{OrderID, Space, RangeSize, Index, NonUniform});
591+
if (Name)
592+
initializeBuffer(CGM, GV, Intr,
593+
{OrderID, Space, RangeSize, Index, NonUniform, Name});
594+
else
595+
initializeBuffer(CGM, GV, Intr,
596+
{OrderID, Space, RangeSize, Index, NonUniform});
583597
}
584598
}
585599

clang/lib/CodeGen/CGHLSLRuntime.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,9 @@ class CGHLSLRuntime {
164164
private:
165165
void emitBufferGlobalsAndMetadata(const HLSLBufferDecl *BufDecl,
166166
llvm::GlobalVariable *BufGV);
167+
void initializeBufferFromBinding(const HLSLBufferDecl *BufDecl,
168+
llvm::GlobalVariable *GV,
169+
HLSLResourceBindingAttr *RBA);
167170
llvm::Triple::ArchType getArch();
168171

169172
llvm::DenseMap<const clang::RecordType *, llvm::TargetExtType *> LayoutTypes;

clang/test/CodeGenHLSL/builtins/ByteAddressBuffers-constructors.hlsl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ export void foo() {
7070
// CHECK: define linkonce_odr void @_ZN4hlsl17ByteAddressBufferC2EjjijPKc(ptr noundef nonnull align 4 dereferenceable(4) %this,
7171
// CHECK-SAME: i32 noundef %registerNo, i32 noundef %spaceNo, i32 noundef %range, i32 noundef %index, ptr noundef %name)
7272
// CHECK-DXIL: %[[HANDLE:.*]] = call target("dx.RawBuffer", i8, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i8_0_0t(
73-
// CHECK-DXIL-SAME: i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i1 false)
73+
// CHECK-DXIL-SAME: i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i1 false, ptr %{{.*}})
7474
// CHECK-NEXT: %__handle = getelementptr inbounds nuw %"class.hlsl::ByteAddressBuffer", ptr %{{.*}}, i32 0, i32 0
7575
// CHECK-DXIL-NEXT: store target("dx.RawBuffer", i8, 0, 0) %[[HANDLE]], ptr %__handle, align 4
7676

@@ -79,7 +79,7 @@ export void foo() {
7979
// CHECK: define linkonce_odr void @_ZN4hlsl19RWByteAddressBufferC2EjijjPKc(ptr noundef nonnull align 4 dereferenceable(4) %this,
8080
// CHECK-SAME: i32 noundef %spaceNo, i32 noundef %range, i32 noundef %index, i32 noundef %orderId, ptr noundef %name)
8181
// CHECK: %[[HANDLE:.*]] = call target("dx.RawBuffer", i8, 1, 0) @llvm.dx.resource.handlefromimplicitbinding.tdx.RawBuffer_i8_1_0t
82-
// CHECK-SAME: (i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i1 false)
82+
// CHECK-SAME: (i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i1 false, ptr %{{.*}})
8383
// CHECK-NEXT: %__handle = getelementptr inbounds nuw %"class.hlsl::RWByteAddressBuffer", ptr %this1, i32 0, i32 0
8484
// CHECK-NEXT: store target("dx.RawBuffer", i8, 1, 0) %[[HANDLE]], ptr %__handle, align 4
8585

clang/test/CodeGenHLSL/builtins/RWBuffer-constructor.hlsl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ export void foo() {
6767
// CHECK: define linkonce_odr void @_ZN4hlsl8RWBufferIfEC2EjjijPKc(ptr noundef nonnull align 4 dereferenceable(4) %this,
6868
// CHECK-SAME: i32 noundef %registerNo, i32 noundef %spaceNo, i32 noundef %range, i32 noundef %index, ptr noundef %name)
6969
// CHECK-DXIL: %[[HANDLE:.*]] = call target("dx.TypedBuffer", float, 1, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0_0t(
70-
// CHECK-DXIL-SAME: i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i1 false)
70+
// CHECK-DXIL-SAME: i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i1 false, ptr %{{.*}})
7171
// CHECK-NEXT: %__handle = getelementptr inbounds nuw %"class.hlsl::RWBuffer", ptr %{{.*}}, i32 0, i32 0
7272
// CHECK-DXIL-NEXT: store target("dx.TypedBuffer", float, 1, 0, 0) %[[HANDLE]], ptr %__handle, align 4
7373

@@ -76,7 +76,7 @@ export void foo() {
7676
// CHECK: define linkonce_odr void @_ZN4hlsl8RWBufferIdEC2EjijjPKc(ptr noundef nonnull align 4 dereferenceable(4) %this,
7777
// CHECK-SAME: i32 noundef %spaceNo, i32 noundef %range, i32 noundef %index, i32 noundef %orderId, ptr noundef %name)
7878
// CHECK: %[[HANDLE:.*]] = call target("dx.TypedBuffer", double, 1, 0, 0) @llvm.dx.resource.handlefromimplicitbinding.tdx.TypedBuffer_f64_1_0_0t
79-
// CHECK-SAME: (i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i1 false)
79+
// CEHCK-SAME: (i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i1 false, ptr %{{.*}})
8080
// CHECK-NEXT: %__handle = getelementptr inbounds nuw %"class.hlsl::RWBuffer.0", ptr %{{.*}}, i32 0, i32 0
8181
// CHECK-NEXT: store target("dx.TypedBuffer", double, 1, 0, 0) %[[HANDLE]], ptr %__handle, align 4
8282

clang/test/CodeGenHLSL/builtins/StructuredBuffers-constructors.hlsl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ export void foo() {
7171
// CHECK: define linkonce_odr void @_ZN4hlsl16StructuredBufferIfEC2EjjijPKc(ptr noundef nonnull align 4 dereferenceable(4) %this,
7272
// CHECK-SAME: i32 noundef %registerNo, i32 noundef %spaceNo, i32 noundef %range, i32 noundef %index, ptr noundef %name)
7373
// CHECK-DXIL: %[[HANDLE:.*]] = call target("dx.RawBuffer", float, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_f32_0_0t(
74-
// CHECK-SAME: i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i1 false)
74+
// CHECK-SAME: i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i1 false, ptr %{{.*}})
7575
// CHECK-NEXT: %__handle = getelementptr inbounds nuw %"class.hlsl::StructuredBuffer", ptr %{{.*}}, i32 0, i32 0
7676
// CHECK-DXIL-NEXT: store target("dx.RawBuffer", float, 0, 0) %[[HANDLE]], ptr %__handle, align 4
7777

@@ -80,7 +80,7 @@ export void foo() {
8080
// CHECK: define linkonce_odr void @_ZN4hlsl18RWStructuredBufferIfEC2EjijjPKc(ptr noundef nonnull align 4 dereferenceable(4) %this,
8181
// CHECK-SAME: i32 noundef %spaceNo, i32 noundef %range, i32 noundef %index, i32 noundef %orderId, ptr noundef %name)
8282
// CHECK: %[[HANDLE:.*]] = call target("dx.RawBuffer", float, 1, 0) @llvm.dx.resource.handlefromimplicitbinding.tdx.RawBuffer_f32_1_0t
83-
// CHECK-SAME: (i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i1 false)
83+
// CHECK-SAME: (i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i1 false, ptr %{{.*}})
8484
// CHECK-NEXT: %__handle = getelementptr inbounds nuw %"class.hlsl::RWStructuredBuffer", ptr %{{.*}}, i32 0, i32 0
8585
// CHECK-NEXT: store target("dx.RawBuffer", float, 1, 0) %[[HANDLE]], ptr %__handle, align 4
8686

0 commit comments

Comments
 (0)