intel: Also get the DRI2 front buffer when doing front buffer reading.
authorEric Anholt <eric@anholt.net>
Sat, 20 Jun 2009 05:12:52 +0000 (22:12 -0700)
committerEric Anholt <eric@anholt.net>
Fri, 4 Sep 2009 21:40:21 +0000 (14:40 -0700)
(cherry picked from commit df70d3049a396af3601d2a1747770635a74120bb)

src/mesa/drivers/dri/i965/Makefile
src/mesa/drivers/dri/intel/intel_buffers.c
src/mesa/drivers/dri/intel/intel_context.c
src/mesa/drivers/dri/intel/intel_context.h

index 2934414d99a885a9f8744b70451e854dcca99f2a..81c2fdb0dc64ec2374c86ada04804e00c32ffe24 100644 (file)
@@ -22,6 +22,7 @@ DRIVER_SOURCES = \
        intel_pixel_bitmap.c \
        intel_pixel_copy.c \
        intel_pixel_draw.c \
+       intel_pixel_read.c \
        intel_state.c \
        intel_swapbuffers.c \
        intel_tex.c \
index d2fad9e4ea108aba883b6b0fbe9fd0eaac406fa7..44e34330a6bcd6acbefe8362163a3d46fca9e4fb 100644 (file)
@@ -345,6 +345,23 @@ intelDrawBuffer(GLcontext * ctx, GLenum mode)
 static void
 intelReadBuffer(GLcontext * ctx, GLenum mode)
 {
+   if ((ctx->DrawBuffer != NULL) && (ctx->DrawBuffer->Name == 0)) {
+      struct intel_context *const intel = intel_context(ctx);
+      const GLboolean was_front_buffer_reading =
+       intel->is_front_buffer_reading;
+
+      intel->is_front_buffer_reading = (mode == GL_FRONT_LEFT)
+       || (mode == GL_FRONT);
+
+      /* If we weren't front-buffer reading before but we are now, make sure
+       * that the front-buffer has actually been allocated.
+       */
+      if (!was_front_buffer_reading && intel->is_front_buffer_reading) {
+        intel_update_renderbuffers(intel->driContext,
+                                   intel->driContext->driDrawablePriv);
+      }
+   }
+
    if (ctx->ReadBuffer == ctx->DrawBuffer) {
       /* This will update FBO completeness status.
        * A framebuffer will be incomplete if the GL_READ_BUFFER setting
index 50ae677d2034163c07cb595db96fb55753b3e0da..977fad93133bf9d3616f5c34152d31b1d106924b 100644 (file)
@@ -220,7 +220,9 @@ intel_update_renderbuffers(__DRIcontext *context, __DRIdrawable *drawable)
       struct intel_renderbuffer *stencil_rb;
 
       i = 0;
-      if ((intel->is_front_buffer_rendering || !intel_fb->color_rb[1])
+      if ((intel->is_front_buffer_rendering ||
+          intel->is_front_buffer_reading ||
+          !intel_fb->color_rb[1])
           && intel_fb->color_rb[0]) {
         attachments[i++] = __DRI_BUFFER_FRONT_LEFT;
         attachments[i++] = intel_bits_per_pixel(intel_fb->color_rb[0]);
index b3db561fd5b6fdb4ec43f64411b9b330a7c603b9..e2b3943fb58dc0356f63965894818544efe599f9 100644 (file)
@@ -295,6 +295,14 @@ struct intel_context
     * easily.
     */
    GLboolean is_front_buffer_rendering;
+   /**
+    * Track whether front-buffer is the current read target.
+    *
+    * This is closely associated with is_front_buffer_rendering, but may
+    * be set separately.  The DRI2 fake front buffer must be referenced
+    * either way.
+    */
+   GLboolean is_front_buffer_reading;
 
    drm_clip_rect_t fboRect;     /**< cliprect for FBO rendering */