[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