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