From ce62fd250e0325c65b7f783bdb2972b159271235 Mon Sep 17 00:00:00 2001 From: "Bernhart, Bryan" Date: Fri, 13 Jan 2023 13:50:06 -0800 Subject: [PATCH] Fix access bug attempting to create a resource allocator with residency but without adapter. --- src/gpgmm/d3d12/ResourceAllocatorD3D12.cpp | 5 ++++- src/mvi/gpgmm_d3d12.cpp | 6 ++++-- src/tests/end2end/D3D12ResidencyManagerTests.cpp | 11 +++++++++++ 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/gpgmm/d3d12/ResourceAllocatorD3D12.cpp b/src/gpgmm/d3d12/ResourceAllocatorD3D12.cpp index 58daa7f7b..650348705 100644 --- a/src/gpgmm/d3d12/ResourceAllocatorD3D12.cpp +++ b/src/gpgmm/d3d12/ResourceAllocatorD3D12.cpp @@ -389,7 +389,10 @@ namespace gpgmm::d3d12 { if (ppResidencyManagerOut != nullptr) { RESIDENCY_DESC residencyDesc = {}; residencyDesc.Device = allocatorDescriptor.Device; - ReturnIfFailed(allocatorDescriptor.Adapter.As(&residencyDesc.Adapter)); + + if (allocatorDescriptor.Adapter != nullptr) { + ReturnIfFailed(allocatorDescriptor.Adapter.As(&residencyDesc.Adapter)); + } std::unique_ptr caps; { diff --git a/src/mvi/gpgmm_d3d12.cpp b/src/mvi/gpgmm_d3d12.cpp index f138225fc..e7f0852b2 100644 --- a/src/mvi/gpgmm_d3d12.cpp +++ b/src/mvi/gpgmm_d3d12.cpp @@ -302,13 +302,15 @@ namespace gpgmm::d3d12 { RESIDENCY_DESC residencyDesc = {}; residencyDesc.Device = allocatorDescriptor.Device; + if (allocatorDescriptor.Adapter != nullptr) { + ReturnIfFailed(allocatorDescriptor.Adapter.As(&residencyDesc.Adapter)); + } + 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)); - ReturnIfFailed( ResidencyManager::CreateResidencyManager(residencyDesc, &residencyManager)); } diff --git a/src/tests/end2end/D3D12ResidencyManagerTests.cpp b/src/tests/end2end/D3D12ResidencyManagerTests.cpp index 66d746273..64a960677 100644 --- a/src/tests/end2end/D3D12ResidencyManagerTests.cpp +++ b/src/tests/end2end/D3D12ResidencyManagerTests.cpp @@ -361,6 +361,17 @@ TEST_F(D3D12ResidencyManagerTests, CreateResidencyManager) { EXPECT_NE(residencyManager, nullptr); } + // Create allocator with residency, seperately, but no adapter should fail. + { + ALLOCATOR_DESC allocatorDesc = CreateBasicAllocatorDesc(); + allocatorDesc.Adapter = nullptr; + + ComPtr residencyManager; + ComPtr resourceAllocator; + ASSERT_FAILED( + CreateResourceAllocator(allocatorDesc, &resourceAllocator, &residencyManager)); + } + // Create allocator with residency, seperately. { ComPtr residencyManager;