d3d12: Add cache managers for separate buffer usage cases
authorGiancarlo Devich <gdevich@microsoft.com>
Mon, 24 Oct 2022 20:07:55 +0000 (13:07 -0700)
committerMarge Bot <emma+marge@anholt.net>
Mon, 24 Oct 2022 23:35:39 +0000 (23:35 +0000)
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: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19283>

src/gallium/drivers/d3d12/d3d12_screen.cpp
src/gallium/drivers/d3d12/d3d12_screen.h

index 1f85ea2..db92481 100644 (file)
@@ -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);
index 7d2dad9..980ccad 100644 (file)
@@ -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;