Module: Mesa
Branch: gallium-mesa-7.4
Commit: 4f17040cb10ab9b0c3f36f7ca82f4efd2f9088bc
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=4f17040cb10ab9b0c3f36f7ca82f4efd2f9088bc

Author: Ian Romanick <i...@freedesktop.org>
Date:   Mon Apr  6 13:15:54 2009 -0700

intel / DRI2: Track and flush front-buffer rendering

Track two flags:  whether or not front-buffer rendering is currently
enabled and whether or not front-buffer rendering has been enabled
since the last glFlush.  If the second flag is set, the front-buffer
is flushed via a loader call back.  If the first flag is cleared, the
second flag is cleared at this time.

Signed-off-by: Ian Romanick <ian.d.roman...@intel.com>
Reviewed-by: Kristian Høgsberg <k...@redhat.com>
(cherry picked from commit 43cf0d1eebb9f425e1a0e176394b64e2cb406709)

---

 src/mesa/drivers/dri/intel/intel_buffers.c |    8 ++++++++
 src/mesa/drivers/dri/intel/intel_context.c |   20 ++++++++++++++++++++
 src/mesa/drivers/dri/intel/intel_context.h |   18 ++++++++++++++++++
 3 files changed, 46 insertions(+), 0 deletions(-)

diff --git a/src/mesa/drivers/dri/intel/intel_buffers.c 
b/src/mesa/drivers/dri/intel/intel_buffers.c
index f1908cb..7bf1512 100644
--- a/src/mesa/drivers/dri/intel/intel_buffers.c
+++ b/src/mesa/drivers/dri/intel/intel_buffers.c
@@ -204,6 +204,8 @@ intel_draw_buffer(GLcontext * ctx, struct gl_framebuffer 
*fb)
               intel_batchbuffer_flush(intel->batch);
            intel->front_cliprects = GL_TRUE;
            colorRegions[0] = intel_get_rb_region(fb, BUFFER_FRONT_LEFT);
+
+           intel->front_buffer_dirty = GL_TRUE;
         }
         else {
            if (!intel->constant_cliprect && intel->front_cliprects)
@@ -328,6 +330,12 @@ intel_draw_buffer(GLcontext * ctx, struct gl_framebuffer 
*fb)
 static void
 intelDrawBuffer(GLcontext * ctx, GLenum mode)
 {
+   if (ctx->DrawBuffer->Name == 0) {
+      struct intel_context *const intel = intel_context(ctx);
+
+      intel->is_front_buffer_rendering = (mode == GL_FRONT_LEFT);
+   }
+
    intel_draw_buffer(ctx, ctx->DrawBuffer);
 }
 
diff --git a/src/mesa/drivers/dri/intel/intel_context.c 
b/src/mesa/drivers/dri/intel/intel_context.c
index 2e76e93..5f72761 100644
--- a/src/mesa/drivers/dri/intel/intel_context.c
+++ b/src/mesa/drivers/dri/intel/intel_context.c
@@ -525,6 +525,26 @@ intel_flush(GLcontext *ctx, GLboolean needs_mi_flush)
 
    if (intel->batch->map != intel->batch->ptr)
       intel_batchbuffer_flush(intel->batch);
+
+   if ((ctx->DrawBuffer->Name == 0) && intel->front_buffer_dirty) {
+      __DRIscreen *const screen = intel->intelScreen->driScrnPriv;
+
+      if ((screen->dri2.loader->base.version >= 2)
+         && (screen->dri2.loader->flushFrontBuffer != NULL)) {
+        (*screen->dri2.loader->flushFrontBuffer)(intel->driDrawable,
+                                                 
intel->driDrawable->loaderPrivate);
+
+        /* Only clear the dirty bit if front-buffer rendering is no longer
+         * enabled.  This is done so that the dirty bit can only be set in
+         * glDrawBuffer.  Otherwise the dirty bit would have to be set at
+         * each of N places that do rendering.  This has worse performances,
+         * but it is much easier to get correct.
+         */
+        if (intel->is_front_buffer_rendering) {
+           intel->front_buffer_dirty = GL_FALSE;
+        }
+      }
+   }
 }
 
 void
diff --git a/src/mesa/drivers/dri/intel/intel_context.h 
b/src/mesa/drivers/dri/intel/intel_context.h
index 8a8e59f..8f87d56 100644
--- a/src/mesa/drivers/dri/intel/intel_context.h
+++ b/src/mesa/drivers/dri/intel/intel_context.h
@@ -260,11 +260,29 @@ struct intel_context
     * flush time while the lock is held.
     */
    GLboolean constant_cliprect;
+
    /**
     * In !constant_cliprect mode, set to true if the front cliprects should be
     * used instead of back.
     */
    GLboolean front_cliprects;
+
+   /**
+    * Set if rendering has occured to the drawable's front buffer.
+    *
+    * This is used in the DRI2 case to detect that glFlush should also copy
+    * the contents of the fake front buffer to the real front buffer.
+    */
+   GLboolean front_buffer_dirty;
+
+   /**
+    * Track whether front-buffer rendering is currently enabled
+    *
+    * A separate flag is used to track this in order to support MRT more
+    * easily.
+    */
+   GLboolean is_front_buffer_rendering;
+
    drm_clip_rect_t fboRect;     /**< cliprect for FBO rendering */
 
    int perf_boxes;

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

Reply via email to