Merge branch 'mesa_7_6_branch'
[mesa.git] / src / mesa / state_tracker / st_framebuffer.c
index 7072cbe62c7f598604d1e75f75819b2e92738aed..5c0d335d62d14af55fd9a6750ece0d0304e3f062 100644 (file)
@@ -66,7 +66,7 @@ st_create_framebuffer( const __GLcontextModes *visual,
       else {
          /* Only allocate front buffer right now if we're single buffered.
           * If double-buffered, allocate front buffer on demand later.
-          * See check_create_front_buffers().
+          * See check_create_front_buffers() and st_set_framebuffer_surface().
           */
          struct gl_renderbuffer *rb
             = st_new_renderbuffer_fb(colorFormat, samples, FALSE);
@@ -134,16 +134,7 @@ void st_resize_framebuffer( struct st_framebuffer *stfb,
    if (stfb->Base.Width != width || stfb->Base.Height != height) {
       GET_CURRENT_CONTEXT(ctx);
       if (ctx) {
-         if (stfb->InitWidth == 0 && stfb->InitHeight == 0) {
-            /* didn't have a valid size until now */
-            stfb->InitWidth = width;
-            stfb->InitHeight = height;
-            if (ctx->Viewport.Width <= 1) {
-               /* set context's initial viewport/scissor size */
-               _mesa_set_viewport(ctx, 0, 0, width, height);
-               _mesa_set_scissor(ctx, 0, 0, width, height);
-            }
-         }
+         _mesa_check_init_viewport(ctx, width, height);
 
          _mesa_resize_framebuffer(ctx, &stfb->Base, width, height);
 
@@ -179,8 +170,20 @@ st_set_framebuffer_surface(struct st_framebuffer *stfb,
 
    strb = st_renderbuffer(stfb->Base.Attachment[surfIndex].Renderbuffer);
 
-   /* fail */
-   if (!strb) return;
+   if (!strb) {
+      if (surfIndex == ST_SURFACE_FRONT_LEFT) {
+         /* Delayed creation when the window system supplies a fake front buffer */
+         struct st_renderbuffer *strb_back
+            = st_renderbuffer(stfb->Base.Attachment[ST_SURFACE_BACK_LEFT].Renderbuffer);
+         struct gl_renderbuffer *rb
+            = st_new_renderbuffer_fb(surf->format, strb_back->Base.NumSamples, FALSE);
+         _mesa_add_renderbuffer(&stfb->Base, BUFFER_FRONT_LEFT, rb);
+         strb = st_renderbuffer(rb);
+      } else {
+         /* fail */
+         return;
+      }
+   }
 
    /* replace the renderbuffer's surface/texture pointers */
    pipe_surface_reference( &strb->surface, surf );
@@ -289,7 +292,8 @@ st_notify_swapbuffers(struct st_framebuffer *stfb)
                PIPE_FLUSH_SWAPBUFFERS |
                PIPE_FLUSH_FRAME,
                 NULL );
-      ctx->st->frontbuffer_status = FRONT_STATUS_COPY_OF_BACK;
+      if (st_renderbuffer(stfb->Base.Attachment[BUFFER_BACK_LEFT].Renderbuffer))
+         ctx->st->frontbuffer_status = FRONT_STATUS_COPY_OF_BACK;
    }
 }