Mesa (main): zink: change descriptor flushing to assert

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Jul 27 22:43:48 UTC 2021


Module: Mesa
Branch: main
Commit: 4bd6a0299b00a1e34cf1910409ceeef2dfa976ad
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=4bd6a0299b00a1e34cf1910409ceeef2dfa976ad

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date:   Fri May 21 16:54:46 2021 -0400

zink: change descriptor flushing to assert

there should never be flushing due to pool depletion; instead, trigger an
oom flush and stall to replenish the pool after the draw/compute

Reviewed-by: Dave Airlie <airlied at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12012>

---

 src/gallium/drivers/zink/zink_descriptors.c      | 14 ++++-------
 src/gallium/drivers/zink/zink_descriptors.h      |  4 +--
 src/gallium/drivers/zink/zink_descriptors_lazy.c | 32 ++++++------------------
 src/gallium/drivers/zink/zink_draw.cpp           | 22 ++++------------
 src/gallium/drivers/zink/zink_screen.h           |  2 +-
 5 files changed, 21 insertions(+), 53 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_descriptors.c b/src/gallium/drivers/zink/zink_descriptors.c
index c20c3325713..ccbb4be3552 100644
--- a/src/gallium/drivers/zink/zink_descriptors.c
+++ b/src/gallium/drivers/zink/zink_descriptors.c
@@ -806,15 +806,13 @@ skip_hash_tables:
       }
    }
 
-   if (pool->num_sets_allocated == ZINK_DEFAULT_MAX_DESCS) {
-      simple_mtx_unlock(&pool->mtx);
-      zink_fence_wait(&ctx->base);
-      zink_batch_reference_program(batch, pg);
-      return zink_descriptor_set_get(ctx, type, is_compute, cache_hit);
-   }
+   assert(pool->num_sets_allocated < ZINK_DEFAULT_MAX_DESCS);
 
    zds = allocate_desc_set(ctx, pg, type, descs_used, is_compute);
 out:
+   if (unlikely(pool->num_sets_allocated >= ZINK_DEFAULT_DESC_CLAMP &&
+                _mesa_hash_table_num_entries(pool->free_desc_sets) < ZINK_DEFAULT_MAX_DESCS - ZINK_DEFAULT_DESC_CLAMP))
+      ctx->oom_flush = ctx->oom_stall = true;
    zds->hash = hash;
    populate_zds_key(ctx, type, is_compute, &zds->key, pg->dd->push_usage);
    zds->recycled = false;
@@ -1326,11 +1324,10 @@ update_descriptors_internal(struct zink_context *ctx, struct zink_descriptor_set
 static void
 zink_context_update_descriptor_states(struct zink_context *ctx, struct zink_program *pg);
 
-bool
+void
 zink_descriptors_update(struct zink_context *ctx, bool is_compute)
 {
    struct zink_program *pg = is_compute ? (struct zink_program *)ctx->curr_compute : (struct zink_program *)ctx->curr_program;
-   struct zink_batch_state *bs = ctx->batch.state;
 
    zink_context_update_descriptor_states(ctx, pg);
    bool cache_hit[ZINK_DESCRIPTOR_TYPES + 1];
@@ -1379,7 +1376,6 @@ zink_descriptors_update(struct zink_context *ctx, bool is_compute)
                            pg->layout, 0, pg->num_dsl, sets,
                            dynamic_offset_idx, dynamic_offsets);
    ctx->dd->pg[is_compute] = pg;
-   return bs != batch->state;
 }
 
 void
diff --git a/src/gallium/drivers/zink/zink_descriptors.h b/src/gallium/drivers/zink/zink_descriptors.h
index 34d3796140a..09e72546343 100644
--- a/src/gallium/drivers/zink/zink_descriptors.h
+++ b/src/gallium/drivers/zink/zink_descriptors.h
@@ -227,7 +227,7 @@ zink_descriptor_program_init(struct zink_context *ctx, struct zink_program *pg);
 void
 zink_descriptor_program_deinit(struct zink_screen *screen, struct zink_program *pg);
 
