Skip to content

Commit 7a10369

Browse files
authored
[HLSL] Change StructuredBuffer resource class to SRV (#113397)
Change `StructuredBuffer` resource class to SRV (read-only) to match DXC. Part of #112775
1 parent 141574b commit 7a10369

7 files changed

+45
-41
lines changed

clang/lib/Sema/HLSLExternalSemaSource.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -513,7 +513,7 @@ void HLSLExternalSemaSource::defineHLSLTypesWithForwardDeclarations() {
513513
.addSimpleTemplateParams(*SemaPtr, {"element_type"})
514514
.Record;
515515
onCompletion(Decl, [this](CXXRecordDecl *Decl) {
516-
setupBufferType(Decl, *SemaPtr, ResourceClass::UAV,
516+
setupBufferType(Decl, *SemaPtr, ResourceClass::SRV,
517517
ResourceKind::TypedBuffer, /*IsROV=*/false,
518518
/*RawBuffer=*/true)
519519
.addArraySubscriptOperators()

clang/test/AST/HLSL/StructuredBuffer-AST.hlsl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ StructuredBuffer<float> Buffer;
3131

3232
// CHECK: FinalAttr 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> Implicit final
3333
// CHECK-NEXT: FieldDecl 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> <invalid sloc> implicit h '__hlsl_resource_t
34-
// CHECK-SAME{LITERAL}: [[hlsl::resource_class(UAV)]]
34+
// CHECK-SAME{LITERAL}: [[hlsl::resource_class(SRV)]]
3535
// CHECK-SAME{LITERAL}: [[hlsl::raw_buffer]]
3636
// CHECK-SAME{LITERAL}: [[hlsl::contained_type(element_type)]]
3737
// CHECK-NEXT: HLSLResourceAttr 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> Implicit TypedBuffer
@@ -58,7 +58,7 @@ StructuredBuffer<float> Buffer;
5858
// CHECK-NEXT: BuiltinType 0x{{[0-9A-Fa-f]+}} 'float'
5959
// CHECK-NEXT: FinalAttr 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> Implicit final
6060
// CHECK-NEXT: FieldDecl 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> <invalid sloc> implicit h '__hlsl_resource_t
61-
// CHECK-SAME{LITERAL}: [[hlsl::resource_class(UAV)]]
61+
// CHECK-SAME{LITERAL}: [[hlsl::resource_class(SRV)]]
6262
// CHECK-SAME{LITERAL}: [[hlsl::raw_buffer]]
6363
// CHECK-SAME{LITERAL}: [[hlsl::contained_type(float)]]
6464
// CHECK-NEXT: HLSLResourceAttr 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> Implicit TypedBuffer

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,17 @@
33
StructuredBuffer<float> Buffer1;
44
StructuredBuffer<vector<float, 4> > BufferArray[4];
55

6-
StructuredBuffer<float> Buffer2 : register(u3);
7-
StructuredBuffer<vector<float, 4> > BufferArray2[4] : register(u4);
6+
StructuredBuffer<float> Buffer2 : register(t3);
7+
StructuredBuffer<vector<float, 4> > BufferArray2[4] : register(t4);
88

9-
StructuredBuffer<float> Buffer3 : register(u3, space1);
10-
StructuredBuffer<vector<float, 4> > BufferArray3[4] : register(u4, space1);
9+
StructuredBuffer<float> Buffer3 : register(t3, space1);
10+
StructuredBuffer<vector<float, 4> > BufferArray3[4] : register(t4, space1);
1111

1212
[numthreads(1,1,1)]
1313
void main() {
1414
}
1515

16-
// CHECK: !hlsl.uavs = !{![[Single:[0-9]+]], ![[Array:[0-9]+]], ![[SingleAllocated:[0-9]+]], ![[ArrayAllocated:[0-9]+]], ![[SingleSpace:[0-9]+]], ![[ArraySpace:[0-9]+]]}
16+
// CHECK: !hlsl.srvs = !{![[Single:[0-9]+]], ![[Array:[0-9]+]], ![[SingleAllocated:[0-9]+]], ![[ArrayAllocated:[0-9]+]], ![[SingleSpace:[0-9]+]], ![[ArraySpace:[0-9]+]]}
1717
// CHECK-DAG: ![[Single]] = !{ptr @Buffer1, i32 10, i32 9, i1 false, i32 -1, i32 0}
1818
// CHECK-DAG: ![[Array]] = !{ptr @BufferArray, i32 10, i32 9, i1 false, i32 -1, i32 0}
1919
// CHECK-DAG: ![[SingleAllocated]] = !{ptr @Buffer2, i32 10, i32 9, i1 false, i32 3, i32 0}

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33

44
// NOTE: SPIRV codegen for resource types is not yet implemented
55

6-
StructuredBuffer<float> Buf : register(u10);
6+
StructuredBuffer<float> Buf : register(t10);
77

8-
// CHECK: %"class.hlsl::StructuredBuffer" = type { target("dx.RawBuffer", float, 1, 0), float }
8+
// CHECK: %"class.hlsl::StructuredBuffer" = type { target("dx.RawBuffer", float, 0, 0), float }
99
// CHECK: @Buf = global %"class.hlsl::StructuredBuffer" zeroinitializer, align 4
1010

1111
// CHECK: define linkonce_odr void @_ZN4hlsl16StructuredBufferIfEC2Ev(ptr noundef nonnull align 4 dereferenceable(8) %this)
@@ -18,7 +18,7 @@ StructuredBuffer<float> Buf : register(u10);
1818

1919
// CHECK: define internal void @_init_resource_bindings() {
2020
// CHECK-NEXT: entry:
21-
// CHECK-DXIL-NEXT: %Buf_h = call target("dx.RawBuffer", float, 1, 0) @llvm.dx.handle.fromBinding.tdx.RawBuffer_f32_1_0t(i32 0, i32 10, i32 1, i32 0, i1 false)
22-
// CHECK-DXIL-NEXT: store target("dx.RawBuffer", float, 1, 0) %Buf_h, ptr @Buf, align 4
23-
// CHECK-SPIRV-NEXT: %Buf_h = call target("dx.RawBuffer", float, 1, 0) @llvm.spv.handle.fromBinding.tdx.RawBuffer_f32_1_0t(i32 0, i32 10, i32 1, i32 0, i1 false)
24-
// CHECK-SPIRV-NEXT: store target("dx.RawBuffer", float, 1, 0) %Buf_h, ptr @Buf", align 4
21+
// CHECK-DXIL-NEXT: %Buf_h = call target("dx.RawBuffer", float, 0, 0) @llvm.dx.handle.fromBinding.tdx.RawBuffer_f32_0_0t(i32 0, i32 10, i32 1, i32 0, i1 false)
22+
// CHECK-DXIL-NEXT: store target("dx.RawBuffer", float, 0, 0) %Buf_h, ptr @Buf, align 4
23+
// CHECK-SPIRV-NEXT: %Buf_h = call target("dx.RawBuffer", float, 0, 0) @llvm.spv.handle.fromBinding.tdx.RawBuffer_f32_0_0t(i32 0, i32 10, i32 1, i32 0, i1 false)
24+
// CHECK-SPIRV-NEXT: store target("dx.RawBuffer", float, 0, 0) %Buf_h, ptr @Buf", align 4

clang/test/CodeGenHLSL/builtins/StructuredBuffer-elementtype.hlsl

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,19 @@
44
// likely change once subscript operators are properly implemented (llvm/llvm-project#95956)
55
// and theinterim field of the contained type is removed.
66

7-
// CHECK: %"class.hlsl::StructuredBuffer" = type <{ target("dx.RawBuffer", i16, 1, 0)
8-
// CHECK: %"class.hlsl::StructuredBuffer.0" = type <{ target("dx.RawBuffer", i16, 1, 0)
9-
// CHECK: %"class.hlsl::StructuredBuffer.2" = type { target("dx.RawBuffer", i32, 1, 0)
10-
// CHECK: %"class.hlsl::StructuredBuffer.3" = type { target("dx.RawBuffer", i32, 1, 0)
11-
// CHECK: %"class.hlsl::StructuredBuffer.4" = type { target("dx.RawBuffer", i64, 1, 0)
12-
// CHECK: %"class.hlsl::StructuredBuffer.5" = type { target("dx.RawBuffer", i64, 1, 0)
13-
// CHECK: %"class.hlsl::StructuredBuffer.6" = type <{ target("dx.RawBuffer", half, 1, 0)
14-
// CHECK: %"class.hlsl::StructuredBuffer.8" = type { target("dx.RawBuffer", float, 1, 0)
15-
// CHECK: %"class.hlsl::StructuredBuffer.9" = type { target("dx.RawBuffer", double, 1, 0)
16-
// CHECK: %"class.hlsl::StructuredBuffer.10" = type { target("dx.RawBuffer", <4 x i16>, 1, 0)
17-
// CHECK: %"class.hlsl::StructuredBuffer.11" = type { target("dx.RawBuffer", <3 x i32>, 1, 0)
18-
// CHECK: %"class.hlsl::StructuredBuffer.12" = type { target("dx.RawBuffer", <2 x half>, 1, 0)
19-
// CHECK: %"class.hlsl::StructuredBuffer.13" = type { target("dx.RawBuffer", <3 x float>, 1, 0)
7+
// CHECK: %"class.hlsl::StructuredBuffer" = type <{ target("dx.RawBuffer", i16, 0, 0)
8+
// CHECK: %"class.hlsl::StructuredBuffer.0" = type <{ target("dx.RawBuffer", i16, 0, 0)
9+
// CHECK: %"class.hlsl::StructuredBuffer.2" = type { target("dx.RawBuffer", i32, 0, 0)
10+
// CHECK: %"class.hlsl::StructuredBuffer.3" = type { target("dx.RawBuffer", i32, 0, 0)
11+
// CHECK: %"class.hlsl::StructuredBuffer.4" = type { target("dx.RawBuffer", i64, 0, 0)
12+
// CHECK: %"class.hlsl::StructuredBuffer.5" = type { target("dx.RawBuffer", i64, 0, 0)
13+
// CHECK: %"class.hlsl::StructuredBuffer.6" = type <{ target("dx.RawBuffer", half, 0, 0)
14+
// CHECK: %"class.hlsl::StructuredBuffer.8" = type { target("dx.RawBuffer", float, 0, 0)
15+
// CHECK: %"class.hlsl::StructuredBuffer.9" = type { target("dx.RawBuffer", double, 0, 0)
16+
// CHECK: %"class.hlsl::StructuredBuffer.10" = type { target("dx.RawBuffer", <4 x i16>, 0, 0)
17+
// CHECK: %"class.hlsl::StructuredBuffer.11" = type { target("dx.RawBuffer", <3 x i32>, 0, 0)
18+
// CHECK: %"class.hlsl::StructuredBuffer.12" = type { target("dx.RawBuffer", <2 x half>, 0, 0)
19+
// CHECK: %"class.hlsl::StructuredBuffer.13" = type { target("dx.RawBuffer", <3 x float>, 0, 0)
2020

2121
StructuredBuffer<int16_t> BufI16;
2222
StructuredBuffer<uint16_t> BufU16;
@@ -40,19 +40,19 @@ StructuredBuffer<float3> BufF32x3;
4040

4141
[numthreads(1,1,1)]
4242
void main(int GI : SV_GroupIndex) {
43-
BufI16[GI] = 0;
44-
BufU16[GI] = 0;
45-
BufI32[GI] = 0;
46-
BufU32[GI] = 0;
47-
BufI64[GI] = 0;
48-
BufU64[GI] = 0;
49-
BufF16[GI] = 0;
50-
BufF32[GI] = 0;
51-
BufF64[GI] = 0;
52-
BufI16x4[GI] = 0;
53-
BufU32x3[GI] = 0;
54-
BufF16x2[GI] = 0;
55-
BufF32x3[GI] = 0;
43+
int16_t v1 = BufI16[GI];
44+
uint16_t v2 = BufU16[GI];
45+
int v3 = BufI32[GI];
46+
uint v4 = BufU32[GI];
47+
int64_t v5 = BufI64[GI];
48+
uint64_t v6 = BufU64[GI];
49+
half v7 = BufF16[GI];
50+
float v8 = BufF32[GI];
51+
double v9 = BufF64[GI];
52+
vector<int16_t,4> v10 = BufI16x4[GI];
53+
vector<int, 3> v11 = BufU32x3[GI];
54+
half2 v12 = BufF16x2[GI];
55+
float3 v13 = BufF32x3[GI];
5656
}
5757

5858
// CHECK: !{{[0-9]+}} = !{ptr @BufI16, i32 10, i32 2,

clang/test/CodeGenHLSL/builtins/StructuredBuffer-subscript.hlsl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-compute -emit-llvm -o - -O0 %s | FileCheck %s
22

3+
// FIXME: This tests will fail once StructuredBuffer subscript operator is properly
4+
// implemented (llvm-project/llvm#112977). StructuredBuffer is a read-only resource
5+
// and the result of a subscript operator cannot be assigned to.
6+
37
StructuredBuffer<int> In;
48
StructuredBuffer<int> Out;
59

clang/test/CodeGenHLSL/builtins/hlsl_resource_t.hlsl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
using handle_float_t = __hlsl_resource_t [[hlsl::resource_class(UAV)]] [[hlsl::contained_type(float)]];
44

55
// CHECK: %"class.hlsl::RWBuffer" = type { target("dx.TypedBuffer", <4 x float>, 1, 0, 0)
6-
// CHECK: %"class.hlsl::StructuredBuffer" = type { target("dx.RawBuffer", %struct.MyStruct = type { <4 x float>, <2 x i32>, [8 x i8] }, 1, 0)
6+
// CHECK: %"class.hlsl::StructuredBuffer" = type { target("dx.RawBuffer", %struct.MyStruct = type { <4 x float>, <2 x i32>, [8 x i8] }, 0, 0)
77

88
// CHECK: define void @_Z2faU9_Res_u_CTfu17__hlsl_resource_t(target("dx.TypedBuffer", float, 1, 0, 0) %a)
99
// CHECK: call void @_Z4foo1U9_Res_u_CTfu17__hlsl_resource_t(target("dx.TypedBuffer", float, 1, 0, 0) %0)

0 commit comments

Comments
 (0)