@@ -67,6 +67,13 @@ static DXGI_FORMAT getDXFormat(DataFormat Format, int Channels) {
6767 DXFormats (SINT) break ;
6868 case DataFormat::Float32:
6969 DXFormats (FLOAT) break ;
70+ case DataFormat::UInt64:
71+ case DataFormat::Int64:
72+ if (Channels == 1 )
73+ return DXGI_FORMAT_R32G32_UINT;
74+ if (Channels == 2 )
75+ return DXGI_FORMAT_R32G32B32A32_UINT;
76+ llvm_unreachable (" Unsupported channel count for 64-bit format" );
7077 case DataFormat::Depth32:
7178 llvm_unreachable (
7279 " Depth32 format is not yet supported in the DirectX backend." );
@@ -162,7 +169,7 @@ static DXResourceKind getDXKind(offloadtest::ResourceKind RK) {
162169static llvm::Expected<D3D12_RESOURCE_DESC>
163170getResourceDescription (const Resource &R) {
164171 const D3D12_RESOURCE_DIMENSION Dimension = getDXDimension (R.Kind );
165- const offloadtest::Buffer &B = *R.BufferPtr ;
172+ const offloadtest::CPUBuffer &B = *R.BufferPtr ;
166173
167174 if (B.OutputProps .MipLevels != 1 )
168175 return llvm::createStringError (std::errc::not_supported,
@@ -270,6 +277,18 @@ static D3D12_UNORDERED_ACCESS_VIEW_DESC getUAVDescription(const Resource &R) {
270277
271278namespace {
272279
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+
273292class DXQueue : public offloadtest ::Queue {
274293public:
275294 ComPtr<ID3D12CommandQueue> Queue;
@@ -355,6 +374,41 @@ class DXDevice : public offloadtest::Device {
355374
356375 Queue &getGraphicsQueue () override { return GraphicsQueue; }
357376
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+
358412 static llvm::Expected<DXDevice> create (ComPtr<IDXCoreAdapter> Adapter,
359413 const DeviceConfig &Config) {
360414 ComPtr<ID3D12Device> Device;
@@ -569,7 +623,7 @@ class DXDevice : public offloadtest::Device {
569623 ComPtr<ID3D12Resource> Source) {
570624 addUploadBeginBarrier (IS, Destination);
571625 if (R.isTexture ()) {
572- const offloadtest::Buffer &B = *R.BufferPtr ;
626+ const offloadtest::CPUBuffer &B = *R.BufferPtr ;
573627 const D3D12_PLACED_SUBRESOURCE_FOOTPRINT Footprint{
574628 0 , CD3DX12_SUBRESOURCE_FOOTPRINT (
575629 getDXFormat (B.Format , B.Channels ), B.OutputProps .Width ,
@@ -1227,7 +1281,7 @@ class DXDevice : public offloadtest::Device {
12271281
12281282 auto CopyBackResource = [&IS, this ](ResourcePair &R) {
12291283 if (R.first ->isTexture ()) {
1230- const offloadtest::Buffer &B = *R.first ->BufferPtr ;
1284+ const offloadtest::CPUBuffer &B = *R.first ->BufferPtr ;
12311285 const D3D12_PLACED_SUBRESOURCE_FOOTPRINT Footprint{
12321286 0 , CD3DX12_SUBRESOURCE_FOOTPRINT (
12331287 getDXFormat (B.Format , B.Channels ), B.OutputProps .Width ,
@@ -1309,7 +1363,7 @@ class DXDevice : public offloadtest::Device {
13091363 // Map readback and copy into host buffer, accounting for row pitch and
13101364 // flipping vertical orientation. DirectX render target origin is top-left,
13111365 // while our image writer expects bottom-left.
1312- const Buffer &B = *P.Bindings .RTargetBufferPtr ;
1366+ const CPUBuffer &B = *P.Bindings .RTargetBufferPtr ;
13131367 void *Mapped = nullptr ;
13141368 if (auto Err = HR::toError (IS.RTReadback ->Map (0 , nullptr , &Mapped),
13151369 " Failed to map render target readback" ))
@@ -1351,7 +1405,7 @@ class DXDevice : public offloadtest::Device {
13511405 return llvm::createStringError (
13521406 std::errc::invalid_argument,
13531407 " No render target bound for graphics pipeline." );
1354- const Buffer &OutBuf = *P.Bindings .RTargetBufferPtr ;
1408+ const CPUBuffer &OutBuf = *P.Bindings .RTargetBufferPtr ;
13551409 if (OutBuf.OutputProps .MipLevels != 1 )
13561410 return llvm::createStringError (
13571411 std::errc::not_supported,
@@ -1405,7 +1459,7 @@ class DXDevice : public offloadtest::Device {
14051459 return llvm::createStringError (
14061460 std::errc::invalid_argument,
14071461 " No vertex buffer bound for graphics pipeline." );
1408- const Buffer &VB = *P.Bindings .VertexBufferPtr ;
1462+ const CPUBuffer &VB = *P.Bindings .VertexBufferPtr ;
14091463 const uint64_t VBSize = VB.size ();
14101464 D3D12_RESOURCE_DESC const Desc = CD3DX12_RESOURCE_DESC::Buffer (VBSize);
14111465 CD3DX12_HEAP_PROPERTIES HeapProps =
@@ -1542,7 +1596,7 @@ class DXDevice : public offloadtest::Device {
15421596 D3D12_RESOURCE_STATE_COPY_SOURCE);
15431597 IS.CmdList ->ResourceBarrier (1 , &Barrier);
15441598
1545- const Buffer &B = *P.Bindings .RTargetBufferPtr ;
1599+ const CPUBuffer &B = *P.Bindings .RTargetBufferPtr ;
15461600 const D3D12_PLACED_SUBRESOURCE_FOOTPRINT Footprint{
15471601 0 ,
15481602 CD3DX12_SUBRESOURCE_FOOTPRINT (
@@ -1555,7 +1609,7 @@ class DXDevice : public offloadtest::Device {
15551609
15561610 auto CopyBackResource = [&IS, this ](ResourcePair &R) {
15571611 if (R.first ->isTexture ()) {
1558- const offloadtest::Buffer &B = *R.first ->BufferPtr ;
1612+ const offloadtest::CPUBuffer &B = *R.first ->BufferPtr ;
15591613 const D3D12_PLACED_SUBRESOURCE_FOOTPRINT Footprint{
15601614 0 , CD3DX12_SUBRESOURCE_FOOTPRINT (
15611615 getDXFormat (B.Format , B.Channels ), B.OutputProps .Width ,
0 commit comments