Skip to content

Commit 7a13e41

Browse files
authored
[DirectX] Move ROV info into HLSL metadata. NFC
Pull Request: #74896
1 parent 08cb640 commit 7a13e41

File tree

15 files changed

+49
-40
lines changed

15 files changed

+49
-40
lines changed

clang/include/clang/Basic/Attr.td

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4258,7 +4258,8 @@ def HLSLResource : InheritableAttr {
42584258
"StructuredBuffer", "CBuffer", "Sampler",
42594259
"TBuffer", "RTAccelerationStructure",
42604260
"FeedbackTexture2D", "FeedbackTexture2DArray"],
4261-
/*opt=*/0, /*fake=*/0, /*isExternalType=*/1>
4261+
/*opt=*/0, /*fake=*/0, /*isExternalType=*/1>,
4262+
DefaultBoolArgument<"isROV", /*default=*/0>
42624263
];
42634264
let Documentation = [InternalOnly];
42644265
}

clang/lib/CodeGen/CGHLSLRuntime.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,8 @@ void CGHLSLRuntime::finishCodeGen() {
184184
: llvm::hlsl::ResourceKind::TBuffer;
185185
std::string TyName =
186186
Buf.Name.str() + (Buf.IsCBuffer ? ".cb." : ".tb.") + "ty";
187-
addBufferResourceAnnotation(GV, TyName, RC, RK, Buf.Binding);
187+
addBufferResourceAnnotation(GV, TyName, RC, RK, /*IsROV=*/false,
188+
Buf.Binding);
188189
}
189190
}
190191

@@ -196,6 +197,7 @@ void CGHLSLRuntime::addBufferResourceAnnotation(llvm::GlobalVariable *GV,
196197
llvm::StringRef TyName,
197198
llvm::hlsl::ResourceClass RC,
198199
llvm::hlsl::ResourceKind RK,
200+
bool IsROV,
199201
BufferResBinding &Binding) {
200202
llvm::Module &M = CGM.getModule();
201203

@@ -219,7 +221,7 @@ void CGHLSLRuntime::addBufferResourceAnnotation(llvm::GlobalVariable *GV,
219221
"ResourceMD must have been set by the switch above.");
220222

221223
llvm::hlsl::FrontendResource Res(
222-
GV, TyName, RK, Binding.Reg.value_or(UINT_MAX), Binding.Space);
224+
GV, TyName, RK, IsROV, Binding.Reg.value_or(UINT_MAX), Binding.Space);
223225
ResourceMD->addOperand(Res.getMetadata());
224226
}
225227

@@ -236,10 +238,11 @@ void CGHLSLRuntime::annotateHLSLResource(const VarDecl *D, GlobalVariable *GV) {
236238

237239
llvm::hlsl::ResourceClass RC = Attr->getResourceClass();
238240
llvm::hlsl::ResourceKind RK = Attr->getResourceKind();
241+
bool IsROV = Attr->getIsROV();
239242

240243
QualType QT(Ty, 0);
241244
BufferResBinding Binding(D->getAttr<HLSLResourceBindingAttr>());
242-
addBufferResourceAnnotation(GV, QT.getAsString(), RC, RK, Binding);
245+
addBufferResourceAnnotation(GV, QT.getAsString(), RC, RK, IsROV, Binding);
243246
}
244247

