Merge commit 'origin/master' into gallium-0.2
[mesa.git] / src / mesa / state_tracker / st_framebuffer.c
index ec8928f200d535b8ec1be274cc106de7b5253e4b..ea22a9430398b45459ef14fd1f4189cae7f9e975 100644 (file)
@@ -153,9 +153,9 @@ void st_resize_framebuffer( struct st_framebuffer *stfb,
 }
 
 
-void st_unreference_framebuffer( struct st_framebuffer **stfb )
+void st_unreference_framebuffer( struct st_framebuffer *stfb )
 {
-   _mesa_unreference_framebuffer((struct gl_framebuffer **) stfb);
+   _mesa_unreference_framebuffer((struct gl_framebuffer **) &stfb);
 }
 
 
@@ -169,6 +169,7 @@ void
 st_set_framebuffer_surface(struct st_framebuffer *stfb,
                            uint surfIndex, struct pipe_surface *surf)
 {
+   GET_CURRENT_CONTEXT(ctx);
    static const GLuint invalid_size = 9999999;
    struct st_renderbuffer *strb;
    GLuint width, height, i;
@@ -176,12 +177,23 @@ st_set_framebuffer_surface(struct st_framebuffer *stfb,
    assert(surfIndex < BUFFER_COUNT);
 
    strb = st_renderbuffer(stfb->Base.Attachment[surfIndex].Renderbuffer);
-   assert(strb);
+
+   /* fail */
+   if (!strb) return;
 
    /* replace the renderbuffer's surface/texture pointers */
    pipe_surface_reference( &strb->surface, surf );
    pipe_texture_reference( &strb->texture, surf->texture );
 
+   if (ctx) {
+      /* If ctx isn't set, we've likely not made current yet.
+       * But when we do, we need to start setting this dirty bit
+       * to ensure the renderbuffer attachements are up-to-date
+       * via update_framebuffer.
+       */
+      ctx->st->dirty.st |= ST_NEW_FRAMEBUFFER;
+   }
+
    /* update renderbuffer's width/height */
    strb->Base.Width = surf->width;
    strb->Base.Height = surf->height;
@@ -284,14 +296,17 @@ st_notify_swapbuffers_complete(struct st_framebuffer *stfb)
 
    if (ctx && ctx->DrawBuffer == &stfb->Base) {
       struct st_renderbuffer *strb;
-      int i;
 
-      for (i = 0; i < BUFFER_COUNT; i++) {
-        if (stfb->Base.Attachment[i].Renderbuffer) {
-           strb = st_renderbuffer(stfb->Base.Attachment[i].Renderbuffer);
-           strb->surface->status = PIPE_SURFACE_STATUS_UNDEFINED;
-        }
-      }
+      /* Mark back color buffers as undefined */
+      strb = st_renderbuffer(stfb->Base.Attachment[BUFFER_BACK_LEFT].
+                             Renderbuffer);
+      if (strb && strb->surface)
+         strb->surface->status = PIPE_SURFACE_STATUS_UNDEFINED;
+
+      strb = st_renderbuffer(stfb->Base.Attachment[BUFFER_BACK_RIGHT].
+                             Renderbuffer);
+      if (strb && strb->surface)
+         strb->surface->status = PIPE_SURFACE_STATUS_UNDEFINED;
    }
 }
 
@@ -301,3 +316,10 @@ void *st_framebuffer_private( struct st_framebuffer *stfb )
    return stfb->Private;
 }
 
+void st_get_framebuffer_dimensions( struct st_framebuffer *stfb,
+                                   uint *width,
+                                   uint *height)
+{
+   *width = stfb->Base.Width;
+   *height = stfb->Base.Height;
+}