Module: Mesa Branch: main Commit: 2ac23b4d5831316d9c635efca2d5f430ad2d7788 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=2ac23b4d5831316d9c635efca2d5f430ad2d7788
Author: Mike Blumenkrantz <[email protected]> Date: Tue Nov 9 10:44:45 2021 -0500 zink: always inline uniforms when running on a cpu driver the overhead from creating new inlined shader variants is likely to be less than the time required to fully optimize and run those variants, so just inline 100% of the time to cut down shader runs Reviewed-by: Dave Airlie <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13727> --- src/gallium/drivers/zink/zink_program.c | 7 ++++--- src/gallium/drivers/zink/zink_screen.c | 11 +++++++---- src/gallium/drivers/zink/zink_screen.h | 1 + 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/gallium/drivers/zink/zink_program.c b/src/gallium/drivers/zink/zink_program.c index 92e7baca53d..03f2756cbe6 100644 --- a/src/gallium/drivers/zink/zink_program.c +++ b/src/gallium/drivers/zink/zink_program.c @@ -96,7 +96,7 @@ get_shader_module_for_stage(struct zink_context *ctx, struct zink_screen *screen if (ctx && zs->nir->info.num_inlinable_uniforms && ctx->inlinable_uniforms_valid_mask & BITFIELD64_BIT(pstage)) { - if (prog->inlined_variant_count[pstage] < ZINK_MAX_INLINED_VARIANTS) + if (screen->is_cpu || prog->inlined_variant_count[pstage] < ZINK_MAX_INLINED_VARIANTS) base_size = zs->nir->info.num_inlinable_uniforms; else key->inline_uniforms = false; @@ -264,6 +264,7 @@ cs_module_hash(const struct zink_shader_module *zm) static void update_cs_shader_module(struct zink_context *ctx, struct zink_compute_program *comp) { + struct zink_screen *screen = zink_screen(ctx->base.screen); struct zink_shader *zs = comp->shader; VkShaderModule mod; struct zink_shader_module *zm = NULL; @@ -272,7 +273,7 @@ update_cs_shader_module(struct zink_context *ctx, struct zink_compute_program *c if (ctx && zs->nir->info.num_inlinable_uniforms && ctx->inlinable_uniforms_valid_mask & BITFIELD64_BIT(PIPE_SHADER_COMPUTE)) { - if (comp->inlined_variant_count < ZINK_MAX_INLINED_VARIANTS) + if (screen->is_cpu || comp->inlined_variant_count < ZINK_MAX_INLINED_VARIANTS) base_size = zs->nir->info.num_inlinable_uniforms; else key->inline_uniforms = false; @@ -296,7 +297,7 @@ update_cs_shader_module(struct zink_context *ctx, struct zink_compute_program *c if (!zm) { return; } - mod = zink_shader_compile(zink_screen(ctx->base.screen), zs, comp->shader->nir, key); + mod = zink_shader_compile(screen, zs, comp->shader->nir, key); if (!mod) { FREE(zm); return; diff --git a/src/gallium/drivers/zink/zink_screen.c b/src/gallium/drivers/zink/zink_screen.c index 061ed27d890..11814e25a9a 100644 --- a/src/gallium/drivers/zink/zink_screen.c +++ b/src/gallium/drivers/zink/zink_screen.c @@ -1166,14 +1166,15 @@ zink_destroy_screen(struct pipe_screen *pscreen) ralloc_free(screen); } -static void +static bool choose_pdev(struct zink_screen *screen) { uint32_t i, pdev_count; VkPhysicalDevice *pdevs; + bool is_cpu = false; VkResult result = vkEnumeratePhysicalDevices(screen->instance, &pdev_count, NULL); if (result != VK_SUCCESS) - return; + return is_cpu; assert(pdev_count > 0); @@ -1192,6 +1193,7 @@ choose_pdev(struct zink_screen *screen) if (props->deviceType == VK_PHYSICAL_DEVICE_TYPE_CPU) { screen->pdev = pdevs[i]; screen->info.device_version = props->apiVersion; + is_cpu = true; break; } continue; @@ -1215,6 +1217,7 @@ choose_pdev(struct zink_screen *screen) screen->spirv_version = SPIRV_VERSION(1, 3); else screen->spirv_version = SPIRV_VERSION(1, 0); + return is_cpu; } static void @@ -1913,7 +1916,7 @@ zink_internal_create_screen(const struct pipe_screen_config *config) (zink_debug & ZINK_DEBUG_VALIDATION) && !create_debug(screen)) debug_printf("ZINK: failed to setup debug utils\n"); - choose_pdev(screen); + screen->is_cpu = choose_pdev(screen); if (screen->pdev == VK_NULL_HANDLE) goto fail; @@ -2015,7 +2018,7 @@ zink_internal_create_screen(const struct pipe_screen_config *config) //screen->driconf.inline_uniforms = driQueryOptionb(config->options, "radeonsi_inline_uniforms"); } #endif - screen->driconf.inline_uniforms = debug_get_bool_option("ZINK_INLINE_UNIFORMS", false); + screen->driconf.inline_uniforms = debug_get_bool_option("ZINK_INLINE_UNIFORMS", screen->is_cpu); screen->total_video_mem = get_video_mem(screen); screen->clamp_video_mem = screen->total_video_mem * 0.8; diff --git a/src/gallium/drivers/zink/zink_screen.h b/src/gallium/drivers/zink/zink_screen.h index e16cdae8dcf..6bb14fc4545 100644 --- a/src/gallium/drivers/zink/zink_screen.h +++ b/src/gallium/drivers/zink/zink_screen.h @@ -76,6 +76,7 @@ struct zink_modifier_prop { struct zink_screen { struct pipe_screen base; bool threaded; + bool is_cpu; uint32_t curr_batch; //the current batch id uint32_t last_finished; //this is racy but ultimately doesn't matter VkSemaphore sem;
