diff --git a/src/gpgmm/d3d12/CapsD3D12.cpp b/src/gpgmm/d3d12/CapsD3D12.cpp index 90ccfc8e2..c60a32635 100644 --- a/src/gpgmm/d3d12/CapsD3D12.cpp +++ b/src/gpgmm/d3d12/CapsD3D12.cpp @@ -77,6 +77,11 @@ namespace gpgmm::d3d12 { ReturnIfFailed( SetCreateHeapNotResidentSupported(device, &caps->mIsCreateHeapNotResidentSupported)); + D3D12_FEATURE_DATA_ARCHITECTURE arch = {}; + ReturnIfFailed( + device->CheckFeatureSupport(D3D12_FEATURE_ARCHITECTURE, &arch, sizeof(arch))); + caps->mIsAdapterUMA = arch.UMA; + // D3D12 has no feature to detect support and must be set manually. if (adapterDesc.VendorId == kIntel_VkVendor) { caps->mIsResourceAccessAlwaysCoherent = true; @@ -102,4 +107,8 @@ namespace gpgmm::d3d12 { return mIsResourceAccessAlwaysCoherent; } + bool Caps::IsAdapterUMA() const { + return mIsAdapterUMA; + } + } // namespace gpgmm::d3d12 diff --git a/src/gpgmm/d3d12/CapsD3D12.h b/src/gpgmm/d3d12/CapsD3D12.h index b1008bb71..945879d44 100644 --- a/src/gpgmm/d3d12/CapsD3D12.h +++ b/src/gpgmm/d3d12/CapsD3D12.h @@ -38,6 +38,9 @@ namespace gpgmm::d3d12 { // Allows a resource to be shared between multiple command queues. bool IsResourceAccessAlwaysCoherent() const; + // Specifies if the adapter uses a Unified Memory Architecture (UMA). + bool IsAdapterUMA() const; + private: Caps() = default; @@ -45,6 +48,7 @@ namespace gpgmm::d3d12 { uint64_t mMaxResourceHeapSize = 0; bool mIsCreateHeapNotResidentSupported = false; bool mIsResourceAccessAlwaysCoherent = false; + bool mIsAdapterUMA = false; }; } // namespace gpgmm::d3d12 diff --git a/src/gpgmm/d3d12/ResourceAllocatorD3D12.cpp b/src/gpgmm/d3d12/ResourceAllocatorD3D12.cpp index 705953459..cab672275 100644 --- a/src/gpgmm/d3d12/ResourceAllocatorD3D12.cpp +++ b/src/gpgmm/d3d12/ResourceAllocatorD3D12.cpp @@ -303,17 +303,20 @@ namespace gpgmm::d3d12 { ComPtr residencyManager; if (ppResidencyManagerOut != nullptr) { + std::unique_ptr caps; + { + Caps* ptr = nullptr; + ReturnIfFailed(Caps::CreateCaps(allocatorDescriptor.Device.Get(), + allocatorDescriptor.Adapter.Get(), &ptr)); + caps.reset(ptr); + } + RESIDENCY_DESC residencyDesc = {}; residencyDesc.Device = allocatorDescriptor.Device; - - D3D12_FEATURE_DATA_ARCHITECTURE arch = {}; - ReturnIfFailed(residencyDesc.Device->CheckFeatureSupport(D3D12_FEATURE_ARCHITECTURE, - &arch, sizeof(arch))); - residencyDesc.IsUMA = arch.UMA; - + ReturnIfFailed(allocatorDescriptor.Adapter.As(&residencyDesc.Adapter)); + residencyDesc.IsUMA = caps->IsAdapterUMA(); residencyDesc.MinLogLevel = allocatorDescriptor.MinLogLevel; residencyDesc.RecordOptions = allocatorDescriptor.RecordOptions; - ReturnIfFailed(allocatorDescriptor.Adapter.As(&residencyDesc.Adapter)); ReturnIfFailed( ResidencyManager::CreateResidencyManager(residencyDesc, &residencyManager));