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

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to