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;

Reply via email to