From b8f2b968dea6603aff5175f50bc34a05ef3b2034 Mon Sep 17 00:00:00 2001 From: Jesse Natalie Date: Fri, 1 May 2026 14:49:27 -0700 Subject: [PATCH] d3d12: reclaim in-flight BO memory on allocation failure Assisted-by: Claude Opus 4.7 Part-of: --- src/gallium/drivers/d3d12/d3d12_bufmgr.cpp | 15 +++++++++------ src/gallium/drivers/d3d12/d3d12_resource.cpp | 2 ++ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/gallium/drivers/d3d12/d3d12_bufmgr.cpp b/src/gallium/drivers/d3d12/d3d12_bufmgr.cpp index 7dfe8a23d90..0e879f3eea9 100644 --- a/src/gallium/drivers/d3d12/d3d12_bufmgr.cpp +++ b/src/gallium/drivers/d3d12/d3d12_bufmgr.cpp @@ -143,12 +143,15 @@ d3d12_bo_new(struct d3d12_screen *screen, uint64_t size, const pb_desc *pb_desc) d3d12_evicted : d3d12_resident; D3D12_HEAP_PROPERTIES heap_pris = GetCustomHeapProperties(dev, heap_type); - HRESULT hres = dev->CreateCommittedResource(&heap_pris, - heap_flags, - &res_desc, - D3D12_RESOURCE_STATE_COMMON, - NULL, - IID_PPV_ARGS(&res)); + HRESULT hres; + do { + hres = dev->CreateCommittedResource(&heap_pris, + heap_flags, + &res_desc, + D3D12_RESOURCE_STATE_COMMON, + NULL, + IID_PPV_ARGS(&res)); + } while (hres == E_OUTOFMEMORY && d3d12_screen_reclaim_one(screen)); if (FAILED(hres)) return NULL; diff --git a/src/gallium/drivers/d3d12/d3d12_resource.cpp b/src/gallium/drivers/d3d12/d3d12_resource.cpp index e74f3558fcc..62ad0588413 100644 --- a/src/gallium/drivers/d3d12/d3d12_resource.cpp +++ b/src/gallium/drivers/d3d12/d3d12_resource.cpp @@ -313,6 +313,7 @@ init_texture(struct d3d12_screen *screen, HRESULT hres = E_FAIL; enum d3d12_residency_status init_residency; + do { #ifndef _GAMING_XBOX if (heap && screen->max_feature_level == D3D_FEATURE_LEVEL_1_0_GENERIC) { @@ -400,6 +401,7 @@ init_texture(struct d3d12_screen *screen, IID_PPV_ARGS(&d3d12_res)); } } + } while (hres == E_OUTOFMEMORY && d3d12_screen_reclaim_one(screen)); if (FAILED(hres)) return false;