intel: Add a batch flush between front-buffer downsample and X protocol.
[mesa.git] / src / mesa / drivers / dri / i965 / gen7_viewport_state.c
index 7036ef6e161cd46c2f44d4e2e4a27cba3f87d140..8c5fcac2b22e3954b12f8f7c3458aa3ed4d76c89 100644 (file)
@@ -30,8 +30,7 @@
 static void
 gen7_upload_sf_clip_viewport(struct brw_context *brw)
 {
-   struct intel_context *intel = &brw->intel;
-   struct gl_context *ctx = &intel->ctx;
+   struct gl_context *ctx = &brw->ctx;
    const GLfloat depth_scale = 1.0F / ctx->DrawBuffer->_DepthMaxF;
    GLfloat y_scale, y_bias;
    const bool render_to_fbo = _mesa_is_user_fbo(ctx->DrawBuffer);
@@ -44,12 +43,17 @@ gen7_upload_sf_clip_viewport(struct brw_context *brw)
    brw->clip.vp_offset = brw->sf.vp_offset;
 
    /* According to the "Vertex X,Y Clamping and Quantization" section of the
-    * Strips and Fans documentation, Ivybridge and later don't have a maximum
-    * post-clamp delta.  However, the guardband extent must fit in [-32K, 32K)
-    * which gives us a maximum size of 64K.  Use 65000 rather than 65536 to be
-    * somewhat cautious---make the guardband slightly smaller than the maximum.
+    * Strips and Fans documentation, objects must not have a screen-space
+    * extents of over 8192 pixels, or they may be mis-rasterized.  The maximum
+    * screen space coordinates of a small object may larger, but we have no
+    * way to enforce the object size other than through clipping.
+    *
+    * If you're surprised that we set clip to -gbx to +gbx and it seems like
+    * we'll end up with 16384 wide, note that for a 8192-wide render target,
+    * we'll end up with a normal (-1, 1) clip volume that just covers the
+    * drawable.
     */
-   const float maximum_guardband_extent = 65000;
+   const float maximum_guardband_extent = 8192;
    float gbx = maximum_guardband_extent / (float) ctx->Viewport.Width;
    float gby = maximum_guardband_extent / (float) ctx->Viewport.Height;
 
@@ -94,8 +98,6 @@ const struct brw_tracked_state gen7_sf_clip_viewport = {
 
 static void upload_cc_viewport_state_pointer(struct brw_context *brw)
 {
-   struct intel_context *intel = &brw->intel;
-
    BEGIN_BATCH(2);
    OUT_BATCH(_3DSTATE_VIEWPORT_STATE_POINTERS_CC << 16 | (2 - 2));
    OUT_BATCH(brw->cc.vp_offset);