zink: split out inlined uniform shader variants into separate cache
authorMike Blumenkrantz <michael.blumenkrantz@gmail.com>
Wed, 1 Sep 2021 20:55:32 +0000 (16:55 -0400)
committerMike Blumenkrantz <michael.blumenkrantz@gmail.com>
Thu, 16 Sep 2021 03:52:32 +0000 (23:52 -0400)
Reviewed-by: Dave Airlie <airlied@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12842>

src/gallium/drivers/zink/zink_program.c
src/gallium/drivers/zink/zink_program.h

index 9c1999c..bc206c1 100644 (file)
@@ -100,7 +100,7 @@ get_shader_module_for_stage(struct zink_context *ctx, struct zink_screen *screen
    }
 
    struct zink_shader_module *iter, *next;
-   LIST_FOR_EACH_ENTRY_SAFE(iter, next, &prog->shader_cache[pstage], list) {
+   LIST_FOR_EACH_ENTRY_SAFE(iter, next, &prog->shader_cache[pstage][!!base_size], list) {
       if (!shader_key_matches(iter, key, base_size))
          continue;
       list_delinit(&iter->list);
@@ -126,9 +126,9 @@ get_shader_module_for_stage(struct zink_context *ctx, struct zink_screen *screen
       if (base_size)
          memcpy(zm->key + key->size, &key->base, base_size * sizeof(uint32_t));
       zm->hash = shader_module_hash(zm);
-      zm->default_variant = !base_size && list_is_empty(&prog->shader_cache[pstage]);
+      zm->default_variant = !base_size && list_is_empty(&prog->shader_cache[pstage][0]);
    }
-   list_add(&zm->list, &prog->shader_cache[pstage]);
+   list_add(&zm->list, &prog->shader_cache[pstage][!!base_size]);
    return zm;
 }
 
@@ -319,7 +319,8 @@ zink_create_gfx_program(struct zink_context *ctx,
    pipe_reference_init(&prog->base.reference, 1);
 
    for (int i = 0; i < ZINK_SHADER_COUNT; ++i) {
-      list_inithead(&prog->shader_cache[i]);
+      list_inithead(&prog->shader_cache[i][0]);
+      list_inithead(&prog->shader_cache[i][1]);
       if (stages[i]) {
          prog->shaders[i] = stages[i];
          prog->stages_present |= BITFIELD_BIT(i);
@@ -561,7 +562,8 @@ zink_destroy_gfx_program(struct zink_screen *screen,
          _mesa_set_remove_key(prog->shaders[i]->programs, prog);
          prog->shaders[i] = NULL;
       }
-      destroy_shader_cache(screen, &prog->shader_cache[i]);
+      destroy_shader_cache(screen, &prog->shader_cache[i][0]);
+      destroy_shader_cache(screen, &prog->shader_cache[i][1]);
       ralloc_free(prog->nir[i]);
    }
 
index 86f8810..f0d478e 100644 (file)
@@ -101,7 +101,7 @@ struct zink_gfx_program {
 
    struct zink_shader *last_vertex_stage;
 
-   struct list_head shader_cache[ZINK_SHADER_COUNT];
+   struct list_head shader_cache[ZINK_SHADER_COUNT][2]; //normal, inline uniforms
 
    struct zink_shader *shaders[ZINK_SHADER_COUNT];
    struct hash_table pipelines[11]; // number of draw modes we support