From d2fb6879a2934de03323b9c72b2f4987b2bc38d9 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Sat, 15 Jan 2022 10:29:11 -0500 Subject: [PATCH] panfrost: Process scissor state earlier Otherwise, if batch->scissor_culls_everything is set for a single draw, every draw after it in the batch will be skipped because the new scissor/viewport state will never be processed. Process scissor state early in draw_vbo to fix this interaction. We do need to be careful: setting something on the batch can only happen when we've decided on a batch. If we have to select a fresh batch due to too many draws, that must happen first. This is pretty clear in the code but worth noting for the diff. Signed-off-by: Alyssa Rosenzweig Reported-by: Icecream95 Reviewed-by: Icecream95 Fixes: 79356b2e ("panfrost: Skip rasterizer discard draws without side effects") Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/5839 Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/6136 Part-of: --- src/gallium/drivers/panfrost/pan_cmdstream.c | 22 ++++++++++++-------- src/panfrost/ci/panfrost-g52-fails.txt | 1 - 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/gallium/drivers/panfrost/pan_cmdstream.c b/src/gallium/drivers/panfrost/pan_cmdstream.c index 8af81f4b9f5..0f23da2b12e 100644 --- a/src/gallium/drivers/panfrost/pan_cmdstream.c +++ b/src/gallium/drivers/panfrost/pan_cmdstream.c @@ -2642,9 +2642,6 @@ panfrost_update_state_3d(struct panfrost_batch *batch) { unsigned dirty = batch->ctx->dirty; - if (dirty & (PAN_DIRTY_VIEWPORT | PAN_DIRTY_SCISSOR)) - batch->viewport = panfrost_emit_viewport(batch); - if (dirty & PAN_DIRTY_TLS_SIZE) panfrost_batch_adjust_stack_size(batch); } @@ -3144,6 +3141,19 @@ panfrost_draw_vbo(struct pipe_context *pipe, /* Do some common setup */ struct panfrost_batch *batch = panfrost_get_batch_for_fbo(ctx); + /* Don't add too many jobs to a single batch. Hardware has a hard limit + * of 65536 jobs, but we choose a smaller soft limit (arbitrary) to + * avoid the risk of timeouts. This might not be a good idea. */ + if (unlikely(batch->scoreboard.job_index > 10000)) + batch = panfrost_get_fresh_batch_for_fbo(ctx, "Too many draws"); + + /* panfrost_batch_skip_rasterization reads + * batch->scissor_culls_everything, which is set by + * panfrost_emit_viewport, so call that first. + */ + if (ctx->dirty & (PAN_DIRTY_VIEWPORT | PAN_DIRTY_SCISSOR)) + batch->viewport = panfrost_emit_viewport(batch); + /* If rasterization discard is enabled but the vertex shader does not * have side effects (including transform feedback), skip the draw * altogether. This is always an optimization. Additionally, this is @@ -3160,12 +3170,6 @@ panfrost_draw_vbo(struct pipe_context *pipe, return; } - /* Don't add too many jobs to a single batch. Hardware has a hard limit - * of 65536 jobs, but we choose a smaller soft limit (arbitrary) to - * avoid the risk of timeouts. This might not be a good idea. */ - if (unlikely(batch->scoreboard.job_index > 10000)) - batch = panfrost_get_fresh_batch_for_fbo(ctx, "Too many draws"); - unsigned zs_draws = ctx->depth_stencil->draws; batch->draws |= zs_draws; batch->resolve |= zs_draws; diff --git a/src/panfrost/ci/panfrost-g52-fails.txt b/src/panfrost/ci/panfrost-g52-fails.txt index 07be170f72e..68a2d677df8 100644 --- a/src/panfrost/ci/panfrost-g52-fails.txt +++ b/src/panfrost/ci/panfrost-g52-fails.txt @@ -583,7 +583,6 @@ spec@!opengl 2.1@pbo@test_polygon_stip,Fail spec@!opengl 2.1@polygon-stipple-fs,Fail spec@!opengl 3.0@gl-3.0-vertexattribipointer,Fail spec@!opengl 3.0@required-texture-attachment-formats,Fail -spec@!opengl 3.0@viewport-clamp,Crash spec@!opengl 3.1@primitive-restart-xfb flush,Fail spec@!opengl 3.1@primitive-restart-xfb generated,Fail spec@!opengl 3.1@primitive-restart-xfb written,Fail