mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-23 19:10:21 +01:00
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> (cherry picked from commitd2fb6879a2)
This commit is contained in:
parent
2525534351
commit
592155a2fa
3 changed files with 14 additions and 11 deletions
|
|
@ -2324,7 +2324,7 @@
|
|||
"description": "panfrost: Process scissor state earlier",
|
||||
"nominated": true,
|
||||
"nomination_type": 1,
|
||||
"resolution": 0,
|
||||
"resolution": 1,
|
||||
"because_sha": "79356b2e5f1762aeaaa81cc148cd5b469a47713d"
|
||||
},
|
||||
{
|
||||
|
|
|
|||
|
|
@ -2628,9 +2628,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);
|
||||
}
|
||||
|
|
@ -3133,6 +3130,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
|
||||
|
|
@ -3149,12 +3159,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;
|
||||
|
|
|
|||
|
|
@ -593,7 +593,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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue