From 2c710f4115668d6e482230364bfddffdf1b0c5f2 Mon Sep 17 00:00:00 2001 From: Dario Date: Tue, 18 Mar 2025 22:41:35 -0300 Subject: [PATCH] Rework the logic for the GPU Upload Heap fallback. --- UnleashedRecomp/gpu/rhi/plume_d3d12.cpp | 11 ++++++----- UnleashedRecomp/gpu/rhi/plume_d3d12.h | 3 ++- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/UnleashedRecomp/gpu/rhi/plume_d3d12.cpp b/UnleashedRecomp/gpu/rhi/plume_d3d12.cpp index 97bb942a..744ef0d2 100644 --- a/UnleashedRecomp/gpu/rhi/plume_d3d12.cpp +++ b/UnleashedRecomp/gpu/rhi/plume_d3d12.cpp @@ -2631,7 +2631,7 @@ namespace plume { // D3D12Pool - D3D12Pool::D3D12Pool(D3D12Device *device, const RenderPoolDesc &desc) { + D3D12Pool::D3D12Pool(D3D12Device *device, const RenderPoolDesc &desc, bool gpuUploadHeapFallback) { assert(device != nullptr); this->device = device; @@ -2640,7 +2640,7 @@ namespace plume { D3D12MA::POOL_DESC poolDesc = {}; // When using an UMA architecture without explicit support for GPU Upload heaps, we instead just make a custom heap with the same properties as Upload heaps. - if (desc.heapType == RenderHeapType::GPU_UPLOAD && device->capabilities.uma && !device->capabilities.gpuUploadHeap) { + if ((desc.heapType == RenderHeapType::GPU_UPLOAD) && gpuUploadHeapFallback) { poolDesc.HeapProperties = device->d3d->GetCustomHeapProperties(0, D3D12_HEAP_TYPE_UPLOAD); } else { @@ -3446,6 +3446,7 @@ namespace plume { // Pretend GPU Upload heaps are supported if UMA is supported, as the backend has a workaround using a custom pool for it. capabilities.gpuUploadHeap = uma || gpuUploadHeapOption; + gpuUploadHeapFallback = uma && !gpuUploadHeapOption; description.name = deviceName; description.dedicatedVideoMemory = adapterDesc.DedicatedVideoMemory; @@ -3545,10 +3546,10 @@ namespace plume { depthTargetHeapAllocator = std::make_unique(this, TargetDescriptorHeapSize, D3D12_DESCRIPTOR_HEAP_TYPE_DSV); // Create the custom upload pool that will be used as the fallback when using an UMA architecture without explicit support for GPU Upload heaps. - if (capabilities.uma && !capabilities.gpuUploadHeap) { + if (gpuUploadHeapFallback) { RenderPoolDesc poolDesc; poolDesc.heapType = RenderHeapType::GPU_UPLOAD; - customUploadPool = std::make_unique(this, poolDesc); + customUploadPool = std::make_unique(this, poolDesc, true); } // Create a command queue only for retrieving the timestamp frequency. Delete it immediately afterwards. @@ -3617,7 +3618,7 @@ namespace plume { } std::unique_ptr D3D12Device::createPool(const RenderPoolDesc &desc) { - return std::make_unique(this, desc); + return std::make_unique(this, desc, gpuUploadHeapFallback); } std::unique_ptr D3D12Device::createPipelineLayout(const RenderPipelineLayoutDesc &desc) { diff --git a/UnleashedRecomp/gpu/rhi/plume_d3d12.h b/UnleashedRecomp/gpu/rhi/plume_d3d12.h index 87980e56..34461c07 100644 --- a/UnleashedRecomp/gpu/rhi/plume_d3d12.h +++ b/UnleashedRecomp/gpu/rhi/plume_d3d12.h @@ -329,7 +329,7 @@ namespace plume { D3D12Device *device = nullptr; RenderPoolDesc desc; - D3D12Pool(D3D12Device *device, const RenderPoolDesc &desc); + D3D12Pool(D3D12Device *device, const RenderPoolDesc &desc, bool gpuUploadHeapFallback); ~D3D12Pool() override; std::unique_ptr createBuffer(const RenderBufferDesc &desc) override; std::unique_ptr createTexture(const RenderTextureDesc &desc) override; @@ -434,6 +434,7 @@ namespace plume { RenderDeviceCapabilities capabilities; RenderDeviceDescription description; uint64_t timestampFrequency = 1; + bool gpuUploadHeapFallback = false; D3D12Device(D3D12Interface *renderInterface, const std::string &preferredDeviceName); ~D3D12Device() override;