27
27
#include " HLSLTest/API/Pipeline.h"
28
28
#include " HLSLTest/WinError.h"
29
29
30
- #include " llvm/ADT/DenseMap.h"
31
30
#include " llvm/ADT/SmallVector.h"
32
31
#include " llvm/Support/Error.h"
33
32
@@ -83,11 +82,6 @@ class DXDevice : public hlsltest::Device {
83
82
};
84
83
85
84
struct InvocationState {
86
- // Resource references need to be the last things cleaned up, so put them at
87
- // the top.
88
- using Binding = std::pair<uint32_t , uint32_t >;
89
- llvm::DenseMap<Binding, UAVResourceSet> Outputs;
90
-
91
85
CComPtr<ID3D12RootSignature> RootSig;
92
86
CComPtr<ID3D12DescriptorHeap> DescHeap;
93
87
CComPtr<ID3D12PipelineState> PSO;
@@ -96,6 +90,7 @@ class DXDevice : public hlsltest::Device {
96
90
CComPtr<ID3D12GraphicsCommandList> CmdList;
97
91
CComPtr<ID3D12Fence> Fence;
98
92
HANDLE Event;
93
+ llvm::SmallVector<UAVResourceSet> Resources;
99
94
};
100
95
101
96
public:
@@ -388,10 +383,9 @@ class DXDevice : public hlsltest::Device {
388
383
D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);
389
384
Device->CreateUnorderedAccessView (Buffer, nullptr , &UAVDesc, UAVHandle);
390
385
391
- std::pair<uint32_t , uint32_t > Binding = {R.DXBinding .Register ,
392
- R.DXBinding .Space };
393
386
UAVResourceSet Resources = {UploadBuffer, Buffer, ReadBackBuffer};
394
- IS.Outputs .insert (std::make_pair (Binding, Resources));
387
+ IS.Resources .push_back (Resources);
388
+
395
389
return llvm::Error::success ();
396
390
}
397
391
@@ -526,31 +520,31 @@ class DXDevice : public hlsltest::Device {
526
520
IS.CmdList ->Dispatch (P.DispatchSize [0 ], P.DispatchSize [1 ],
527
521
P.DispatchSize [2 ]);
528
522
529
- for (auto &Out : IS.Outputs ) {
530
- addReadbackBeginBarrier (IS, Out.second . Buffer );
531
- IS.CmdList ->CopyResource (Out.second . Readback , Out. second .Buffer );
532
- addReadbackEndBarrier (IS, Out.second . Buffer );
523
+ for (auto &Out : IS.Resources ) {
524
+ addReadbackBeginBarrier (IS, Out.Buffer );
525
+ IS.CmdList ->CopyResource (Out.Readback , Out.Buffer );
526
+ addReadbackEndBarrier (IS, Out.Buffer );
533
527
}
534
528
}
535
529
536
530
llvm::Error readBack (Pipeline &P, InvocationState &IS) {
531
+ auto ResourcesIterator = IS.Resources .begin ();
537
532
for (auto &S : P.Sets ) {
538
533
for (auto &R : S.Resources ) {
539
- if (R.Access != DataAccess::ReadWrite)
540
- continue ;
541
- auto ResourcePair = IS.Outputs .find (
542
- std::make_pair (R.DXBinding .Register , R.DXBinding .Space ));
543
- if (ResourcePair == IS.Outputs .end ())
544
- return llvm::createStringError (std::errc::no_such_device_or_address,
545
- " Failed to find binding." );
546
-
547
- void *DataPtr;
548
- if (auto Err = HR::toError (
549
- ResourcePair->second .Readback ->Map (0 , nullptr , &DataPtr),
550
- " Failed to map result." ))
551
- return Err;
552
- memcpy (R.Data .get (), DataPtr, R.Size );
553
- ResourcePair->second .Readback ->Unmap (0 , nullptr );
534
+ if (ResourcesIterator == IS.Resources .end ())
535
+ return llvm::createStringError (
536
+ std::errc::no_such_device_or_address,
537
+ " Internal error: created resources doesn't match pipeline" );
538
+ if (R.Access == DataAccess::ReadWrite) {
539
+ void *DataPtr;
540
+ if (auto Err = HR::toError (
541
+ ResourcesIterator->Readback ->Map (0 , nullptr , &DataPtr),
542
+ " Failed to map result." ))
543
+ return Err;
544
+ memcpy (R.Data .get (), DataPtr, R.Size );
545
+ ResourcesIterator->Readback ->Unmap (0 , nullptr );
546
+ }
547
+ ++ResourcesIterator;
554
548
}
555
549
}
556
550
return llvm::Error::success ();
0 commit comments