st: when creating an on-demand front color buffer, init to back buffer image
authorBrian Paul <brianp@vmware.com>
Fri, 1 May 2009 18:48:46 +0000 (12:48 -0600)
committerBrian Paul <brianp@vmware.com>
Fri, 1 May 2009 18:54:16 +0000 (12:54 -0600)
When we create a new front color buffer (user called glDrawBuffer(GL_FRONT))
initialize it to the contents of the back buffer.  Any previous call to
SwapBuffers() would have done that in effect, so make it reality.

src/mesa/state_tracker/st_cb_fbo.c

index fe9befaa2c68e3649aaa686b8a4786d30cd493e0..9ae4208a18d99db5cf1b363628ad2d0556a02c39 100644 (file)
@@ -454,6 +454,31 @@ st_validate_framebuffer(GLcontext *ctx, struct gl_framebuffer *fb)
 }
 
 
+/**
+ * Copy back color buffer to front color buffer.
+ */
+static void
+copy_back_to_front(struct st_context *st,
+                   struct gl_framebuffer *fb,
+                   gl_buffer_index frontIndex,
+                   gl_buffer_index backIndex)
+
+{
+   struct st_framebuffer *stfb = (struct st_framebuffer *) fb;
+   struct pipe_surface *surf_front, *surf_back;
+
+   (void) st_get_framebuffer_surface(stfb, frontIndex, &surf_front);
+   (void) st_get_framebuffer_surface(stfb, backIndex, &surf_back);
+
+   if (surf_front && surf_back) {
+      st->pipe->surface_copy(st->pipe,
+                             surf_front, 0, 0,  /* dest */
+                             surf_back, 0, 0,   /* src */
+                             fb->Width, fb->Height);
+   }
+}
+
+
 /**
  * Check if we're drawing into, or read from, a front color buffer.  If the
  * front buffer is missing, create it now.
@@ -493,7 +518,7 @@ check_create_front_buffer(GLcontext *ctx, struct gl_framebuffer *fb,
          uint samples;
 
          if (0)
-            _mesa_debug(ctx, "Allocate new front buffer");
+            _mesa_debug(ctx, "Allocate new front buffer\n");
 
          /* get back renderbuffer info */
          back = st_renderbuffer(fb->Attachment[backIndex].Renderbuffer);
@@ -507,6 +532,11 @@ check_create_front_buffer(GLcontext *ctx, struct gl_framebuffer *fb,
          /* alloc texture/surface for new front buffer */
          front->AllocStorage(ctx, front, front->InternalFormat,
                              fb->Width, fb->Height);
+
+         /* initialize the front color buffer contents by copying
+          * the back buffer.
+          */
+         copy_back_to_front(ctx->st, fb, frontIndex, backIndex);
       }
    }
 }