[Mesa-dev] [PATCH 1/2] i965: Be more clever about setting up our viewport clip

Samuel Iglesias Gonsálvez siglesias at igalia.com
Mon Nov 6 11:36:07 UTC 2017


Both patches are,

Reviewed-by: Samuel Iglesias Gonsálvez <siglesias at igalia.com>

Sam

On Fri, 2017-11-03 at 15:31 -0700, Jason Ekstrand wrote:
> Before, we were trusting in the hardware to take the intersection
> of the viewport clip with the drawing rectangle.  Unfortunately,
> 3DSTATE_DRAWING_RECTANGLE is fairly expensive because it implicitly
> does a full pipeline stall.  If we're a bit more careful with our
> viewport clipping, we can just re-emit it once at context creation
> time.
> ---
>  src/mesa/drivers/dri/i965/genX_state_upload.c | 20 ++++++++++++-----
> ---
>  1 file changed, 12 insertions(+), 8 deletions(-)
> 
> diff --git a/src/mesa/drivers/dri/i965/genX_state_upload.c
> b/src/mesa/drivers/dri/i965/genX_state_upload.c
> index b7a6cd7..9fe90a2 100644
> --- a/src/mesa/drivers/dri/i965/genX_state_upload.c
> +++ b/src/mesa/drivers/dri/i965/genX_state_upload.c
> @@ -2451,24 +2451,28 @@ genX(upload_sf_clip_viewport)(struct
> brw_context *brw)
>  #elif GEN_GEN >= 8
>        /* _NEW_VIEWPORT | _NEW_BUFFERS: Screen Space Viewport
>         * The hardware will take the intersection of the drawing
> rectangle,
> -       * scissor rectangle, and the viewport extents. We don't need
> to be
> -       * smart, and can therefore just program the viewport extents.
> +       * scissor rectangle, and the viewport extents.  However,
> emitting
> +       * 3DSTATE_DRAWING_RECTANGLE is expensive since it requires a
> full
> +       * pipeline stall so we're better off just being a little more
> clever
> +       * with our viewport so we can emit it once at context
> creation time.
>         */
> +      const float viewport_Xmin = MAX2(ctx->ViewportArray[i].X, 0);
> +      const float viewport_Ymin = MAX2(ctx->ViewportArray[i].Y, 0);
>        const float viewport_Xmax =
> -         ctx->ViewportArray[i].X + ctx->ViewportArray[i].Width;
> +         MIN2(ctx->ViewportArray[i].X + ctx->ViewportArray[i].Width, 
> fb_width);
>        const float viewport_Ymax =
> -         ctx->ViewportArray[i].Y + ctx->ViewportArray[i].Height;
> +         MIN2(ctx->ViewportArray[i].Y + ctx-
> >ViewportArray[i].Height, fb_height);
>  
>        if (render_to_fbo) {
> -         sfv.XMinViewPort = ctx->ViewportArray[i].X;
> +         sfv.XMinViewPort = viewport_Xmin;
>           sfv.XMaxViewPort = viewport_Xmax - 1;
> -         sfv.YMinViewPort = ctx->ViewportArray[i].Y;
> +         sfv.YMinViewPort = viewport_Ymin;
>           sfv.YMaxViewPort = viewport_Ymax - 1;
>        } else {
> -         sfv.XMinViewPort = ctx->ViewportArray[i].X;
> +         sfv.XMinViewPort = viewport_Xmin;
>           sfv.XMaxViewPort = viewport_Xmax - 1;
>           sfv.YMinViewPort = fb_height - viewport_Ymax;
> -         sfv.YMaxViewPort = fb_height - ctx->ViewportArray[i].Y - 1;
> +         sfv.YMaxViewPort = fb_height - viewport_Ymin - 1;
>        }
>  #endif
>  
-------------- 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/20171106/e896ebf4/attachment.sig>


More information about the mesa-dev mailing list