void FD3D12BuddyAllocator::Initialize() { FD3D12Device* Device = GetParentDevice(); FD3D12Adapter* Adapter = Device->GetParentAdapter(); if (AllocationStrategy == eBuddyAllocationStrategy::kPlacedResourceStrategy) { D3D12_HEAP_PROPERTIES HeapProps = CD3DX12_HEAP_PROPERTIES(HeapType); HeapProps.CreationNodeMask = GetNodeMask(); HeapProps.VisibleNodeMask = GetVisibilityMask(); D3D12_HEAP_DESC Desc = {}; Desc.SizeInBytes = MaxBlockSize; Desc.Properties = HeapProps; Desc.Alignment = 0; Desc.Flags = HeapFlags; ID3D12Heap* Heap = nullptr; VERIFYD3D12RESULT(Adapter->GetD3DDevice()->CreateHeap(&Desc, IID_PPV_ARGS(&Heap))); SetName(Heap, L"Placed Resource Allocator Backing Heap"); BackingHeap = new FD3D12Heap(GetParentDevice(), GetVisibilityMask()); BackingHeap->SetHeap(Heap); if (IsCPUWritable(HeapType) == false) { BackingHeap->BeginTrackingResidency(Desc.SizeInBytes); } } else { VERIFYD3D12RESULT(Adapter->CreateBuffer(HeapType, GetNodeMask(), GetVisibilityMask(), MaxBlockSize, BackingResource.GetInitReference(), ResourceFlags)); SetName(BackingResource, L"Resource Allocator Underlying Buffer"); if (IsCPUWritable(HeapType)) { BackingResource->Map(); } } }
inline FD3D12UnorderedAccessView* CreateUAV(D3D12_UNORDERED_ACCESS_VIEW_DESC& Desc, ResourceType* Resource, bool bNeedsCounterResource) { if (Resource == nullptr) { return nullptr; } FD3D12Adapter* Adapter = Resource->GetParentDevice()->GetParentAdapter(); return Adapter->CreateLinkedViews<ResourceType, FD3D12UnorderedAccessView>(Resource, [bNeedsCounterResource, &Desc](ResourceType* Resource) { FD3D12Device* Device = Resource->GetParentDevice(); FD3D12Resource* CounterResource = nullptr; if (bNeedsCounterResource) { const GPUNodeMask Node = Device->GetNodeMask(); Device->GetParentAdapter()->CreateBuffer(D3D12_HEAP_TYPE_DEFAULT, Node, Node, 4, &CounterResource, D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS); } return new FD3D12UnorderedAccessView(Device, &Desc, &Resource->ResourceLocation, CounterResource); }); }