From 738fbddca8a1d8343e2ae322299de22a9ae108ae Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Tue, 13 Feb 2024 14:13:22 -0500 Subject: [PATCH] zink: use a slab allocator for zink_kopper_present_info this improves perf slightly at extremely high fps Part-of: --- src/gallium/drivers/zink/zink_kopper.c | 4 ++-- src/gallium/drivers/zink/zink_screen.c | 2 ++ src/gallium/drivers/zink/zink_types.h | 1 + 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/gallium/drivers/zink/zink_kopper.c b/src/gallium/drivers/zink/zink_kopper.c index 71b2bb44902..9ca5f096359 100644 --- a/src/gallium/drivers/zink/zink_kopper.c +++ b/src/gallium/drivers/zink/zink_kopper.c @@ -760,7 +760,7 @@ out: struct pipe_resource *pres = &cpi->res->base.b; pipe_resource_reference(&pres, NULL); } - free(cpi); + slab_free_st(&screen->present_mempool, cpi); } void @@ -775,7 +775,7 @@ zink_kopper_present_queue(struct zink_screen *screen, struct zink_resource *res) if (cdt->swapchain->last_present != UINT32_MAX) prune_old_swapchains(screen, cdt, false); - struct zink_kopper_present_info *cpi = malloc(sizeof(struct zink_kopper_present_info)); + struct zink_kopper_present_info *cpi = slab_alloc_st(&screen->present_mempool); if (!cpi) { mesa_loge("ZINK: failed to allocate cpi!"); return; diff --git a/src/gallium/drivers/zink/zink_screen.c b/src/gallium/drivers/zink/zink_screen.c index fe62962964a..d3f2e1c6549 100644 --- a/src/gallium/drivers/zink/zink_screen.c +++ b/src/gallium/drivers/zink/zink_screen.c @@ -1619,6 +1619,7 @@ zink_destroy_screen(struct pipe_screen *pscreen) close(screen->drm_fd); slab_destroy_parent(&screen->transfer_pool); + slab_destroy(&screen->present_mempool); ralloc_free(screen); glsl_type_singleton_decref(); } @@ -3488,6 +3489,7 @@ zink_internal_create_screen(const struct pipe_screen_config *config, int64_t dev populate_format_props(screen); slab_create_parent(&screen->transfer_pool, sizeof(struct zink_transfer), 16); + slab_create(&screen->present_mempool, sizeof(struct zink_kopper_present_info), 16); screen->driconf.inline_uniforms = debug_get_bool_option("ZINK_INLINE_UNIFORMS", screen->is_cpu) && !(zink_debug & ZINK_DEBUG_DGC); diff --git a/src/gallium/drivers/zink/zink_types.h b/src/gallium/drivers/zink/zink_types.h index f976cb542b8..edc705584a1 100644 --- a/src/gallium/drivers/zink/zink_types.h +++ b/src/gallium/drivers/zink/zink_types.h @@ -1434,6 +1434,7 @@ struct zink_screen { bool device_lost; int drm_fd; + struct slab_mempool present_mempool; struct slab_parent_pool transfer_pool; struct disk_cache *disk_cache; struct util_queue cache_put_thread;