Skip to content

Commit 4b446f5

Browse files
committed
[HLSL] Define RasterizerOrderedBuffer resource
Pull Request: llvm#74897
1 parent 4ab34ba commit 4b446f5

File tree

3 files changed

+41
-8
lines changed

3 files changed

+41
-8
lines changed

clang/include/clang/Basic/Attr.td

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4250,7 +4250,8 @@ def HLSLResource : InheritableAttr {
42504250
"StructuredBuffer", "CBuffer", "Sampler",
42514251
"TBuffer", "RTAccelerationStructure",
42524252
"FeedbackTexture2D", "FeedbackTexture2DArray"],
4253-
/*opt=*/0, /*fake=*/0, /*isExternalType=*/1>
4253+
/*opt=*/0, /*fake=*/0, /*isExternalType=*/1>,
4254+
DefaultBoolArgument<"isROV", /*default=*/0>
42544255
];
42554256
let Documentation = [InternalOnly];
42564257
}

clang/lib/Sema/HLSLExternalSemaSource.cpp

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -116,11 +116,11 @@ struct BuiltinTypeDeclBuilder {
116116
}
117117

118118
BuiltinTypeDeclBuilder &annotateResourceClass(ResourceClass RC,
119-
ResourceKind RK) {
119+
ResourceKind RK, bool IsROV) {
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));
124124
return *this;
125125
}
126126

@@ -478,12 +478,12 @@ void HLSLExternalSemaSource::defineTrivialHLSLTypes() {
478478

479479
/// Set up common members and attributes for buffer types
480480
static BuiltinTypeDeclBuilder setupBufferType(CXXRecordDecl *Decl, Sema &S,
481-
ResourceClass RC,
482-
ResourceKind RK) {
481+
ResourceClass RC, ResourceKind RK,
482+
bool IsROV) {
483483
return BuiltinTypeDeclBuilder(Decl)
484484
.addHandleMember()
485485
.addDefaultHandleConstructor(S, RC)
486-
.annotateResourceClass(RC, RK);
486+
.annotateResourceClass(RC, RK, IsROV);
487487
}
488488

489489
void HLSLExternalSemaSource::defineHLSLTypesWithForwardDeclarations() {
@@ -493,10 +493,22 @@ void HLSLExternalSemaSource::defineHLSLTypesWithForwardDeclarations() {
493493
.Record;
494494
onCompletion(Decl, [this](CXXRecordDecl *Decl) {
495495
setupBufferType(Decl, *SemaPtr, ResourceClass::UAV,
496-
ResourceKind::TypedBuffer)
496+
ResourceKind::TypedBuffer, /*IsROV=*/false)
497497
.addArraySubscriptOperators()
498498
.completeDefinition();
499499
});
500+
501+
Decl =
502+
BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace, "RasterizerOrderedBuffer")
503+
.addSimpleTemplateParams({"element_type"})
504+
.Record;
505+
onCompletion(Decl, [this](CXXRecordDecl *Decl) {
506+
setupBufferType(Decl, *SemaPtr, ResourceClass::UAV,
507+
ResourceKind::TypedBuffer, /*IsROV=*/true)
508+
.addArraySubscriptOperators()
509+
.completeDefinition();
510+
});
511+
500512
}
501513

502514
void HLSLExternalSemaSource::onCompletion(CXXRecordDecl *Record,
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-compute -x hlsl -emit-llvm -disable-llvm-passes -o - %s | FileCheck %s
2+
3+
RasterizerOrderedBuffer<float> Buffer1;
4+
RasterizerOrderedBuffer<vector<float, 4> > BufferArray[4];
5+
6+
RasterizerOrderedBuffer<float> Buffer2 : register(u3);
7+
RasterizerOrderedBuffer<vector<float, 4> > BufferArray2[4] : register(u4);
8+
9+
RasterizerOrderedBuffer<float> Buffer3 : register(u3, space1);
10+
RasterizerOrderedBuffer<vector<float, 4> > BufferArray3[4] : register(u4, space1);
11+
12+
[numthreads(1,1,1)] void main() {}
13+
14+
// CHECK: !hlsl.uavs = !{![[Single:[0-9]+]], ![[Array:[0-9]+]], ![[SingleAllocated:[0-9]+]], ![[ArrayAllocated:[0-9]+]], ![[SingleSpace:[0-9]+]], ![[ArraySpace:[0-9]+]]}
15+
// CHECK-DAG: ![[Single]] = !{ptr @"?Buffer1@@3V?$RasterizerOrderedBuffer@M@hlsl@@A", !"RasterizerOrderedBuffer<float>", i32 10, i1 true, i32 -1, i32 0}
16+
// CHECK-DAG: ![[Array]] = !{ptr @"?BufferArray@@3PAV?$RasterizerOrderedBuffer@T?$__vector@M$03@__clang@@@hlsl@@A", !"RasterizerOrderedBuffer<vector<float, 4> >", i32 10, i1 true, i32 -1, i32 0}
17+
// CHECK-DAG: ![[SingleAllocated]] = !{ptr @"?Buffer2@@3V?$RasterizerOrderedBuffer@M@hlsl@@A", !"RasterizerOrderedBuffer<float>", i32 10, i1 true, i32 3, i32 0}
18+
// CHECK-DAG: ![[ArrayAllocated]] = !{ptr @"?BufferArray2@@3PAV?$RasterizerOrderedBuffer@T?$__vector@M$03@__clang@@@hlsl@@A", !"RasterizerOrderedBuffer<vector<float, 4> >", i32 10, i1 true, i32 4, i32 0}
19+
// CHECK-DAG: ![[SingleSpace]] = !{ptr @"?Buffer3@@3V?$RasterizerOrderedBuffer@M@hlsl@@A", !"RasterizerOrderedBuffer<float>", i32 10, i1 true, i32 3, i32 1}
20+
// CHECK-DAG: ![[ArraySpace]] = !{ptr @"?BufferArray3@@3PAV?$RasterizerOrderedBuffer@T?$__vector@M$03@__clang@@@hlsl@@A", !"RasterizerOrderedBuffer<vector<float, 4> >", i32 10, i1 true, i32 4, i32 1}

0 commit comments

Comments
 (0)