-bool
+void
 zink_descriptors_update(struct zink_context *ctx, bool is_compute);
 
 
@@ -261,7 +261,7 @@ zink_descriptor_program_init_lazy(struct zink_context *ctx, struct zink_program
 void
 zink_descriptor_program_deinit_lazy(struct zink_screen *screen, struct zink_program *pg);
 
-bool
+void
 zink_descriptors_update_lazy(struct zink_context *ctx, bool is_compute);
 
 
diff --git a/src/gallium/drivers/zink/zink_descriptors_lazy.c b/src/gallium/drivers/zink/zink_descriptors_lazy.c
index 00d0429cc80..d3da88820a0 100644
--- a/src/gallium/drivers/zink/zink_descriptors_lazy.c
+++ b/src/gallium/drivers/zink/zink_descriptors_lazy.c
@@ -414,23 +414,15 @@ populate_sets(struct zink_context *ctx, struct zink_program *pg, uint8_t *change
             return false;
    } else
       sets[0] = VK_NULL_HANDLE;
-   /* may have flushed */
-   if (bs != ctx->batch.state)
-      *changed_sets = pg->dd->binding_usage;
+   /* no flushing allowed */
+   assert(ctx->batch.state == bs);
    bs = ctx->batch.state;
    u_foreach_bit(type, *changed_sets) {
       if (pg->dd->layout_key[type]) {
          struct zink_descriptor_pool *pool = get_descriptor_pool_lazy(ctx, pg, type, bs, pg->is_compute);
          sets[type + 1] = get_descriptor_set_lazy(ctx, pg, type, pool, pg->is_compute);
-         if (ctx->batch.state != bs && (sets[0] || type != ffs(*changed_sets))) {
-               /* sets are allocated by batch state, so if flush occurs on anything
-                * but the first set that has been fetched here, get all new sets
-                */
-               *changed_sets = pg->dd->binding_usage;
-               if (pg->dd->push_usage)
-                  need_push = true;
-               return populate_sets(ctx, pg, changed_sets, need_push, sets);
-         }
+         /* no flushing allowed */
+         assert(ctx->batch.state == bs);
       } else
          sets[type + 1] = ctx->dd->dummy_set;
       if (!sets[type + 1])
@@ -446,14 +438,13 @@ zink_descriptor_set_update_lazy(struct zink_context *ctx, struct zink_program *p
    screen->vk.UpdateDescriptorSetWithTemplate(screen->dev, set, pg->dd->layouts[type + 1]->desc_template, ctx);
 }
 
-bool
+void
 zink_descriptors_update_lazy(struct zink_context *ctx, bool is_compute)
 {
    struct zink_screen *screen = zink_screen(ctx->base.screen);
    struct zink_batch *batch = &ctx->batch;
    struct zink_batch_state *bs = ctx->batch.state;
    struct zink_program *pg = is_compute ? &ctx->curr_compute->base : &ctx->curr_program->base;
-   bool ret = false;
 
    bool batch_changed = !bdd_lazy(bs)->pg[is_compute];
    if (batch_changed) {
@@ -485,16 +476,10 @@ zink_descriptors_update_lazy(struct zink_context *ctx, bool is_compute)
                     (dd_lazy(ctx)->push_state_changed[is_compute] || batch_changed);
    if (!populate_sets(ctx, pg, &changed_sets, need_push, desc_sets)) {
       debug_printf("ZINK: couldn't get descriptor sets!\n");
-      return false;
-   }
-   if (ctx->batch.state != bs) {
-      /* recheck: populate may have overflowed the pool and triggered a flush */
-      batch_changed = true;
-      ret = true;
-      dd_lazy(ctx)->state_changed[is_compute] = pg->dd->binding_usage;
-      changed_sets = pg->dd->binding_usage & dd_lazy(ctx)->state_changed[is_compute];
-      dd_lazy(ctx)->push_state_changed[is_compute] = !!pg->dd->push_usage;
+      return;
    }
+   /* no flushing allowed */
+   assert(ctx->batch.state == bs);
    bs = ctx->batch.state;
 
    if (pg->dd->binding_usage && changed_sets) {
@@ -534,7 +519,6 @@ zink_descriptors_update_lazy(struct zink_context *ctx, bool is_compute)
    /* set again in case of flushing */
    bdd_lazy(bs)->pg[is_compute] = pg;
    ctx->dd->pg[is_compute] = pg;
-   return ret;
 }
 
 void
diff --git a/src/gallium/drivers/zink/zink_draw.cpp b/src/gallium/drivers/zink/zink_draw.cpp
index 13d948e9e37..d6aae521616 100644
--- a/src/gallium/drivers/zink/zink_draw.cpp
+++ b/src/gallium/drivers/zink/zink_draw.cpp
@@ -455,15 +455,6 @@ zink_draw_vbo(struct pipe_context *pctx,
    ctx->gfx_prim_mode = mode;
    update_gfx_program(ctx);
 
-   if (zink_program_has_descriptors(&ctx->curr_program->base)) {
-      if (screen->descriptors_update(ctx, false)) {
-         /* descriptors have flushed the batch */
-         zink_select_draw_vbo(ctx);
-         pctx->draw_vbo(pctx, dinfo, drawid_offset, dindirect, draws, num_draws);
-         return;
-      }
-   }
-
    if (ctx->gfx_pipeline_state.primitive_restart != dinfo->primitive_restart)
       ctx->gfx_pipeline_state.dirty = true;
    ctx->gfx_pipeline_state.primitive_restart = dinfo->primitive_restart;
@@ -493,6 +484,9 @@ zink_draw_vbo(struct pipe_context *pctx,
       vkCmdBindIndexBuffer(batch->state->cmdbuf, res->obj->buffer, index_offset, index_type[index_size >> 1]);
    }
 
+   if (zink_program_has_descriptors(&ctx->curr_program->base))
+      screen->descriptors_update(ctx, false);
+
    bool have_streamout = !!ctx->num_so_targets;
    if (have_streamout) {
       if (ctx->xfb_barrier)
@@ -781,14 +775,8 @@ zink_launch_grid(struct pipe_context *pctx, const struct pipe_grid_info *info)
 
    update_compute_program(ctx);
 
-   if (zink_program_has_descriptors(&ctx->curr_compute->base)) {
-      if (screen->descriptors_update(ctx, true)) {
-         /* descriptors have flushed the batch */
-         zink_select_launch_grid(ctx);
-         pctx->launch_grid(pctx, info);
-         return;
-      }
-   }
+   if (zink_program_has_descriptors(&ctx->curr_compute->base))
+      screen->descriptors_update(ctx, true);
 
    zink_program_update_compute_pipeline_state(ctx, ctx->curr_compute, info->block);
    VkPipeline prev_pipeline = ctx->compute_pipeline_state.pipeline;
diff --git a/src/gallium/drivers/zink/zink_screen.h b/src/gallium/drivers/zink/zink_screen.h
index 8a42e4d54cb..e74c514b336 100644
--- a/src/gallium/drivers/zink/zink_screen.h
+++ b/src/gallium/drivers/zink/zink_screen.h
@@ -136,7 +136,7 @@ struct zink_screen {
 
    bool (*descriptor_program_init)(struct zink_context *ctx, struct zink_program *pg);
    void (*descriptor_program_deinit)(struct zink_screen *screen, struct zink_program *pg);
-   bool (*descriptors_update)(struct zink_context *ctx, bool is_compute);
+   void (*descriptors_update)(struct zink_context *ctx, bool is_compute);
    void (*context_update_descriptor_states)(struct zink_context *ctx, bool is_compute);
    void (*context_invalidate_descriptor_state)(struct zink_context *ctx, enum pipe_shader_type shader,
                                                enum zink_descriptor_type type,



More information about the mesa-commit mailing list