[Mesa-dev] [PATCH 2/4] i965: Viewport extents on GEN8

Ben Widawsky benjamin.widawsky at intel.com
Mon Aug 4 12:24:02 PDT 2014


Viewport extents are a 3rd rectangle that defines which pixels get
discarded as part of the rasterization process. This can potentially
improve performance by reducing cache usage, and freeing up PS cycles.
It also permits the use of guardband clipping in all cases (see later
patch). The actual pixels drawn to the screen are an intersection of the
drawing rectangle, the viewport extents, and the scissor rectangle.

Scissor rectangle is not super important this discussion as it should
always help do the right thing provided the programmer uses it.

switch (viewport dimensions, drawrect dimension) {
   case viewport > drawing rectangle: no effects; break;
   case viewport == drawing rectangle: no effects; break;
   case viewport < drawing rectangle:
      Pixels (after the viewport transformation but before expensive
      rastersizing and shading operations) which are outside of the
      viewport are discarded.
}

I am unable to find a test case where this improves performance, but in
all my testing it doesn't hurt performance, and intuitively, it should
not ever hurt performance. It also permits us to use the guardband more
freely (see upcoming patch).

v2: Updating commit message.
---
 src/mesa/drivers/dri/i965/gen8_viewport_state.c | 24 +++++++++++++++---------
 1 file changed, 15 insertions(+), 9 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/gen8_viewport_state.c b/src/mesa/drivers/dri/i965/gen8_viewport_state.c
index b5171e0..04a4530 100644
--- a/src/mesa/drivers/dri/i965/gen8_viewport_state.c
+++ b/src/mesa/drivers/dri/i965/gen8_viewport_state.c
@@ -100,17 +100,23 @@ gen8_upload_sf_clip_viewport(struct brw_context *brw)
       vp[10] = -gby; /* y-min */
       vp[11] =  gby; /* y-max */
 
-      /* _NEW_SCISSOR | _NEW_VIEWPORT | _NEW_BUFFERS: Screen Space Viewport */
+      /* _NEW_SCISSOR | _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.
+       */
+      float viewport_Xmax = ctx->ViewportArray[i].X + ctx->ViewportArray[i].Width;
+      float viewport_Ymax = ctx->ViewportArray[i].Y + ctx->ViewportArray[i].Height;
       if (render_to_fbo) {
-         vp[12] = ctx->DrawBuffer->_Xmin;
-         vp[13] = ctx->DrawBuffer->_Xmax - 1;
-         vp[14] = ctx->DrawBuffer->_Ymin;
-         vp[15] = ctx->DrawBuffer->_Ymax - 1;
+         vp[12] = ctx->ViewportArray[i].X;
+         vp[13] = viewport_Xmax - 1;
+         vp[14] = ctx->ViewportArray[i].Y;
+         vp[15] = viewport_Ymax - 1;
       } else {
-         vp[12] = ctx->DrawBuffer->_Xmin;
-         vp[13] = ctx->DrawBuffer->_Xmax - 1;
-         vp[14] = ctx->DrawBuffer->Height - ctx->DrawBuffer->_Ymax;
-         vp[15] = ctx->DrawBuffer->Height - ctx->DrawBuffer->_Ymin - 1;
+         vp[12] = ctx->ViewportArray[i].X;
+         vp[13] = viewport_Xmax - 1;
+         vp[14] = ctx->DrawBuffer->Height - viewport_Ymax;
+         vp[15] = ctx->DrawBuffer->Height - ctx->ViewportArray[i].Y - 1;
       }
 
       vp += 16;
-- 
2.0.3



More information about the mesa-dev mailing list