diff --git a/src/gallium/drivers/d3d12/d3d12_residency.cpp b/src/gallium/drivers/d3d12/d3d12_residency.cpp index be110ba5307..024fc76afcd 100644 --- a/src/gallium/drivers/d3d12/d3d12_residency.cpp +++ b/src/gallium/drivers/d3d12/d3d12_residency.cpp @@ -24,6 +24,7 @@ #include "d3d12_batch.h" #include "d3d12_bufmgr.h" #include "d3d12_residency.h" +#include "d3d12_resource.h" #include "d3d12_screen.h" #include "util/os_time.h" @@ -260,3 +261,28 @@ d3d12_deinit_residency(struct d3d12_screen *screen) screen->residency_fence = nullptr; } } + +void +d3d12_promote_to_permanent_residency(struct d3d12_screen *screen, struct d3d12_resource* resource) +{ + mtx_lock(&screen->submit_mutex); + uint64_t offset; + struct d3d12_bo *base_bo = d3d12_bo_get_base(resource->bo, &offset); + + /* Promote non-permanent resident resources to permanent residency*/ + if(base_bo->residency_status != d3d12_permanently_resident) { + + /* Mark as permanently resident*/ + base_bo->residency_status = d3d12_permanently_resident; + + /* If it wasn't made resident before, make it*/ + bool was_made_resident = (base_bo->residency_status == d3d12_resident); + if(!was_made_resident) { + list_addtail(&base_bo->residency_list_entry, &screen->residency_list); + ID3D12Pageable *pageable = base_bo->res; + HRESULT hr = screen->dev->MakeResident(1, &pageable); + assert(SUCCEEDED(hr)); + } + } + mtx_unlock(&screen->submit_mutex); +} \ No newline at end of file diff --git a/src/gallium/drivers/d3d12/d3d12_residency.h b/src/gallium/drivers/d3d12/d3d12_residency.h index 2413aaedaca..5a4872df25a 100644 --- a/src/gallium/drivers/d3d12/d3d12_residency.h +++ b/src/gallium/drivers/d3d12/d3d12_residency.h @@ -34,3 +34,6 @@ d3d12_init_residency(struct d3d12_screen *screen); void d3d12_deinit_residency(struct d3d12_screen *screen); + +void +d3d12_promote_to_permanent_residency(struct d3d12_screen *screen, struct d3d12_resource* resource);