@@ -149,9 +149,14 @@ static D3D12_RESOURCE_DESC getResourceDescription(const Resource &R) {
149149 const uint32_t Width =
150150 R.isTexture () ? B.OutputProps .Width : getUAVBufferSize (R);
151151 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;
152+ D3D12_TEXTURE_LAYOUT Layout;
153+ if (R.isTexture ())
154+ Layout = getDXKind (R.Kind ) == SRV
155+ ? D3D12_TEXTURE_LAYOUT_64KB_UNDEFINED_SWIZZLE
156+ : D3D12_TEXTURE_LAYOUT_UNKNOWN;
157+ else
158+ Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR;
159+
155160 const D3D12_RESOURCE_FLAGS Flags =
156161 R.isReadWrite () ? D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS
157162 : D3D12_RESOURCE_FLAG_NONE;
@@ -244,9 +249,11 @@ class DXDevice : public offloadtest::Device {
244249 ComPtr<ID3D12Resource> Upload;
245250 ComPtr<ID3D12Resource> Buffer;
246251 ComPtr<ID3D12Resource> Readback;
252+ ComPtr<ID3D12Heap> Heap;
247253 ResourceSet (ComPtr<ID3D12Resource> Upload, ComPtr<ID3D12Resource> Buffer,
248- ComPtr<ID3D12Resource> Readback)
249- : Upload(Upload), Buffer(Buffer), Readback(Readback) {}
254+ ComPtr<ID3D12Resource> Readback,
255+ ComPtr<ID3D12Heap> Heap = nullptr )
256+ : Upload(Upload), Buffer(Buffer), Readback(Readback), Heap(Heap) {}
250257 };
251258
252259 // ResourceBundle will contain one ResourceSet for a singular resource
@@ -521,51 +528,107 @@ class DXDevice : public offloadtest::Device {
521528 addUploadEndBarrier (IS, Destination, R.isReadWrite ());
522529 }
523530
531+ UINT getNumTiles (std::optional<uint32_t > NumTiles, uint32_t Width) {
532+ UINT Ret;
533+ if (NumTiles.has_value ())
534+ Ret = static_cast <UINT>(*NumTiles);
535+ else {
536+ // Map the entire buffer by computing how many 64KB tiles cover it
537+ Ret = static_cast <UINT>(
538+ (Width + D3D12_TILED_RESOURCE_TILE_SIZE_IN_BYTES - 1 ) /
539+ D3D12_TILED_RESOURCE_TILE_SIZE_IN_BYTES);
540+ // check for overflow
541+ assert (Width < std::numeric_limits<UINT>::max () -
542+ D3D12_TILED_RESOURCE_TILE_SIZE_IN_BYTES - 1 );
543+ }
544+ return Ret;
545+ }
546+
524547 llvm::Expected<ResourceBundle> createSRV (Resource &R, InvocationState &IS) {
525548 ResourceBundle Bundle;
526-
527- const D3D12_HEAP_PROPERTIES HeapProp =
528- CD3DX12_HEAP_PROPERTIES (D3D12_HEAP_TYPE_DEFAULT);
529549 const D3D12_RESOURCE_DESC ResDesc = getResourceDescription (R);
530- const D3D12_HEAP_PROPERTIES UploadHeapProp =
531- CD3DX12_HEAP_PROPERTIES (D3D12_HEAP_TYPE_UPLOAD);
532550 const D3D12_RESOURCE_DESC UploadResDesc =
533551 CD3DX12_RESOURCE_DESC::Buffer (R.size ());
552+ const D3D12_HEAP_PROPERTIES UploadHeapProps =
553+ CD3DX12_HEAP_PROPERTIES (D3D12_HEAP_TYPE_UPLOAD);
534554
535555 uint32_t RegOffset = 0 ;
556+
536557 for (const auto &ResData : R.BufferPtr ->Data ) {
537558 llvm::outs () << " Creating SRV: { Size = " << R.size () << " , Register = t"
538559 << R.DXBinding .Register + RegOffset
539- << " , Space = " << R.DXBinding .Space << " }\n " ;
560+ << " , Space = " << R.DXBinding .Space ;
561+
562+ if (R.TilesMapped )
563+ llvm::outs () << " , TilesMapped = " << *R.TilesMapped ;
564+ llvm::outs () << " }\n " ;
540565
541566 ComPtr<ID3D12Resource> Buffer;
542- if (auto Err = HR::toError (
543- Device->CreateCommittedResource (
544- &HeapProp, D3D12_HEAP_FLAG_NONE, &ResDesc ,
545- D3D12_RESOURCE_STATE_COMMON, nullptr , IID_PPV_ARGS (&Buffer)),
546- " Failed to create committed resource (buffer)." ))
567+ if (auto Err =
568+ HR::toError ( Device->CreateReservedResource (
569+ &ResDesc, D3D12_RESOURCE_STATE_COMMON, nullptr ,
570+ IID_PPV_ARGS (&Buffer)),
571+ " Failed to create reserved resource (buffer)." ))
547572 return Err;
548573
574+ // Committed upload buffer
549575 ComPtr<ID3D12Resource> UploadBuffer;
550576 if (auto Err = HR::toError (
551577 Device->CreateCommittedResource (
552- &UploadHeapProp , D3D12_HEAP_FLAG_NONE, &UploadResDesc,
578+ &UploadHeapProps , D3D12_HEAP_FLAG_NONE, &UploadResDesc,
553579 D3D12_RESOURCE_STATE_GENERIC_READ, nullptr ,
554580 IID_PPV_ARGS (&UploadBuffer)),
555581 " Failed to create committed resource (upload buffer)." ))
556582 return Err;
557583
558- // Initialize the SRV data
584+ // Tile mapping setup (only skipped when TilesMapped is set to 0)
585+ const UINT NumTiles = getNumTiles (R.TilesMapped , ResDesc.Width );
586+ ComPtr<ID3D12Heap> Heap; // optional, only created if NumTiles > 0
587+
588+ if (NumTiles > 0 ) {
589+ // Create a Heap large enough for the mapped tiles
590+ D3D12_HEAP_DESC HeapDesc = {};
591+ HeapDesc.Properties = CD3DX12_HEAP_PROPERTIES (D3D12_HEAP_TYPE_DEFAULT);
592+ HeapDesc.Alignment = D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT;
593+ HeapDesc.SizeInBytes = static_cast <UINT64>(NumTiles) *
594+ D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT;
595+ HeapDesc.Flags = D3D12_HEAP_FLAG_ALLOW_ALL_BUFFERS_AND_TEXTURES;
596+
597+ if (auto Err =
598+ HR::toError (Device->CreateHeap (&HeapDesc, IID_PPV_ARGS (&Heap)),
599+ " Failed to create heap for tiled SRV resource." ))
600+ return Err;
601+
602+ // Define one contiguous mapping region
603+ const D3D12_TILED_RESOURCE_COORDINATE StartCoord = {0 , 0 , 0 , 0 };
604+ D3D12_TILE_REGION_SIZE RegionSize = {};
605+ RegionSize.NumTiles = NumTiles;
606+ RegionSize.UseBox = FALSE ;
607+
608+ const D3D12_TILE_RANGE_FLAGS RangeFlag = D3D12_TILE_RANGE_FLAG_NONE;
609+ const UINT HeapRangeStartOffset = 0 ;
610+ const UINT RangeTileCount = NumTiles;
611+
612+ ID3D12CommandQueue *CommandQueue = IS.Queue .Get ();
613+ CommandQueue->UpdateTileMappings (
614+ Buffer.Get (), 1 , &StartCoord, &RegionSize, // One region
615+ Heap.Get (), 1 , &RangeFlag, &HeapRangeStartOffset, &RangeTileCount,
616+ D3D12_TILE_MAPPING_FLAG_NONE);
617+ }
618+
619+ // Upload data initialization
559620 void *ResDataPtr = nullptr ;
560- if (auto Err = HR::toError (UploadBuffer->Map (0 , nullptr , &ResDataPtr),
561- " Failed to acquire UAV data pointer." ))
562- return Err;
563- memcpy (ResDataPtr, ResData.get (), R.size ());
564- UploadBuffer->Unmap (0 , nullptr );
621+ if (SUCCEEDED (UploadBuffer->Map (0 , NULL , &ResDataPtr))) {
622+ memcpy (ResDataPtr, ResData.get (), R.size ());
623+ UploadBuffer->Unmap (0 , nullptr );
624+ } else {
625+ return llvm::createStringError (std::errc::io_error,
626+ " Failed to map SRV upload buffer." );
627+ }
565628
566629 addResourceUploadCommands (R, IS, Buffer, UploadBuffer);
567630
568- Bundle.emplace_back (UploadBuffer, Buffer, nullptr );
631+ Bundle.emplace_back (UploadBuffer, Buffer, nullptr , Heap );
569632 RegOffset++;
570633 }
571634 return Bundle;
@@ -684,6 +747,7 @@ class DXDevice : public offloadtest::Device {
684747 llvm::outs () << " UAV: HeapIdx = " << HeapIdx << " EltSize = " << EltSize
685748 << " NumElts = " << NumElts
686749 << " HasCounter = " << R.HasCounter << " \n " ;
750+
687751 D3D12_CPU_DESCRIPTOR_HANDLE UAVHandle = UAVHandleHeapStart;
688752 UAVHandle.ptr += HeapIdx * DescHandleIncSize;
689753 ID3D12Resource *CounterBuffer = R.HasCounter ? RS.Buffer .Get () : nullptr ;
0 commit comments