[Mesa-dev] [PATCH 09/10] i965: Handle rasterizer discard in the clipper rather than GS on Gen6.
Paul Berry
stereotype441 at gmail.com
Mon May 20 10:47:01 PDT 2013
On 17 May 2013 10:18, Kenneth Graunke <kenneth at whitecape.org> wrote:
> This has more of a negative impact than the previous patch, as on Gen6
> passing primitives through to the clipper means we actually have to make
> the GS thread write them to the URB.
>
> I don't see another good solution though, and rasterizer discard is not
> the most common of cases, so hopefully it won't be too terrible.
>
> Cc: Eric Anholt <eric at anholt.net>
> Cc: Paul Berry <stereotype441 at gmail.com>
> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
> ---
> src/mesa/drivers/dri/i965/brw_gs.c | 9 +--------
> src/mesa/drivers/dri/i965/brw_gs_emit.c | 30
> -----------------------------
> src/mesa/drivers/dri/i965/gen6_clip_state.c | 6 +++++-
> 3 files changed, 6 insertions(+), 39 deletions(-)
>
> This patch prevents breakage in patch 10. See patch 10 for the rationale.
>
This patch removes the last use of brw_gs_prog_key::rasterizer_discard.
Let's remove that unused field to avoid future confusion.
With that change, this patch is:
Reviewed-by: Paul Berry <stereotype441 at gmail.com>
>
> diff --git a/src/mesa/drivers/dri/i965/brw_gs.c
> b/src/mesa/drivers/dri/i965/brw_gs.c
> index a432b76..f354dd9 100644
> --- a/src/mesa/drivers/dri/i965/brw_gs.c
> +++ b/src/mesa/drivers/dri/i965/brw_gs.c
> @@ -214,12 +214,6 @@ static void populate_key( struct brw_context *brw,
>
> swizzle_for_offset[linked_xfb_info->Outputs[i].ComponentOffset];
> }
> }
> - /* On Gen6, GS is also used for rasterizer discard. */
> - /* BRW_NEW_RASTERIZER_DISCARD */
> - if (ctx->RasterDiscard) {
> - key->need_gs_prog = true;
> - key->rasterizer_discard = true;
> - }
> } else {
> /* Pre-gen6, GS is used to transform QUADLIST, QUADSTRIP, and
> LINELOOP
> * into simpler primitives.
> @@ -259,8 +253,7 @@ const struct brw_tracked_state brw_gs_prog = {
> .dirty = {
> .mesa = (_NEW_LIGHT),
> .brw = (BRW_NEW_PRIMITIVE |
> - BRW_NEW_TRANSFORM_FEEDBACK |
> - BRW_NEW_RASTERIZER_DISCARD),
> + BRW_NEW_TRANSFORM_FEEDBACK),
> .cache = CACHE_NEW_VS_PROG
> },
> .emit = brw_upload_gs_prog
> diff --git a/src/mesa/drivers/dri/i965/brw_gs_emit.c
> b/src/mesa/drivers/dri/i965/brw_gs_emit.c
> index 87ff9f0..cbfc6aa 100644
> --- a/src/mesa/drivers/dri/i965/brw_gs_emit.c
> +++ b/src/mesa/drivers/dri/i965/brw_gs_emit.c
> @@ -201,28 +201,6 @@ static void brw_gs_emit_vue(struct brw_gs_compile *c,
> }
>
> /**
> - * De-allocate the URB entry that was previously allocated to this thread
> - * (without writing any vertex data to it), and terminate the thread.
> This is
> - * used to implement RASTERIZER_DISCARD functionality.
> - */
> -static void brw_gs_terminate(struct brw_gs_compile *c)
> -{
> - struct brw_compile *p = &c->func;
> - brw_urb_WRITE(p,
> - retype(brw_null_reg(), BRW_REGISTER_TYPE_UD), /* dest */
> - 0, /* msg_reg_nr */
> - c->reg.header, /* src0 */
> - false, /* allocate */
> - false, /* used */
> - 1, /* msg_length */
> - 0, /* response_length */
> - true, /* eot */
> - true, /* writes_complete */
> - 0, /* offset */
> - BRW_URB_SWIZZLE_NONE);
> -}
> -
> -/**
> * Send an FF_SYNC message to ensure that all previously spawned GS
> threads
> * have finished sending primitives down the pipeline, and to allocate a
> URB
> * entry for the first output vertex. Only needed when
> intel->needs_ff_sync
> @@ -484,14 +462,6 @@ gen6_sol_program(struct brw_gs_compile *c, struct
> brw_gs_prog_key *key,
>
> brw_gs_ff_sync(c, 1);
>
> - /* If RASTERIZER_DISCARD is enabled, we have nothing further to do, so
> - * release the URB that was just allocated, and terminate the thread.
> - */
> - if (key->rasterizer_discard) {
> - brw_gs_terminate(c);
> - return;
> - }
> -
> brw_gs_overwrite_header_dw2_from_r0(c);
> switch (num_verts) {
> case 1:
> diff --git a/src/mesa/drivers/dri/i965/gen6_clip_state.c
> b/src/mesa/drivers/dri/i965/gen6_clip_state.c
> index 1811a3f..b5e22dc 100644
> --- a/src/mesa/drivers/dri/i965/gen6_clip_state.c
> +++ b/src/mesa/drivers/dri/i965/gen6_clip_state.c
> @@ -77,6 +77,10 @@ upload_clip_state(struct brw_context *brw)
> dw2 |= GEN6_CLIP_GB_TEST;
> }
>
> + /* BRW_NEW_RASTERIZER_DISCARD */
> + if (ctx->RasterDiscard)
> + dw2 |= GEN6_CLIP_MODE_REJECT_ALL;
> +
> BEGIN_BATCH(4);
> OUT_BATCH(_3DSTATE_CLIP << 16 | (4 - 2));
> OUT_BATCH(dw1);
> @@ -94,7 +98,7 @@ upload_clip_state(struct brw_context *brw)
> const struct brw_tracked_state gen6_clip_state = {
> .dirty = {
> .mesa = _NEW_TRANSFORM | _NEW_LIGHT | _NEW_BUFFERS,
> - .brw = (BRW_NEW_CONTEXT),
> + .brw = BRW_NEW_CONTEXT | BRW_NEW_RASTERIZER_DISCARD,
> .cache = CACHE_NEW_WM_PROG
> },
> .emit = upload_clip_state,
> --
> 1.8.2.3
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20130520/6ff66392/attachment.html>
More information about the mesa-dev
mailing list