245248
CGHLSLRuntime::BufferResBinding::BufferResBinding(

clang/lib/CodeGen/CGHLSLRuntime.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ class CGHLSLRuntime {
9292
void addBufferResourceAnnotation(llvm::GlobalVariable *GV,
9393
llvm::StringRef TyName,
9494
llvm::hlsl::ResourceClass RC,
95-
llvm::hlsl::ResourceKind RK,
95+
llvm::hlsl::ResourceKind RK, bool IsROV,
9696
BufferResBinding &Binding);
9797
void addConstant(VarDecl *D, Buffer &CB);
9898
void addBufferDecls(const DeclContext *DC, Buffer &CB);

clang/lib/Sema/HLSLExternalSemaSource.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,8 +119,8 @@ struct BuiltinTypeDeclBuilder {
119119
ResourceKind RK) {
120120
if (Record->isCompleteDefinition())
121121
return *this;
122-
Record->addAttr(
123-
HLSLResourceAttr::CreateImplicit(Record->getASTContext(), RC, RK));
122+
Record->addAttr(HLSLResourceAttr::CreateImplicit(Record->getASTContext(),
123+
RC, RK, /*IsROV=*/false));
124124
return *this;
125125
}
126126

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ void main() {
1616
}
1717

1818
// CHECK: !hlsl.uavs = !{![[Single:[0-9]+]], ![[Array:[0-9]+]], ![[SingleAllocated:[0-9]+]], ![[ArrayAllocated:[0-9]+]], ![[SingleSpace:[0-9]+]], ![[ArraySpace:[0-9]+]]}
19-
// CHECK-DAG: ![[Single]] = !{ptr @"?Buffer1@@3V?$RWBuffer@M@hlsl@@A", !"RWBuffer<float>", i32 10, i32 -1, i32 0}
20-
// CHECK-DAG: ![[Array]] = !{ptr @"?BufferArray@@3PAV?$RWBuffer@T?$__vector@M$03@__clang@@@hlsl@@A", !"RWBuffer<vector<float, 4> >", i32 10, i32 -1, i32 0}
21-
// CHECK-DAG: ![[SingleAllocated]] = !{ptr @"?Buffer2@@3V?$RWBuffer@M@hlsl@@A", !"RWBuffer<float>", i32 10, i32 3, i32 0}
22-
// CHECK-DAG: ![[ArrayAllocated]] = !{ptr @"?BufferArray2@@3PAV?$RWBuffer@T?$__vector@M$03@__clang@@@hlsl@@A", !"RWBuffer<vector<float, 4> >", i32 10, i32 4, i32 0}
23-
// CHECK-DAG: ![[SingleSpace]] = !{ptr @"?Buffer3@@3V?$RWBuffer@M@hlsl@@A", !"RWBuffer<float>", i32 10, i32 3, i32 1}
24-
// CHECK-DAG: ![[ArraySpace]] = !{ptr @"?BufferArray3@@3PAV?$RWBuffer@T?$__vector@M$03@__clang@@@hlsl@@A", !"RWBuffer<vector<float, 4> >", i32 10, i32 4, i32 1}
19+
// CHECK-DAG: ![[Single]] = !{ptr @"?Buffer1@@3V?$RWBuffer@M@hlsl@@A", !"RWBuffer<float>", i32 10, i1 false, i32 -1, i32 0}
20+
// CHECK-DAG: ![[Array]] = !{ptr @"?BufferArray@@3PAV?$RWBuffer@T?$__vector@M$03@__clang@@@hlsl@@A", !"RWBuffer<vector<float, 4> >", i32 10, i1 false, i32 -1, i32 0}
21+
// CHECK-DAG: ![[SingleAllocated]] = !{ptr @"?Buffer2@@3V?$RWBuffer@M@hlsl@@A", !"RWBuffer<float>", i32 10, i1 false, i32 3, i32 0}
22+
// CHECK-DAG: ![[ArrayAllocated]] = !{ptr @"?BufferArray2@@3PAV?$RWBuffer@T?$__vector@M$03@__clang@@@hlsl@@A", !"RWBuffer<vector<float, 4> >", i32 10, i1 false, i32 4, i32 0}
23+
// CHECK-DAG: ![[SingleSpace]] = !{ptr @"?Buffer3@@3V?$RWBuffer@M@hlsl@@A", !"RWBuffer<float>", i32 10, i1 false, i32 3, i32 1}
24+
// CHECK-DAG: ![[ArraySpace]] = !{ptr @"?BufferArray3@@3PAV?$RWBuffer@T?$__vector@M$03@__clang@@@hlsl@@A", !"RWBuffer<vector<float, 4> >", i32 10, i1 false, i32 4, i32 1}

clang/test/CodeGenHLSL/cbuf.hlsl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,5 +24,5 @@ float foo() {
2424

2525
// CHECK: !hlsl.cbufs = !{![[CBMD:[0-9]+]]}
2626
// CHECK: !hlsl.srvs = !{![[TBMD:[0-9]+]]}
27-
// CHECK: ![[CBMD]] = !{ptr @[[CB]], !"A.cb.ty", i32 13, i32 0, i32 2}
28-
// CHECK: ![[TBMD]] = !{ptr @[[TB]], !"A.tb.ty", i32 15, i32 2, i32 1}
27+
// CHECK: ![[CBMD]] = !{ptr @[[CB]], !"A.cb.ty", i32 13, i1 false, i32 0, i32 2}
28+
// CHECK: ![[TBMD]] = !{ptr @[[TB]], !"A.tb.ty", i32 15, i1 false, i32 2, i32 1}

llvm/include/llvm/Frontend/HLSL/HLSLResource.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,15 +59,16 @@ class FrontendResource {
5959

6060
public:
6161
FrontendResource(MDNode *E) : Entry(E) {
62-
assert(Entry->getNumOperands() == 5 && "Unexpected metadata shape");
62+
assert(Entry->getNumOperands() == 6 && "Unexpected metadata shape");
6363
}
6464

6565
FrontendResource(GlobalVariable *GV, StringRef TypeStr, ResourceKind RK,
66-
uint32_t ResIndex, uint32_t Space);
66+
bool IsROV, uint32_t ResIndex, uint32_t Space);
6767

6868
GlobalVariable *getGlobalVariable();
6969
StringRef getSourceType();
7070
ResourceKind getResourceKind();
71+
bool getIsROV();
7172
uint32_t getResourceIndex();
7273
uint32_t getSpace();
7374
MDNode *getMetadata() { return Entry; }

llvm/lib/Frontend/HLSL/HLSLResource.cpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,25 +33,31 @@ ResourceKind FrontendResource::getResourceKind() {
3333
cast<ConstantAsMetadata>(Entry->getOperand(2))->getValue())
3434
->getLimitedValue());
3535
}
36-
uint32_t FrontendResource::getResourceIndex() {
36+
bool FrontendResource::getIsROV() {
3737
return cast<ConstantInt>(
3838
cast<ConstantAsMetadata>(Entry->getOperand(3))->getValue())
3939
->getLimitedValue();
4040
}
41-
uint32_t FrontendResource::getSpace() {
41+
uint32_t FrontendResource::getResourceIndex() {
4242
return cast<ConstantInt>(
4343
cast<ConstantAsMetadata>(Entry->getOperand(4))->getValue())
4444
->getLimitedValue();
4545
}
46+
uint32_t FrontendResource::getSpace() {
47+
return cast<ConstantInt>(
48+
cast<ConstantAsMetadata>(Entry->getOperand(5))->getValue())
49+
->getLimitedValue();
50+
}
4651

4752
FrontendResource::FrontendResource(GlobalVariable *GV, StringRef TypeStr,
48-
ResourceKind RK, uint32_t ResIndex,
49-
uint32_t Space) {
53+
ResourceKind RK, bool IsROV,
54+
uint32_t ResIndex, uint32_t Space) {
5055
auto &Ctx = GV->getContext();
5156
IRBuilder<> B(Ctx);
5257
Entry = MDNode::get(
5358
Ctx, {ValueAsMetadata::get(GV), MDString::get(Ctx, TypeStr),
5459
ConstantAsMetadata::get(B.getInt32(static_cast<int>(RK))),
60+
ConstantAsMetadata::get(B.getInt1(IsROV)),
5561
ConstantAsMetadata::get(B.getInt32(ResIndex)),
5662
ConstantAsMetadata::get(B.getInt32(Space))});
5763
}

llvm/lib/Target/DirectX/DXILResource.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ void ResourceBase::print(raw_ostream &OS, StringRef IDPrefix,
234234

235235
UAVResource::UAVResource(uint32_t I, FrontendResource R)
236236
: ResourceBase(I, R), Shape(R.getResourceKind()), GloballyCoherent(false),
237-
HasCounter(false), IsROV(false), ExtProps() {
237+
HasCounter(false), IsROV(R.getIsROV()), ExtProps() {
238238
parseSourceType(R.getSourceType());
239239
}
240240

@@ -258,8 +258,6 @@ void UAVResource::print(raw_ostream &OS) const {
258258
// information we need to remove the source type string from here (See issue:
259259
// https://github.com/llvm/llvm-project/issues/57991).
260260
void UAVResource::parseSourceType(StringRef S) {
261-
IsROV = S.startswith("RasterizerOrdered");
262-
263261
S = S.substr(S.find("<") + 1);
264262

265263
constexpr size_t PrefixLen = StringRef("vector<").size();

llvm/test/CodeGen/DirectX/UAVMetadata.ll

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -37,16 +37,16 @@ target triple = "dxil-pc-shadermodel6.0-library"
3737

3838
!hlsl.uavs = !{!0, !1, !2, !3, !4, !5, !6, !7, !8, !9}
3939

40-
!0 = !{ptr @Zero, !"RWBuffer<half>", i32 10, i32 0, i32 0}
41-
!1 = !{ptr @One, !"Buffer<vector<float,4>>", i32 10, i32 1, i32 0}
42-
!2 = !{ptr @Two, !"Buffer<double>", i32 10, i32 2, i32 0}
43-
!3 = !{ptr @Three, !"Buffer<bool>", i32 10, i32 3, i32 0}
44-
!4 = !{ptr @Four, !"ByteAddressBuffer<int16_t>", i32 11, i32 5, i32 0}
45-
!5 = !{ptr @Five, !"StructuredBuffer<uint16_t>", i32 12, i32 6, i32 0}
46-
!6 = !{ptr @Six, !"RasterizerOrderedBuffer<int32_t>", i32 10, i32 7, i32 0}
47-
!7 = !{ptr @Seven, !"RasterizerOrderedStructuredBuffer<uint32_t>", i32 12, i32 8, i32 0}
48-
!8 = !{ptr @Eight, !"RasterizerOrderedByteAddressBuffer<int64_t>", i32 11, i32 9, i32 0}
49-
!9 = !{ptr @Nine, !"RWBuffer<uint64_t>", i32 10, i32 10, i32 2}
40+
!0 = !{ptr @Zero, !"RWBuffer<half>", i32 10, i1 false, i32 0, i32 0}
41+
!1 = !{ptr @One, !"Buffer<vector<float,4>>", i32 10, i1 false, i32 1, i32 0}
42+
!2 = !{ptr @Two, !"Buffer<double>", i32 10, i1 false, i32 2, i32 0}
43+
!3 = !{ptr @Three, !"Buffer<bool>", i32 10, i1 false, i32 3, i32 0}
44+
!4 = !{ptr @Four, !"ByteAddressBuffer<int16_t>", i32 11, i1 false, i32 5, i32 0}
45+
!5 = !{ptr @Five, !"StructuredBuffer<uint16_t>", i32 12, i1 false, i32 6, i32 0}
46+
!6 = !{ptr @Six, !"RasterizerOrderedBuffer<int32_t>", i32 10, i1 true, i32 7, i32 0}
47+
!7 = !{ptr @Seven, !"RasterizerOrderedStructuredBuffer<uint32_t>", i32 12, i1 true, i32 8, i32 0}
48+
!8 = !{ptr @Eight, !"RasterizerOrderedByteAddressBuffer<int64_t>", i32 11, i1 true, i32 9, i32 0}
49+
!9 = !{ptr @Nine, !"RWBuffer<uint64_t>", i32 10, i1 false, i32 10, i32 2}
5050

5151
; CHECK: !dx.resources = !{[[ResList:[!][0-9]+]]}
5252

llvm/test/CodeGen/DirectX/cbuf.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,4 @@ attributes #1 = { nocallback nofree nosync nounwind readnone speculatable willre
3434

3535
!hlsl.cbufs = !{!1}
3636

37-
!1 = !{ptr @A.cb., !"A.cb.ty", i32 13, i32 2, i32 1}
37+
!1 = !{ptr @A.cb., !"A.cb.ty", i32 13, i1 false, i32 2, i32 1}

llvm/test/CodeGen/DirectX/legacy_cb_layout_0.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,4 @@ target triple = "dxil-unknown-shadermodel6.7-library"
1111

1212
!hlsl.cbufs = !{!1}
1313

14-
!1 = !{ptr @A.cb., !"A.cb.ty", i32 13, i32 2, i32 0}
14+
!1 = !{ptr @A.cb., !"A.cb.ty", i32 13, i1 false, i32 2, i32 0}

llvm/test/CodeGen/DirectX/legacy_cb_layout_1.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,4 @@ target triple = "dxil-unknown-shadermodel6.7-library"
3434

3535
!hlsl.cbufs = !{!0}
3636

37-
!0 = !{ptr @B.cb., !"B.cb.ty", i32 13, i32 1, i32 0}
37+
!0 = !{ptr @B.cb., !"B.cb.ty", i32 13, i1 false, i32 1, i32 0}

llvm/test/CodeGen/DirectX/legacy_cb_layout_2.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,5 +47,5 @@ target triple = "dxil-unknown-shadermodel6.7-library"
4747

4848
!hlsl.cbufs = !{!0, !1}
4949

50-
!0 = !{ptr @B.cb., !"B.cb.ty", i32 13, i32 1, i32 0}
51-
!1 = !{ptr @B.cb..1, !"B.cb.ty", i32 13, i32 2, i32 0}
50+
!0 = !{ptr @B.cb., !"B.cb.ty", i32 13, i1 false, i32 1, i32 0}
51+
!1 = !{ptr @B.cb..1, !"B.cb.ty", i32 13, i1 false, i32 2, i32 0}

llvm/test/CodeGen/DirectX/legacy_cb_layout_3.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,4 +78,4 @@ target triple = "dxil-unknown-shadermodel6.7-library"
7878
@D.cb. = external local_unnamed_addr constant { i32, %struct.B, half, %struct.C, double }
7979

8080
!hlsl.cbufs = !{!0}
81-
!0 = !{ptr @D.cb., !"D.cb.ty", i32 13, i32 1, i32 0}
81+
!0 = !{ptr @D.cb., !"D.cb.ty", i32 13, i1 false, i32 1, i32 0}

0 commit comments

Comments
 (0)