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