@@ -169,7 +169,7 @@ static DXResourceKind getDXKind(offloadtest::ResourceKind RK) {
169169static llvm::Expected<D3D12_RESOURCE_DESC>
170170getResourceDescription (const Resource &R) {
171171 const D3D12_RESOURCE_DIMENSION Dimension = getDXDimension (R.Kind );
172- const offloadtest::Buffer &B = *R.BufferPtr ;
172+ const offloadtest::CPUBuffer &B = *R.BufferPtr ;
173173
174174 if (B.OutputProps .MipLevels != 1 )
175175 return llvm::createStringError (std::errc::not_supported,
@@ -277,6 +277,18 @@ static D3D12_UNORDERED_ACCESS_VIEW_DESC getUAVDescription(const Resource &R) {
277277
278278namespace {
279279
280+ class DXBuffer : public offloadtest ::Buffer {
281+ public:
282+ ComPtr<ID3D12Resource> Buffer;
283+ std::string Name;
284+ BufferCreateDesc Desc;
285+ size_t SizeInBytes;
286+
287+ DXBuffer (ComPtr<ID3D12Resource> Buffer, llvm::StringRef Name,
288+ BufferCreateDesc Desc, size_t SizeInBytes)
289+ : Buffer(Buffer), Name(Name), Desc(Desc), SizeInBytes(SizeInBytes) {}
290+ };
291+
280292class DXQueue : public offloadtest ::Queue {
281293public:
282294 ComPtr<ID3D12CommandQueue> Queue;
@@ -362,6 +374,41 @@ class DXDevice : public offloadtest::Device {
362374
363375 Queue &getGraphicsQueue () override { return GraphicsQueue; }
364376
377+ llvm::Expected<std::shared_ptr<offloadtest::Buffer>>
378+ createBuffer (std::string Name, BufferCreateDesc &Desc,
379+ size_t SizeInBytes) override {
380+
381+ D3D12_HEAP_TYPE HeapType = D3D12_HEAP_TYPE_DEFAULT;
382+ switch (Desc.Location ) {
383+ case MemoryLocation::GpuOnly:
384+ HeapType = D3D12_HEAP_TYPE_DEFAULT;
385+ break ;
386+ case MemoryLocation::CpuToGpu:
387+ HeapType = D3D12_HEAP_TYPE_UPLOAD;
388+ break ;
389+ case MemoryLocation::GpuToCpu:
390+ HeapType = D3D12_HEAP_TYPE_READBACK;
391+ break ;
392+ }
393+
394+ const D3D12_RESOURCE_FLAGS Flags =
395+ D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS;
396+
397+ const D3D12_HEAP_PROPERTIES HeapProps = CD3DX12_HEAP_PROPERTIES (HeapType);
398+ const D3D12_RESOURCE_DESC BufferDesc =
399+ CD3DX12_RESOURCE_DESC::Buffer (SizeInBytes, Flags);
400+
401+ ComPtr<ID3D12Resource> DeviceBuffer;
402+ if (auto Err = HR::toError (Device->CreateCommittedResource (
403+ &HeapProps, D3D12_HEAP_FLAG_NONE,
404+ &BufferDesc, D3D12_RESOURCE_STATE_COMMON,
405+ nullptr , IID_PPV_ARGS (&DeviceBuffer)),
406+ " Failed to create buffer." ))
407+ return Err;
408+
409+ return std::make_shared<DXBuffer>(DeviceBuffer, Name, Desc, SizeInBytes);
410+ }
411+
365412 static llvm::Expected<DXDevice> create (ComPtr<IDXCoreAdapter> Adapter,
366413 const DeviceConfig &Config) {
367414 ComPtr<ID3D12Device> Device;
@@ -576,7 +623,7 @@ class DXDevice : public offloadtest::Device {
576623 ComPtr<ID3D12Resource> Source) {
577624 addUploadBeginBarrier (IS, Destination);
578625 if (R.isTexture ()) {
579- const offloadtest::Buffer &B = *R.BufferPtr ;
626+ const offloadtest::CPUBuffer &B = *R.BufferPtr ;
580627 const D3D12_PLACED_SUBRESOURCE_FOOTPRINT Footprint{
581628 0 , CD3DX12_SUBRESOURCE_FOOTPRINT (
582629 getDXFormat (B.Format , B.Channels ), B.OutputProps .Width ,
@@ -1234,7 +1281,7 @@ class DXDevice : public offloadtest::Device {
12341281
12351282 auto CopyBackResource = [&IS, this ](ResourcePair &R) {
12361283 if (R.first ->isTexture ()) {
1237- const offloadtest::Buffer &B = *R.first ->BufferPtr ;
1284+ const offloadtest::CPUBuffer &B = *R.first ->BufferPtr ;
12381285 const D3D12_PLACED_SUBRESOURCE_FOOTPRINT Footprint{
12391286 0 , CD3DX12_SUBRESOURCE_FOOTPRINT (
12401287 getDXFormat (B.Format , B.Channels ), B.OutputProps .Width ,
@@ -1316,7 +1363,7 @@ class DXDevice : public offloadtest::Device {
13161363 // Map readback and copy into host buffer, accounting for row pitch and
13171364 // flipping vertical orientation. DirectX render target origin is top-left,
13181365 // while our image writer expects bottom-left.
1319- const Buffer &B = *P.Bindings .RTargetBufferPtr ;
1366+ const CPUBuffer &B = *P.Bindings .RTargetBufferPtr ;
13201367 void *Mapped = nullptr ;
13211368 if (auto Err = HR::toError (IS.RTReadback ->Map (0 , nullptr , &Mapped),
13221369 " Failed to map render target readback" ))
@@ -1358,7 +1405,7 @@ class DXDevice : public offloadtest::Device {
13581405 return llvm::createStringError (
13591406 std::errc::invalid_argument,
13601407 " No render target bound for graphics pipeline." );
1361- const Buffer &OutBuf = *P.Bindings .RTargetBufferPtr ;
1408+ const CPUBuffer &OutBuf = *P.Bindings .RTargetBufferPtr ;
13621409 if (OutBuf.OutputProps .MipLevels != 1 )
13631410 return llvm::createStringError (
13641411 std::errc::not_supported,
@@ -1412,7 +1459,7 @@ class DXDevice : public offloadtest::Device {
14121459 return llvm::createStringError (
14131460 std::errc::invalid_argument,
14141461 " No vertex buffer bound for graphics pipeline." );
1415- const Buffer &VB = *P.Bindings .VertexBufferPtr ;
1462+ const CPUBuffer &VB = *P.Bindings .VertexBufferPtr ;
14161463 const uint64_t VBSize = VB.size ();
14171464 D3D12_RESOURCE_DESC const Desc = CD3DX12_RESOURCE_DESC::Buffer (VBSize);
14181465 CD3DX12_HEAP_PROPERTIES HeapProps =
@@ -1549,7 +1596,7 @@ class DXDevice : public offloadtest::Device {
15491596 D3D12_RESOURCE_STATE_COPY_SOURCE);
15501597 IS.CmdList ->ResourceBarrier (1 , &Barrier);
15511598
1552- const Buffer &B = *P.Bindings .RTargetBufferPtr ;
1599+ const CPUBuffer &B = *P.Bindings .RTargetBufferPtr ;
15531600 const D3D12_PLACED_SUBRESOURCE_FOOTPRINT Footprint{
15541601 0 ,
15551602 CD3DX12_SUBRESOURCE_FOOTPRINT (
@@ -1562,7 +1609,7 @@ class DXDevice : public offloadtest::Device {
15621609
15631610 auto CopyBackResource = [&IS, this ](ResourcePair &R) {
15641611 if (R.first ->isTexture ()) {
1565- const offloadtest::Buffer &B = *R.first ->BufferPtr ;
1612+ const offloadtest::CPUBuffer &B = *R.first ->BufferPtr ;
15661613 const D3D12_PLACED_SUBRESOURCE_FOOTPRINT Footprint{
15671614 0 , CD3DX12_SUBRESOURCE_FOOTPRINT (
15681615 getDXFormat (B.Format , B.Channels ), B.OutputProps .Width ,
0 commit comments