Skip to content

Commit 02e02b9

Browse files
authored
[HLSL] Define RasterizerOrderedBuffer resource
Define HLSL's RasterizerOrderedBuffer resource type through the external sema source. This doesn't fully work as is, but defining it allows us to exercise the ROV logic in the DirectX backend from HLSL rather than having to manually edit metadata, so it's useful for further testing and development. Pull Request: #74897
1 parent 9596676 commit 02e02b9

File tree

2 files changed

+37
-6
lines changed

2 files changed

+37
-6
lines changed

clang/lib/Sema/HLSLExternalSemaSource.cpp

Lines changed: 17 additions & 6 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;
122122
Record->addAttr(HLSLResourceAttr::CreateImplicit(Record->getASTContext(),
123-
RC, RK, /*IsROV=*/false));
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,7 +493,18 @@ 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)
497+
.addArraySubscriptOperators()
498+
.completeDefinition();
499+
});
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)
497508
.addArraySubscriptOperators()
498509
.completeDefinition();
499510
});
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-pixel -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+
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)