@@ -73,7 +73,7 @@ static DXGI_FORMAT getDXFormat(DataFormat Format, int Channels) {
73
73
return DXGI_FORMAT_UNKNOWN;
74
74
}
75
75
76
- static DXGI_FORMAT getRawDXFormat (Resource &R) {
76
+ static DXGI_FORMAT getRawDXFormat (const Resource &R) {
77
77
if (!R.isByteAddressBuffer ())
78
78
return DXGI_FORMAT_UNKNOWN;
79
79
@@ -89,33 +89,50 @@ static DXGI_FORMAT getRawDXFormat(Resource &R) {
89
89
return DXGI_FORMAT_UNKNOWN;
90
90
}
91
91
92
- static uint32_t getUAVBufferSize (Resource &R) {
92
+ static uint32_t getUAVBufferSize (const Resource &R) {
93
93
return R.HasCounter
94
94
? llvm::alignTo (R.size (), D3D12_UAV_COUNTER_PLACEMENT_ALIGNMENT) +
95
95
sizeof (uint32_t )
96
96
: R.size ();
97
97
}
98
98
99
- static uint32_t getUAVBufferCounterOffset (Resource &R) {
99
+ static uint32_t getUAVBufferCounterOffset (const Resource &R) {
100
100
return R.HasCounter
101
101
? llvm::alignTo (R.size (), D3D12_UAV_COUNTER_PLACEMENT_ALIGNMENT)
102
102
: 0 ;
103
103
}
104
104
105
- namespace {
105
+ static D3D12_RESOURCE_DIMENSION getDXDimension (ResourceKind RK) {
106
+ switch (RK) {
107
+ case ResourceKind::Buffer:
108
+ case ResourceKind::StructuredBuffer:
109
+ case ResourceKind::ByteAddressBuffer:
110
+ case ResourceKind::RWStructuredBuffer:
111
+ case ResourceKind::RWBuffer:
112
+ case ResourceKind::RWByteAddressBuffer:
113
+ case ResourceKind::ConstantBuffer:
114
+ return D3D12_RESOURCE_DIMENSION_BUFFER;
115
+ case ResourceKind::Texture2D:
116
+ case ResourceKind::RWTexture2D:
117
+ return D3D12_RESOURCE_DIMENSION_TEXTURE2D;
118
+ }
119
+ llvm_unreachable (" All cases handled" );
120
+ }
106
121
107
122
enum DXResourceKind { UAV, SRV, CBV };
108
123
109
- DXResourceKind getDXKind (offloadtest::ResourceKind RK) {
124
+ static DXResourceKind getDXKind (offloadtest::ResourceKind RK) {
110
125
switch (RK) {
111
126
case ResourceKind::Buffer:
112
127
case ResourceKind::StructuredBuffer:
113
128
case ResourceKind::ByteAddressBuffer:
129
+ case ResourceKind::Texture2D:
114
130
return SRV;
115
131
116
132
case ResourceKind::RWStructuredBuffer:
117
133
case ResourceKind::RWBuffer:
118
134
case ResourceKind::RWByteAddressBuffer:
135
+ case ResourceKind::RWTexture2D:
119
136
return UAV;
120
137
121
138
case ResourceKind::ConstantBuffer:
@@ -124,6 +141,99 @@ DXResourceKind getDXKind(offloadtest::ResourceKind RK) {
124
141
llvm_unreachable (" All cases handled" );
125
142
}
126
143
144
+ static D3D12_RESOURCE_DESC getResourceDescription (const Resource &R) {
145
+ const D3D12_RESOURCE_DIMENSION Dimension = getDXDimension (R.Kind );
146
+ const offloadtest::Buffer &B = *R.BufferPtr ;
147
+ const DXGI_FORMAT Format =
148
+ R.isTexture () ? getDXFormat (B.Format , B.Channels ) : DXGI_FORMAT_UNKNOWN;
149
+ const uint32_t Width =
150
+ R.isTexture () ? B.OutputProps .Width : getUAVBufferSize (R);
151
+ const uint32_t Height = R.isTexture () ? B.OutputProps .Height : 1 ;
152
+ const D3D12_TEXTURE_LAYOUT Layout = R.isTexture ()
153
+ ? D3D12_TEXTURE_LAYOUT_UNKNOWN
154
+ : D3D12_TEXTURE_LAYOUT_ROW_MAJOR;
155
+ const D3D12_RESOURCE_FLAGS Flags =
156
+ R.isReadWrite () ? D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS
157
+ : D3D12_RESOURCE_FLAG_NONE;
158
+ const D3D12_RESOURCE_DESC ResDesc = {Dimension, 0 , Width, Height, 1 , 1 ,
159
+ Format, {1 , 0 }, Layout, Flags};
160
+ return ResDesc;
161
+ }
162
+
163
+ static D3D12_SHADER_RESOURCE_VIEW_DESC getSRVDescription (const Resource &R) {
164
+ const uint32_t EltSize = R.getElementSize ();
165
+ const uint32_t NumElts = R.size () / EltSize;
166
+
167
+ llvm::outs () << " EltSize = " << EltSize << " NumElts = " << NumElts
168
+ << " \n " ;
169
+ D3D12_SHADER_RESOURCE_VIEW_DESC Desc = {};
170
+ Desc.Format = R.isRaw ()
171
+ ? getRawDXFormat (R)
172
+ : getDXFormat (R.BufferPtr ->Format , R.BufferPtr ->Channels );
173
+ Desc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
174
+ switch (R.Kind ) {
175
+ case ResourceKind::Buffer:
176
+ case ResourceKind::StructuredBuffer:
177
+ case ResourceKind::ByteAddressBuffer:
178
+
179
+ Desc.ViewDimension = D3D12_SRV_DIMENSION_BUFFER;
180
+ Desc.Buffer =
181
+ D3D12_BUFFER_SRV{0 , NumElts, R.isStructuredBuffer () ? EltSize : 0 ,
182
+ R.isByteAddressBuffer () ? D3D12_BUFFER_SRV_FLAG_RAW
183
+ : D3D12_BUFFER_SRV_FLAG_NONE};
184
+ break ;
185
+ case ResourceKind::Texture2D:
186
+ Desc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D;
187
+ Desc.Texture2D = D3D12_TEX2D_SRV{0 , 1 , 0 , 0 };
188
+ break ;
189
+ case ResourceKind::RWStructuredBuffer:
190
+ case ResourceKind::RWBuffer:
191
+ case ResourceKind::RWByteAddressBuffer:
192
+ case ResourceKind::RWTexture2D:
193
+ case ResourceKind::ConstantBuffer:
194
+ llvm_unreachable (" Not an SRV type!" );
195
+ }
196
+ return Desc;
197
+ }
198
+
199
+ static D3D12_UNORDERED_ACCESS_VIEW_DESC getUAVDescription (const Resource &R) {
200
+ const uint32_t EltSize = R.getElementSize ();
201
+ const uint32_t NumElts = R.size () / EltSize;
202
+ const uint32_t CounterOffset = getUAVBufferCounterOffset (R);
203
+
204
+ llvm::outs () << " EltSize = " << EltSize << " NumElts = " << NumElts
205
+ << " \n " ;
206
+ D3D12_UNORDERED_ACCESS_VIEW_DESC Desc = {};
207
+ Desc.Format = R.isRaw ()
208
+ ? getRawDXFormat (R)
209
+ : getDXFormat (R.BufferPtr ->Format , R.BufferPtr ->Channels );
210
+ switch (R.Kind ) {
211
+ case ResourceKind::RWBuffer:
212
+ case ResourceKind::RWStructuredBuffer:
213
+ case ResourceKind::RWByteAddressBuffer:
214
+
215
+ Desc.ViewDimension = D3D12_UAV_DIMENSION_BUFFER;
216
+ Desc.Buffer = D3D12_BUFFER_UAV{
217
+ 0 , NumElts, R.isStructuredBuffer () ? EltSize : 0 , CounterOffset,
218
+ R.isByteAddressBuffer () ? D3D12_BUFFER_UAV_FLAG_RAW
219
+ : D3D12_BUFFER_UAV_FLAG_NONE};
220
+ break ;
221
+ case ResourceKind::RWTexture2D:
222
+ Desc.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE2D;
223
+ Desc.Texture2D = D3D12_TEX2D_UAV{0 , 0 };
224
+ break ;
225
+ case ResourceKind::StructuredBuffer:
226
+ case ResourceKind::Buffer:
227
+ case ResourceKind::ByteAddressBuffer:
228
+ case ResourceKind::Texture2D:
229
+ case ResourceKind::ConstantBuffer:
230
+ llvm_unreachable (" Not a UAV type!" );
231
+ }
232
+ return Desc;
233
+ }
234
+
235
+ namespace {
236
+
127
237
class DXDevice : public offloadtest ::Device {
128
238
private:
129
239
ComPtr<IDXCoreAdapter> Adapter;
@@ -377,8 +487,20 @@ class DXDevice : public offloadtest::Device {
377
487
ComPtr<ID3D12Resource> Destination,
378
488
ComPtr<ID3D12Resource> Source) {
379
489
addUploadBeginBarrier (IS, Destination);
380
- IS.CmdList ->CopyBufferRegion (Destination.Get (), 0 , Source.Get (), 0 ,
381
- R.size ());
490
+ if (R.isTexture ()) {
491
+ const offloadtest::Buffer &B = *R.BufferPtr ;
492
+ const D3D12_PLACED_SUBRESOURCE_FOOTPRINT Footprint{
493
+ 0 , CD3DX12_SUBRESOURCE_FOOTPRINT (
494
+ getDXFormat (B.Format , B.Channels ), B.OutputProps .Width ,
495
+ B.OutputProps .Height , 1 ,
496
+ B.OutputProps .Width * B.getElementSize ())};
497
+ const CD3DX12_TEXTURE_COPY_LOCATION DstLoc (Destination.Get (), 0 );
498
+ const CD3DX12_TEXTURE_COPY_LOCATION SrcLoc (Source.Get (), Footprint);
499
+
500
+ IS.CmdList ->CopyTextureRegion (&DstLoc, 0 , 0 , 0 , &SrcLoc, nullptr );
501
+ } else
502
+ IS.CmdList ->CopyBufferRegion (Destination.Get (), 0 , Source.Get (), 0 ,
503
+ R.size ());
382
504
addUploadEndBarrier (IS, Destination, R.isReadWrite ());
383
505
}
384
506
@@ -391,17 +513,7 @@ class DXDevice : public offloadtest::Device {
391
513
392
514
const D3D12_HEAP_PROPERTIES HeapProp =
393
515
CD3DX12_HEAP_PROPERTIES (D3D12_HEAP_TYPE_DEFAULT);
394
- const D3D12_RESOURCE_DESC ResDesc = {
395
- D3D12_RESOURCE_DIMENSION_BUFFER,
396
- 0 ,
397
- R.size (),
398
- 1 ,
399
- 1 ,
400
- 1 ,
401
- DXGI_FORMAT_UNKNOWN,
402
- {1 , 0 },
403
- D3D12_TEXTURE_LAYOUT_ROW_MAJOR,
404
- D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS};
516
+ const D3D12_RESOURCE_DESC ResDesc = getResourceDescription (R);
405
517
406
518
if (auto Err = HR::toError (Device->CreateCommittedResource (
407
519
&HeapProp, D3D12_HEAP_FLAG_NONE, &ResDesc,
@@ -438,22 +550,9 @@ class DXDevice : public offloadtest::Device {
438
550
439
551
void bindSRV (Resource &R, InvocationState &IS, const uint32_t HeapIdx,
440
552
ComPtr<ID3D12Resource> Buffer) {
441
- const uint32_t EltSize = R.getElementSize ();
442
- const uint32_t NumElts = R.size () / EltSize;
443
- DXGI_FORMAT const EltFormat =
444
- R.isRaw () ? getRawDXFormat (R)
445
- : getDXFormat (R.BufferPtr ->Format , R.BufferPtr ->Channels );
446
- const D3D12_SHADER_RESOURCE_VIEW_DESC SRVDesc = {
447
- EltFormat,
448
- D3D12_SRV_DIMENSION_BUFFER,
449
- D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING,
450
- {D3D12_BUFFER_SRV{0 , NumElts, R.isStructuredBuffer () ? EltSize : 0 ,
451
- R.isByteAddressBuffer ()
452
- ? D3D12_BUFFER_SRV_FLAG_RAW
453
- : D3D12_BUFFER_SRV_FLAG_NONE}}};
454
-
455
- llvm::outs () << " SRV: HeapIdx = " << HeapIdx << " EltSize = " << EltSize
456
- << " NumElts = " << NumElts << " \n " ;
553
+ llvm::outs () << " SRV: HeapIdx = " << HeapIdx << " \n " ;
554
+ const D3D12_SHADER_RESOURCE_VIEW_DESC SRVDesc = getSRVDescription (R);
555
+
457
556
D3D12_CPU_DESCRIPTOR_HANDLE SRVHandle =
458
557
IS.DescHeap ->GetCPUDescriptorHandleForHeapStart ();
459
558
SRVHandle.ptr += HeapIdx * Device->GetDescriptorHandleIncrementSize (
@@ -472,17 +571,7 @@ class DXDevice : public offloadtest::Device {
472
571
473
572
const D3D12_HEAP_PROPERTIES HeapProp =
474
573
CD3DX12_HEAP_PROPERTIES (D3D12_HEAP_TYPE_DEFAULT);
475
- const D3D12_RESOURCE_DESC ResDesc = {
476
- D3D12_RESOURCE_DIMENSION_BUFFER,
477
- 0 ,
478
- BufferSize,
479
- 1 ,
480
- 1 ,
481
- 1 ,
482
- DXGI_FORMAT_UNKNOWN,
483
- {1 , 0 },
484
- D3D12_TEXTURE_LAYOUT_ROW_MAJOR,
485
- D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS};
574
+ const D3D12_RESOURCE_DESC ResDesc = getResourceDescription (R);
486
575
487
576
if (auto Err = HR::toError (Device->CreateCommittedResource (
488
577
&HeapProp, D3D12_HEAP_FLAG_NONE, &ResDesc,
@@ -541,24 +630,10 @@ class DXDevice : public offloadtest::Device {
541
630
542
631
void bindUAV (Resource &R, InvocationState &IS, const uint32_t HeapIdx,
543
632
ComPtr<ID3D12Resource> Buffer) {
544
- const uint32_t EltSize = R.getElementSize ();
545
- const uint32_t NumElts = R.size () / EltSize;
546
633
ID3D12Resource *CounterBuffer = R.HasCounter ? Buffer.Get () : nullptr ;
547
- const uint32_t CounterOffset = getUAVBufferCounterOffset (R);
548
- DXGI_FORMAT const EltFormat =
549
- R.isRaw () ? getRawDXFormat (R)
550
- : getDXFormat (R.BufferPtr ->Format , R.BufferPtr ->Channels );
551
- const D3D12_UNORDERED_ACCESS_VIEW_DESC UAVDesc = {
552
- EltFormat,
553
- D3D12_UAV_DIMENSION_BUFFER,
554
- {D3D12_BUFFER_UAV{
555
- 0 , NumElts, R.isStructuredBuffer () ? EltSize : 0 , CounterOffset,
556
- R.isByteAddressBuffer () ? D3D12_BUFFER_UAV_FLAG_RAW
557
- : D3D12_BUFFER_UAV_FLAG_NONE}}};
558
-
559
- llvm::outs () << " UAV: HeapIdx = " << HeapIdx << " EltSize = " << EltSize
560
- << " NumElts = " << NumElts << " HasCounter = " << R.HasCounter
561
- << " \n " ;
634
+ llvm::outs () << " UAV: HeapIdx = " << HeapIdx << " \n " ;
635
+ const D3D12_UNORDERED_ACCESS_VIEW_DESC UAVDesc = getUAVDescription (R);
636
+
562
637
D3D12_CPU_DESCRIPTOR_HANDLE UAVHandle =
563
638
IS.DescHeap ->GetCPUDescriptorHandleForHeapStart ();
564
639
UAVHandle.ptr += HeapIdx * Device->GetDescriptorHandleIncrementSize (
@@ -891,7 +966,21 @@ class DXDevice : public offloadtest::Device {
891
966
if (R.second .Readback == nullptr )
892
967
return ;
893
968
addReadbackBeginBarrier (IS, R.second .Buffer );
894
- IS.CmdList ->CopyResource (R.second .Readback .Get (), R.second .Buffer .Get ());
969
+ if (R.first ->isTexture ()) {
970
+ const offloadtest::Buffer &B = *R.first ->BufferPtr ;
971
+ const D3D12_PLACED_SUBRESOURCE_FOOTPRINT Footprint{
972
+ 0 , CD3DX12_SUBRESOURCE_FOOTPRINT (
973
+ getDXFormat (B.Format , B.Channels ), B.OutputProps .Width ,
974
+ B.OutputProps .Height , 1 ,
975
+ B.OutputProps .Width * B.getElementSize ())};
976
+ const CD3DX12_TEXTURE_COPY_LOCATION DstLoc (R.second .Readback .Get (),
977
+ Footprint);
978
+ const CD3DX12_TEXTURE_COPY_LOCATION SrcLoc (R.second .Buffer .Get (), 0 );
979
+
980
+ IS.CmdList ->CopyTextureRegion (&DstLoc, 0 , 0 , 0 , &SrcLoc, nullptr );
981
+ } else
982
+ IS.CmdList ->CopyResource (R.second .Readback .Get (),
983
+ R.second .Buffer .Get ());
895
984
addReadbackEndBarrier (IS, R.second .Buffer );
896
985
};
897
986
0 commit comments