From b744e9703342960bb39cdaa09e3701e0e8059843 Mon Sep 17 00:00:00 2001 From: Giancarlo Devich Date: Mon, 24 Oct 2022 13:07:55 -0700 Subject: [PATCH] d3d12: Add cache managers for separate buffer usage cases Mis-matched usage is a large percentage of buffer cache misses when searching for applicable buffers. Separating these into separate managers puts them into separate heaps and eliminates a significant amount of CPU time spent searching. Part-of: --- src/gallium/drivers/d3d12/d3d12_screen.cpp | 20 ++++++++++++++++++-- src/gallium/drivers/d3d12/d3d12_screen.h | 2 ++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/gallium/drivers/d3d12/d3d12_screen.cpp b/src/gallium/drivers/d3d12/d3d12_screen.cpp index 1f85ea2..db92481 100644 --- a/src/gallium/drivers/d3d12/d3d12_screen.cpp +++ b/src/gallium/drivers/d3d12/d3d12_screen.cpp @@ -703,6 +703,14 @@ d3d12_deinit_screen(struct d3d12_screen *screen) screen->cache_bufmgr->destroy(screen->cache_bufmgr); screen->cache_bufmgr = nullptr; } + if (screen->slab_cache_bufmgr) { + screen->slab_cache_bufmgr->destroy(screen->slab_cache_bufmgr); + screen->slab_cache_bufmgr = nullptr; + } + if (screen->readback_slab_cache_bufmgr) { + screen->readback_slab_cache_bufmgr->destroy(screen->readback_slab_cache_bufmgr); + screen->readback_slab_cache_bufmgr = nullptr; + } if (screen->bufmgr) { screen->bufmgr->destroy(screen->bufmgr); screen->bufmgr = nullptr; @@ -1418,15 +1426,23 @@ d3d12_init_screen(struct d3d12_screen *screen, IUnknown *adapter) if (!screen->cache_bufmgr) return false; - screen->slab_bufmgr = pb_slab_range_manager_create(screen->cache_bufmgr, 16, + screen->slab_cache_bufmgr = pb_cache_manager_create(screen->bufmgr, 0xfffff, 2, 0, 512 * 1024 * 1024); + if (!screen->slab_cache_bufmgr) + return false; + + screen->slab_bufmgr = pb_slab_range_manager_create(screen->slab_cache_bufmgr, 16, D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT, D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT, &desc); if (!screen->slab_bufmgr) return false; + + screen->readback_slab_cache_bufmgr = pb_cache_manager_create(screen->bufmgr, 0xfffff, 2, 0, 512 * 1024 * 1024); + if (!screen->readback_slab_cache_bufmgr) + return false; desc.usage = (pb_usage_flags)(PB_USAGE_CPU_READ_WRITE | PB_USAGE_GPU_WRITE); - screen->readback_slab_bufmgr = pb_slab_range_manager_create(screen->cache_bufmgr, 16, + screen->readback_slab_bufmgr = pb_slab_range_manager_create(screen->readback_slab_cache_bufmgr, 16, D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT, D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT, &desc); diff --git a/src/gallium/drivers/d3d12/d3d12_screen.h b/src/gallium/drivers/d3d12/d3d12_screen.h index 7d2dad9..980ccad 100644 --- a/src/gallium/drivers/d3d12/d3d12_screen.h +++ b/src/gallium/drivers/d3d12/d3d12_screen.h @@ -84,7 +84,9 @@ struct d3d12_screen { struct slab_parent_pool transfer_pool; struct pb_manager *bufmgr; struct pb_manager *cache_bufmgr; + struct pb_manager *slab_cache_bufmgr; struct pb_manager *slab_bufmgr; + struct pb_manager *readback_slab_cache_bufmgr; struct pb_manager *readback_slab_bufmgr; mtx_t descriptor_pool_mutex; -- 2.7.4