Mesa (main): zink: merge some streamout state emission into the same draw conditional

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Jul 2 00:08:33 UTC 2021


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

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

zink: merge some streamout state emission into the same draw conditional

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

---

 src/gallium/drivers/zink/zink_draw.c | 48 +++++++++++++++++++-----------------
 1 file changed, 25 insertions(+), 23 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_draw.c b/src/gallium/drivers/zink/zink_draw.c
index 1b84bb52900..9facc1d1f6f 100644
--- a/src/gallium/drivers/zink/zink_draw.c
+++ b/src/gallium/drivers/zink/zink_draw.c
@@ -449,34 +449,20 @@ zink_draw_vbo(struct pipe_context *pctx,
        } else
           index_buffer = dinfo->index.resource;
    }
-   if (ctx->xfb_barrier)
-      zink_emit_xfb_counter_barrier(ctx);
 
-   if (ctx->dirty_so_targets && ctx->num_so_targets)
-      zink_emit_stream_output_targets(pctx);
+   bool have_streamout = !!ctx->num_so_targets;
+   if (have_streamout) {
+      if (ctx->xfb_barrier)
+         zink_emit_xfb_counter_barrier(ctx);
+      if (ctx->dirty_so_targets)
+         zink_emit_stream_output_targets(pctx);
+   }
 
    if (so_target)
       zink_emit_xfb_vertex_input_barrier(ctx, zink_resource(so_target->base.buffer));
 
    barrier_draw_buffers(ctx, dinfo, dindirect, index_buffer);
 
-   for (int i = 0; i < ZINK_SHADER_COUNT; i++) {
-      struct zink_shader *shader = ctx->gfx_stages[i];
-      if (!shader)
-         continue;
-      enum pipe_shader_type stage = pipe_shader_type_from_mesa(shader->nir->info.stage);
-      if (ctx->num_so_targets &&
-          (stage == PIPE_SHADER_GEOMETRY ||
-          (stage == PIPE_SHADER_TESS_EVAL && !ctx->gfx_stages[PIPE_SHADER_GEOMETRY]) ||
-          (stage == PIPE_SHADER_VERTEX && !ctx->gfx_stages[PIPE_SHADER_GEOMETRY] && !ctx->gfx_stages[PIPE_SHADER_TESS_EVAL]))) {
-         for (unsigned j = 0; j < ctx->num_so_targets; j++) {
-            struct zink_so_target *t = zink_so_target(ctx->so_targets[j]);
-            if (t)
-               t->stride = shader->streamout.so_info.stride[j] * sizeof(uint32_t);
-         }
-      }
-   }
-
    if (zink_program_has_descriptors(&ctx->curr_program->base))
       screen->descriptors_update(ctx, false);
 
@@ -651,7 +637,23 @@ zink_draw_vbo(struct pipe_context *pctx,
 
    zink_query_update_gs_states(ctx);
 
-   if (ctx->num_so_targets) {
+   if (have_streamout) {
+      for (int i = 0; i < ZINK_SHADER_COUNT; i++) {
+         struct zink_shader *shader = ctx->gfx_stages[i];
+         if (!shader)
+            continue;
+         enum pipe_shader_type stage = pipe_shader_type_from_mesa(shader->nir->info.stage);
+         if ((stage == PIPE_SHADER_GEOMETRY ||
+             (stage == PIPE_SHADER_TESS_EVAL && !ctx->gfx_stages[PIPE_SHADER_GEOMETRY]) ||
+             (stage == PIPE_SHADER_VERTEX && !ctx->gfx_stages[PIPE_SHADER_GEOMETRY] && !ctx->gfx_stages[PIPE_SHADER_TESS_EVAL]))) {
+            for (unsigned j = 0; j < ctx->num_so_targets; j++) {
+               struct zink_so_target *t = zink_so_target(ctx->so_targets[j]);
+               if (t)
+                  t->stride = shader->streamout.so_info.stride[j] * sizeof(uint32_t);
+            }
+         }
+      }
+
       for (unsigned i = 0; i < ctx->num_so_targets; i++) {
          struct zink_so_target *t = zink_so_target(ctx->so_targets[i]);
          counter_buffers[i] = VK_NULL_HANDLE;
@@ -746,7 +748,7 @@ zink_draw_vbo(struct pipe_context *pctx,
    if (dinfo->index_size > 0 && (dinfo->has_user_indices || need_index_buffer_unref))
       pipe_resource_reference(&index_buffer, NULL);
 
-   if (ctx->num_so_targets) {
+   if (have_streamout) {
       for (unsigned i = 0; i < ctx->num_so_targets; i++) {
          struct zink_so_target *t = zink_so_target(ctx->so_targets[i]);
          if (t) {



More information about the mesa-commit mailing list