[Mesa-dev] [PATCH 1/2] i965: Viewport extents on gen8

Ben Widawsky benjamin.widawsky at intel.com
Thu Jul 3 11:23:13 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.
This will get hit if one's viewport is smaller than the full
renderbuffer, and scissoring is not used.

The functionality itself very much resembles scissoring.
---
 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 b366246..2bf5fbb 100644
--- a/src/mesa/drivers/dri/i965/gen8_viewport_state.c
+++ b/src/mesa/drivers/dri/i965/gen8_viewport_state.c
@@ -86,17 +86,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.1



More information about the mesa-dev mailing list