diff --git a/src/gpgmm/d3d12/ResidencyHeapD3D12.cpp b/src/gpgmm/d3d12/ResidencyHeapD3D12.cpp index 89698733..e9076fac 100644 --- a/src/gpgmm/d3d12/ResidencyHeapD3D12.cpp +++ b/src/gpgmm/d3d12/ResidencyHeapD3D12.cpp @@ -74,6 +74,19 @@ namespace gpgmm::d3d12 { const bool isResidencyDisabled = (pResidencyManager == nullptr); + // Validate residency resource heap flags must also have a residency manager. + if (isResidencyDisabled && descriptor.Flags & RESIDENCY_HEAP_FLAG_ALWAYS_IN_BUDGET) { + ErrorLog(MessageId::kInvalidArgument, true) + << "Creating a heap always in budget requires a residency manager to exist."; + return E_INVALIDARG; + } + + if (isResidencyDisabled && descriptor.Flags & RESIDENCY_HEAP_FLAG_ALWAYS_RESIDENT) { + ErrorLog(MessageId::kInvalidArgument, true) + << "Creating a heap always residency requires a residency manager to exist."; + return E_INVALIDARG; + } + ResidencyManager* residencyManager = static_cast(pResidencyManager); // Ensure enough budget exists before creating the heap to avoid an out-of-memory error. diff --git a/src/tests/end2end/D3D12ResidencyManagerTests.cpp b/src/tests/end2end/D3D12ResidencyManagerTests.cpp index 8cc07183..f241f17f 100644 --- a/src/tests/end2end/D3D12ResidencyManagerTests.cpp +++ b/src/tests/end2end/D3D12ResidencyManagerTests.cpp @@ -197,6 +197,24 @@ TEST_F(D3D12ResidencyManagerTests, CreateResourceHeap) { CreateResourceHeapCallbackContext::CreateHeap, &createHeapContext, &resourceHeap)); + { + RESIDENCY_HEAP_DESC invalidResourceHeapDesc = resourceHeapDesc; + invalidResourceHeapDesc.Flags |= RESIDENCY_HEAP_FLAG_ALWAYS_RESIDENT; + + ASSERT_FAILED(CreateResidencyHeap(invalidResourceHeapDesc, nullptr, + CreateResourceHeapCallbackContext::CreateHeap, + &createHeapContext, nullptr)); + } + + { + RESIDENCY_HEAP_DESC invalidResourceHeapDesc = resourceHeapDesc; + invalidResourceHeapDesc.Flags |= RESIDENCY_HEAP_FLAG_ALWAYS_IN_BUDGET; + + ASSERT_FAILED(CreateResidencyHeap(invalidResourceHeapDesc, nullptr, + CreateResourceHeapCallbackContext::CreateHeap, + &createHeapContext, nullptr)); + } + // Ensure the unmanaged resource heap state is always unknown. Even though D3D12 implicitly // creates heaps as resident, untrack resource heaps would never transition out from // RESIDENCY_HEAP_STATUS_CURRENT and must be left RESIDENCY_HEAP_STATUS_UNKNOWN.