Mesa (master): intel: flush fake front buffer more robustly.

Paul Berry stereotype441 at kemper.freedesktop.org
Fri Jun 7 20:30:20 UTC 2013


Module: Mesa
Branch: master
Commit: 447df5eabac62d11740b23987cf91fb269bffcc6
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=447df5eabac62d11740b23987cf91fb269bffcc6

Author: Paul Berry <stereotype441 at gmail.com>
Date:   Wed May 29 09:48:26 2013 -0700

intel: flush fake front buffer more robustly.

When a fake front buffer is in use, if we request the front buffer
(using screen->dri2.loader->getBuffersWithFormat()), the X server
copies the real front buffer to the fake front buffer and returns the
fake front buffer.  We sometimes make redundant requests for the front
buffer (due to using a single counter to track invalidates for both
the front and back buffers), so there's a danger of pending front
buffer rendering getting overwritten when the redundant front buffer
request occurs.

Previous to this patch, intel_update_renderbuffers() worked around
that problem by sometimes doing intel_flush() and intel_flush_front()
before calling intel_query_dri2_buffers().  But it only did the
workaround when the front buffer was bound for drawing; it didn't do
it when the front buffer was bound for reading.

This patch moves the workaround code to intel_query_dri2_buffers(), so
that it happens in exactly the circumstances where it is needed.

This should fix some of the sporadic failures in Piglit tests
fbo-sys-blit and fbo-sys-sub-blit.

Reviewed-by: Chad Versace <chad.versace at linux.intel.com>
Reviewed-by: Anuj Phogat <anuj.phogat at gmail.com>

---

 src/mesa/drivers/dri/intel/intel_context.c |   20 +++++++++-----------
 1 files changed, 9 insertions(+), 11 deletions(-)

diff --git a/src/mesa/drivers/dri/intel/intel_context.c b/src/mesa/drivers/dri/intel/intel_context.c
index 54d0a69..7f8a2bb 100644
--- a/src/mesa/drivers/dri/intel/intel_context.c
+++ b/src/mesa/drivers/dri/intel/intel_context.c
@@ -186,17 +186,6 @@ intel_update_renderbuffers(__DRIcontext *context, __DRIdrawable *drawable)
    int i, count;
    const char *region_name;
 
-   /* If we're rendering to the fake front buffer, make sure all the
-    * pending drawing has landed on the real front buffer.  Otherwise
-    * when we eventually get to DRI2GetBuffersWithFormat the stale
-    * real front buffer contents will get copied to the new fake front
-    * buffer.
-    */
-   if (intel->is_front_buffer_rendering) {
-      intel_flush(&intel->ctx);
-      intel_flush_front(&intel->ctx);
-   }
-
    /* Set this up front, so that in case our buffers get invalidated
     * while we're getting new buffers, we don't clobber the stamp and
     * thus ignore the invalidate. */
@@ -925,6 +914,15 @@ intel_query_dri2_buffers(struct intel_context *intel,
    if ((intel->is_front_buffer_rendering ||
 	intel->is_front_buffer_reading ||
 	!back_rb) && front_rb) {
+      /* If a fake front buffer is in use, then querying for
+       * __DRI_BUFFER_FRONT_LEFT will cause the server to copy the image from
+       * the real front buffer to the fake front buffer.  So before doing the
+       * query, we need to make sure all the pending drawing has landed in the
+       * real front buffer.
+       */
+      intel_flush(&intel->ctx);
+      intel_flush_front(&intel->ctx);
+
       attachments[i++] = __DRI_BUFFER_FRONT_LEFT;
       attachments[i++] = intel_bits_per_pixel(front_rb);
    }




More information about the mesa-commit mailing list