diff --git a/docs/drivers/zink.rst b/docs/drivers/zink.rst index c8da62da408..e7b67b9a3d1 100644 --- a/docs/drivers/zink.rst +++ b/docs/drivers/zink.rst @@ -249,6 +249,19 @@ are required to be supported * :ext:`VK_KHR_draw_indirect_count` +Performance +----------- + +If you notice poor performance and high CPU usage while running an application, +changing the descriptor manager may improve performance: + +.. envvar:: ZINK_DESCRIPTORS ("auto") + +``auto`` + Automatically detect best mode. This is the default. +``lazy`` + Attempt to use the least amount of CPU by binding descriptors opportunistically. + Debugging --------- diff --git a/src/gallium/drivers/zink/zink_screen.c b/src/gallium/drivers/zink/zink_screen.c index a2af79c6954..cdf5d46b41c 100644 --- a/src/gallium/drivers/zink/zink_screen.c +++ b/src/gallium/drivers/zink/zink_screen.c @@ -89,6 +89,17 @@ uint32_t zink_debug; +static const struct debug_named_value +zink_descriptor_options[] = { + { "auto", ZINK_DESCRIPTOR_MODE_AUTO, "Automatically detect best mode" }, + { "lazy", ZINK_DESCRIPTOR_MODE_LAZY, "Don't cache, do least amount of updates" }, + DEBUG_NAMED_VALUE_END +}; + +DEBUG_GET_ONCE_FLAGS_OPTION(zink_descriptor_mode, "ZINK_DESCRIPTORS", zink_descriptor_options, ZINK_DESCRIPTOR_MODE_AUTO) + +enum zink_descriptor_mode zink_descriptor_mode; + static const char * zink_get_vendor(struct pipe_screen *pscreen) { @@ -2465,6 +2476,7 @@ zink_internal_create_screen(const struct pipe_screen_config *config) screen->abort_on_hang = debug_get_bool_option("ZINK_HANG_ABORT", false); zink_debug = debug_get_option_zink_debug(); + zink_descriptor_mode = debug_get_option_zink_descriptor_mode(); screen->loader_lib = util_dl_open(VK_LIBNAME); if (!screen->loader_lib) @@ -2571,6 +2583,9 @@ zink_internal_create_screen(const struct pipe_screen_config *config) screen->desc_set_id[ZINK_DESCRIPTOR_TYPE_IMAGE] = 4; screen->desc_set_id[ZINK_DESCRIPTOR_BINDLESS] = 5; } + if (zink_descriptor_mode == ZINK_DESCRIPTOR_MODE_AUTO) { + zink_descriptor_mode = ZINK_DESCRIPTOR_MODE_LAZY; + } if (screen->info.have_EXT_calibrated_timestamps && !check_have_device_time(screen)) goto fail; diff --git a/src/gallium/drivers/zink/zink_types.h b/src/gallium/drivers/zink/zink_types.h index 902badf5436..5ff3d44dc5b 100644 --- a/src/gallium/drivers/zink/zink_types.h +++ b/src/gallium/drivers/zink/zink_types.h @@ -146,6 +146,11 @@ enum zink_descriptor_type { ZINK_DESCRIPTOR_NON_BINDLESS_TYPES = ZINK_DESCRIPTOR_BASE_TYPES + 1, /**< for struct sizing */ }; +enum zink_descriptor_mode { + ZINK_DESCRIPTOR_MODE_AUTO, + ZINK_DESCRIPTOR_MODE_LAZY, +}; + /* indexing for descriptor template management */ enum zink_descriptor_size_index { ZDS_INDEX_UBO,