Mesa (main): zink: add a ctx flag for drawid reading

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Jul 20 00:37:34 UTC 2021


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

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date:   Tue May 11 16:16:31 2021 -0400

zink: add a ctx flag for drawid reading

avoid needing so many derefs and a bitset to check this during draw

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

---

 src/gallium/drivers/zink/zink_context.h | 1 +
 src/gallium/drivers/zink/zink_draw.cpp  | 6 +++---
 src/gallium/drivers/zink/zink_program.c | 7 +++++++
 3 files changed, 11 insertions(+), 3 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_context.h b/src/gallium/drivers/zink/zink_context.h
index f017ea6d2b7..2202b9ee6dc 100644
--- a/src/gallium/drivers/zink/zink_context.h
+++ b/src/gallium/drivers/zink/zink_context.h
@@ -199,6 +199,7 @@ struct zink_context {
 
    struct zink_shader *gfx_stages[ZINK_SHADER_COUNT];
    struct zink_shader *last_vertex_stage;
+   bool shader_reads_drawid;
    struct zink_gfx_pipeline_state gfx_pipeline_state;
    enum pipe_prim_type gfx_prim_mode;
    struct hash_table *program_cache;
diff --git a/src/gallium/drivers/zink/zink_draw.cpp b/src/gallium/drivers/zink/zink_draw.cpp
index e7b95eb76a5..253a7dfeb65 100644
--- a/src/gallium/drivers/zink/zink_draw.cpp
+++ b/src/gallium/drivers/zink/zink_draw.cpp
@@ -417,6 +417,7 @@ zink_draw_vbo(struct pipe_context *pctx,
    VkDeviceSize counter_buffer_offsets[PIPE_MAX_SO_OUTPUTS];
    bool need_index_buffer_unref = false;
    bool mode_changed = ctx->gfx_pipeline_state.mode != dinfo->mode;
+   bool reads_drawid = ctx->shader_reads_drawid;
 
    update_barriers(ctx, false);
 
@@ -424,9 +425,8 @@ zink_draw_vbo(struct pipe_context *pctx,
       ctx->gfx_pipeline_state.dirty = true;
    bool drawid_broken = ctx->drawid_broken;
    ctx->drawid_broken = false;
-   if (!dindirect || !dindirect->buffer)
-      ctx->drawid_broken = BITSET_TEST(ctx->gfx_stages[PIPE_SHADER_VERTEX]->nir->info.system_values_read, SYSTEM_VALUE_DRAW_ID) &&
-                           (drawid_offset != 0 ||
+   if (reads_drawid && (!dindirect || !dindirect->buffer))
+      ctx->drawid_broken = (drawid_offset != 0 ||
                            (!HAS_MULTIDRAW && num_draws > 1) ||
                            (HAS_MULTIDRAW && num_draws > 1 && !dinfo->increment_draw_id));
    if (drawid_broken != ctx->drawid_broken)
diff --git a/src/gallium/drivers/zink/zink_program.c b/src/gallium/drivers/zink/zink_program.c
index ca67dd11dfe..dcffbd761a5 100644
--- a/src/gallium/drivers/zink/zink_program.c
+++ b/src/gallium/drivers/zink/zink_program.c
@@ -890,6 +890,13 @@ zink_bind_vs_state(struct pipe_context *pctx,
        !ctx->gfx_stages[PIPE_SHADER_TESS_EVAL]) {
       ctx->last_vertex_stage = cso;
    }
+   if (cso) {
+      struct zink_shader *zs = cso;
+      ctx->shader_reads_drawid = BITSET_TEST(zs->nir->info.system_values_read, SYSTEM_VALUE_DRAW_ID);
+   } else {
+      ctx->shader_reads_drawid = false;
+   }
+
 }
 
 static void



More information about the mesa-commit mailing list