[Mesa-dev] [PATCH] i965: Stop looking at NewDriverState when emitting 3DSTATE_URB
Kenneth Graunke
kenneth at whitecape.org
Fri Aug 18 23:26:28 UTC 2017
On Friday, August 18, 2017 4:21:39 PM PDT Jason Ekstrand wrote:
> Looking at NewDriverState is not safe in general. The state atom system
> is set up to ensure that new bits that get added to NewDriverState get
> accumulated into the set of bits used when emitting atoms but it doesn't
> go the other way. If we read NewDriverState, we may not get the full
> picture because the per-pipeline state (3D or compute) does not get
> added to NewDriverState before state emit is done. It's especially
> dangerous to do this from BLORP (either explicitly or implicitly when
> BLORP calls gen7_upload_urb) because that does not happen during one of
> the normal state upload paths.
>
> This commit solves the problem by whacking all of the per-shader-stage
> URB sizes to zero whenever we change the total URB size. We still have
> to flag BRW_NEW_URB_SIZE to ensure that the gen7_urb atom triggers but
> the actual decision in gen7_upload_urb can now be based entirely on URB
> sizes rather than on state atoms. This also makes BLORP correct because
> it just asks for a new URB config whenever the vsize is too small and so
> any change to the total URB size will trigger blorp to re-emit as well
> because 0 < vs_entry_size.
>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=102289
> Cc: Kenneth Graunke <kenneth at whitecape.org>
> Cc: mesa-stable at lists.freedesktop.org
> ---
> src/mesa/drivers/dri/i965/gen7_l3_state.c | 9 +++++++++
> src/mesa/drivers/dri/i965/gen7_urb.c | 4 +---
> src/mesa/drivers/dri/i965/genX_blorp_exec.c | 3 +--
> 3 files changed, 11 insertions(+), 5 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/gen7_l3_state.c b/src/mesa/drivers/dri/i965/gen7_l3_state.c
> index 536c00c..53638eb 100644
> --- a/src/mesa/drivers/dri/i965/gen7_l3_state.c
> +++ b/src/mesa/drivers/dri/i965/gen7_l3_state.c
> @@ -204,6 +204,15 @@ update_urb_size(struct brw_context *brw, const struct gen_l3_config *cfg)
> if (brw->urb.size != sz) {
> brw->urb.size = sz;
> brw->ctx.NewDriverState |= BRW_NEW_URB_SIZE;
> +
> + /* If we change the total URB size, reset the individual stage sizes to
> + * zero so that, even if there is no URB size change, gen7_upload_urb
> + * still re-emits 3DSTATE_URB_*.
> + */
> + brw->urb.vsize = 0;
> + brw->urb.gsize = 0;
> + brw->urb.hsize = 0;
> + brw->urb.dsize = 0;
> }
> }
>
> diff --git a/src/mesa/drivers/dri/i965/gen7_urb.c b/src/mesa/drivers/dri/i965/gen7_urb.c
> index d5b03ef..06113fa 100644
> --- a/src/mesa/drivers/dri/i965/gen7_urb.c
> +++ b/src/mesa/drivers/dri/i965/gen7_urb.c
> @@ -201,9 +201,7 @@ gen7_upload_urb(struct brw_context *brw, unsigned vs_size,
> /* If we're just switching between programs with the same URB requirements,
> * skip the rest of the logic.
> */
> - if (!(brw->ctx.NewDriverState & BRW_NEW_CONTEXT) &&
> - !(brw->ctx.NewDriverState & BRW_NEW_URB_SIZE) &&
> - brw->urb.vsize == entry_size[MESA_SHADER_VERTEX] &&
> + if (brw->urb.vsize == entry_size[MESA_SHADER_VERTEX] &&
> brw->urb.gs_present == gs_present &&
> brw->urb.gsize == entry_size[MESA_SHADER_GEOMETRY] &&
> brw->urb.tess_present == tess_present &&
> diff --git a/src/mesa/drivers/dri/i965/genX_blorp_exec.c b/src/mesa/drivers/dri/i965/genX_blorp_exec.c
> index c6eee4c..62d5c4a 100644
> --- a/src/mesa/drivers/dri/i965/genX_blorp_exec.c
> +++ b/src/mesa/drivers/dri/i965/genX_blorp_exec.c
> @@ -179,8 +179,7 @@ blorp_emit_urb_config(struct blorp_batch *batch,
> struct brw_context *brw = batch->driver_batch;
>
> #if GEN_GEN >= 7
> - if (!(brw->ctx.NewDriverState & (BRW_NEW_CONTEXT | BRW_NEW_URB_SIZE)) &&
> - brw->urb.vsize >= vs_entry_size)
> + if (brw->urb.vsize >= vs_entry_size)
> return;
>
> gen7_upload_urb(brw, vs_entry_size, false, false);
>
Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: This is a digitally signed message part.
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20170818/ac380867/attachment-0001.sig>
More information about the mesa-dev
mailing list