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 <alyssa@collabora.com>
Reported-by: Icecream95 <ixn@disroot.org>
Reviewed-by: Icecream95 <ixn@disroot.org>
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: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15365>
This commit is contained in:
Alyssa Rosenzweig 2022-01-15 10:29:11 -05:00 committed by Marge Bot
parent 5afbb0e730
commit d2fb6879a2
2 changed files with 13 additions and 10 deletions

View File

@ -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;

View File

@ -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