Merge branch 'i915tex_privbuffers' into softpipe_0_1_branch
authorKeith Whitwell <keith@tungstengraphics.com>
Tue, 31 Jul 2007 13:37:45 +0000 (14:37 +0100)
committerKeith Whitwell <keith@tungstengraphics.com>
Tue, 31 Jul 2007 13:37:45 +0000 (14:37 +0100)
Conflicts:

src/mesa/drivers/dri/i915tex/intel_buffers.c
src/mesa/drivers/dri/i915tex/intel_context.c
src/mesa/drivers/dri/i915tex/intel_fbo.c
src/mesa/drivers/dri/i915tex/intel_pixel_draw.c

1  2 
src/mesa/drivers/dri/common/dri_util.c
src/mesa/drivers/dri/i915tex/i915_vtbl.c
src/mesa/drivers/dri/i915tex/intel_buffers.c
src/mesa/drivers/dri/i915tex/intel_context.c
src/mesa/drivers/dri/i915tex/intel_fbo.c
src/mesa/drivers/dri/i915tex/intel_fbo.h

index c30e66f1722c11b025b3ab3faa94f5155cb4fe1b,d785382f39d835c81286284469cad2ce47511091..6e8a5b52180184fc163df96cc4b1bca92e0b86fb
@@@ -120,7 -120,7 +120,7 @@@ static __DRIdrawable *__driFindDrawable
   * Find drawables in the local hash that have been destroyed on the
   * server.
   * 
-  * \param drawHash  Hash-table containing all know drawables.
+  * \param drawHash  Hash-table containing all known drawables.
   */
  static void __driGarbageCollectDrawables(void *drawHash)
  {
@@@ -235,6 -235,12 +235,12 @@@ static GLboolean driUnbindContext(__DRI
        prp->refcount--;
      }
  
+    /* destroy the drawables if they no longer exist on the server */
+    if ((pdp->refcount == 0) || (prp->refcount == 0)) {
+       /* probably shouldn't need the collector here,
+          as we know the affected drawables (or could there be others?) */
+       __driGarbageCollectDrawables(pdp->driScreenPriv->drawHash);
+    }
  
      /* XXX this is disabled so that if we call SwapBuffers on an unbound
       * window we can determine the last context bound to the window and
@@@ -428,12 -434,10 +434,12 @@@ __driUtilUpdateDrawableInfo(__DRIdrawab
  
      if (pdp->pClipRects) {
        _mesa_free(pdp->pClipRects); 
 +      pdp->pClipRects = NULL;
      }
  
      if (pdp->pBackClipRects) {
        _mesa_free(pdp->pBackClipRects); 
 +      pdp->pBackClipRects = NULL;
      }
  
      DRM_SPINUNLOCK(&psp->pSAREA->drawable_lock, psp->drawLockID);
index 0e7ca9586e81be91b701a2e233ddb4d23c5de2cd,13ca9aee6bd5b007d85d26575fd26fcf3f6c0759..cc74ceae18010bc144dffbc82a4bdf0246420d0a
  #include "i915_context.h"
  
  static void
- i915_render_start(struct intel_context *intel)
+ i915_render_prevalidate(struct intel_context *intel)
  {
     struct i915_context *i915 = i915_context(&intel->ctx);
  
     i915ValidateFragmentProgram(i915);
  }
  
+ static void
+ i915_render_start(struct intel_context *intel)
+ {
+ }
  
  static void
  i915_reduced_primitive_state(struct intel_context *intel, GLenum rprim)
@@@ -61,7 -66,6 +66,7 @@@
     st1 &= ~ST1_ENABLE;
  
     switch (rprim) {
 +   case GL_QUADS: /* from RASTERIZE(GL_QUADS) in t_dd_tritemp.h */
     case GL_TRIANGLES:
        if (intel->ctx.Polygon.StippleFlag && intel->hw_stipple)
           st1 |= ST1_ENABLE;
@@@ -548,6 -552,7 +553,7 @@@ i915InitVtbl(struct i915_context *i915
     i915->intel.vtbl.lost_hardware = i915_lost_hardware;
     i915->intel.vtbl.reduced_primitive_state = i915_reduced_primitive_state;
     i915->intel.vtbl.render_start = i915_render_start;
+    i915->intel.vtbl.render_prevalidate = i915_render_prevalidate;
     i915->intel.vtbl.set_draw_region = i915_set_draw_region;
     i915->intel.vtbl.update_texture_state = i915UpdateTextureState;
     i915->intel.vtbl.flush_cmd = i915_flush_cmd;
index 17b4feadf854f1d4c84b41c2018d41c06a1afd9d,4b2a4acaf98130cf9d59285647c74d8123149f00..72c7b5ae454e9df7898ac75b8a5964f0533cb024
@@@ -125,15 -125,14 +125,14 @@@ intel_readbuf_region(struct intel_conte
  
  
  /**
-  * Update the following fields for rendering to a user-created FBO:
+  * Update the following fields for rendering:
   *   intel->numClipRects
   *   intel->pClipRects
-  *   intel->drawX
-  *   intel->drawY
   */
  static void
  intelSetRenderbufferClipRects(struct intel_context *intel)
  {
+    /* zero-sized buffers might be legal? */
     assert(intel->ctx.DrawBuffer->Width > 0);
     assert(intel->ctx.DrawBuffer->Height > 0);
     intel->fboRect.x1 = 0;
     intel->fboRect.y2 = intel->ctx.DrawBuffer->Height;
     intel->numClipRects = 1;
     intel->pClipRects = &intel->fboRect;
-    intel->drawX = 0;
-    intel->drawY = 0;
  }
  
- /**
-  * As above, but for rendering private front/back buffer of a window.
-  * \sa intelSetPrivbufClipRects
-  */
- static void
- intelSetPrivbufClipRects(struct intel_context *intel)
- {
-    __DRIdrawablePrivate *dPriv = intel->driDrawable;
-    if (!dPriv)
-       return;
-    intel->fakeClipRect.x1 = 0;
-    intel->fakeClipRect.y1 = 0;
-    intel->fakeClipRect.x2 = dPriv->w;
-    intel->fakeClipRect.y2 = dPriv->h;
-    intel->numClipRects = 1;
-    intel->pClipRects = &intel->fakeClipRect;
-    intel->drawX = 0;
-    intel->drawY = 0;
- }
  
  /**
   * This will be called whenever the currently bound window is moved/resized.
@@@ -183,11 -157,15 +157,15 @@@ intelWindowMoved(struct intel_context *
  
     if (!intel->ctx.DrawBuffer) {
        /* when would this happen? -BP */
+       assert(0);
        intel->numClipRects = 0;
     }
  
+    /* Update Mesa's notion of window size */
+    driUpdateFramebufferSize(ctx, dPriv);
+    intel_fb->Base.Initialized = GL_TRUE; /* XXX remove someday */
  
-    if (intel->intelScreen->driScrnPriv->ddxMinor >= 7) {
+    {
        drmI830Sarea *sarea = intel->sarea;
        drm_clip_rect_t drw_rect = { .x1 = dPriv->x, .x2 = dPriv->x + dPriv->w,
                                   .y1 = dPriv->y, .y2 = dPriv->y + dPriv->h };
        intel_fb->pf_current_page = (intel->sarea->pf_current_page >>
                                   (intel_fb->pf_pipes & 0x2)) & 0x3;
  
-       intel_fb->pf_num_pages = intel->intelScreen->third.handle ? 3 : 2;
+       intel_fb->pf_num_pages = 2 /*intel->intelScreen->third.handle ? 3 : 2*/;
  
        pf_active = pf_pipes && (pf_pipes & intel->sarea->pf_active) == pf_pipes;
  
         flags = intel_fb->vblank_flags & ~VBLANK_FLAG_SECONDARY;
        }
  
 -      if (flags != intel_fb->vblank_flags) {
 +      if (flags != intel_fb->vblank_flags && intel_fb->vblank_flags &&
 +        !(intel_fb->vblank_flags & VBLANK_FLAG_NO_IRQ)) {
         drmVBlank vbl;
         int i;
  
         }
  
         for (i = 0; i < intel_fb->pf_num_pages; i++) {
 -          if (!intel_fb->color_rb[i])
 +          if (!intel_fb->color_rb[i] ||
 +              (intel_fb->vbl_waited - intel_fb->color_rb[i]->vbl_pending) <=
 +              (1<<23))
               continue;
  
            vbl.request.sequence = intel_fb->color_rb[i]->vbl_pending;
               intel_fb->color_rb[i]->vbl_pending = intel_fb->vbl_waited;
         }
        }
-    } else {
-       intel_fb->vblank_flags &= ~VBLANK_FLAG_SECONDARY;
     }
  
-    /* Update Mesa's notion of window size */
-    driUpdateFramebufferSize(ctx, dPriv);
-    intel_fb->Base.Initialized = GL_TRUE; /* XXX remove someday */
     /* Update hardware scissor */
     ctx->Driver.Scissor(ctx, ctx->Scissor.X, ctx->Scissor.Y,
                         ctx->Scissor.Width, ctx->Scissor.Height);
@@@ -335,7 -304,6 +307,6 @@@ intelClearWithTris(struct intel_contex
  
     LOCK_HARDWARE(intel);
  
-    /* XXX FBO: was: intel->driDrawable->numClipRects */
     if (intel->numClipRects) {
        GLint cx, cy, cw, ch;
        GLuint buf;
           /* XXX: Using INTEL_BATCH_NO_CLIPRECTS here is dangerous as the
            * drawing origin may not be correctly emitted.
            */
-          intel_meta_draw_quad(intel, clear.x1, clear.x2, clear.y1, clear.y2, intel->ctx.Depth.Clear, clearColor, 0, 0, 0, 0);   /* texcoords */
+          intel_meta_draw_quad(intel, clear.x1, clear.x2, clear.y1, clear.y2,
+                               intel->ctx.Depth.Clear, clearColor, 0, 0, 0, 0);   /* texcoords */
  
           mask &=
              ~(BUFFER_BIT_BACK_LEFT | BUFFER_BIT_STENCIL | BUFFER_BIT_DEPTH);
  }
  
  
- /**
-  * Copy the window contents named by dPriv to the rotated (or reflected)
-  * color buffer.
-  * srcBuf is BUFFER_BIT_FRONT_LEFT or BUFFER_BIT_BACK_LEFT to indicate the source.
-  */
- void
- intelRotateWindow(struct intel_context *intel,
-                   __DRIdrawablePrivate * dPriv, GLuint srcBuf)
- {
-    intelScreenPrivate *screen = intel->intelScreen;
-    drm_clip_rect_t fullRect;
-    struct intel_framebuffer *intel_fb;
-    struct intel_region *src;
-    const drm_clip_rect_t *clipRects;
-    int numClipRects;
-    int i;
-    GLenum format, type;
-    int xOrig, yOrig;
-    int origNumClipRects;
-    drm_clip_rect_t *origRects;
-    /*
-     * set up hardware state
-     */
-    intelFlush(&intel->ctx);
-    LOCK_HARDWARE(intel);
-    if (!intel->numClipRects) {
-       UNLOCK_HARDWARE(intel);
-       return;
-    }
-    intel->vtbl.install_meta_state(intel);
-    intel->vtbl.meta_no_depth_write(intel);
-    intel->vtbl.meta_no_stencil_write(intel);
-    intel->vtbl.meta_color_mask(intel, GL_FALSE);
-    /* save current drawing origin and cliprects (restored at end) */
-    xOrig = intel->drawX;
-    yOrig = intel->drawY;
-    origNumClipRects = intel->numClipRects;
-    origRects = intel->pClipRects;
-    /*
-     * set drawing origin, cliprects for full-screen access to rotated screen
-     */
-    fullRect.x1 = 0;
-    fullRect.y1 = 0;
-    fullRect.x2 = screen->rotatedWidth;
-    fullRect.y2 = screen->rotatedHeight;
-    intel->drawX = 0;
-    intel->drawY = 0;
-    intel->numClipRects = 1;
-    intel->pClipRects = &fullRect;
-    intel->vtbl.meta_draw_region(intel, screen->rotated_region, NULL);    /* ? */
-    intel_fb = dPriv->driverPrivate;
-    if ((srcBuf == BUFFER_BIT_BACK_LEFT && !intel_fb->pf_active)) {
-       src = intel_get_rb_region(&intel_fb->Base, BUFFER_BACK_LEFT);
-       clipRects = dPriv->pBackClipRects;
-       numClipRects = dPriv->numBackClipRects;
-    }
-    else {
-       src = intel_get_rb_region(&intel_fb->Base, BUFFER_FRONT_LEFT);
-       clipRects = dPriv->pClipRects;
-       numClipRects = dPriv->numClipRects;
-    }
-    if (src->cpp == 4) {
-       format = GL_BGRA;
-       type = GL_UNSIGNED_BYTE;
-    }
-    else {
-       format = GL_BGR;
-       type = GL_UNSIGNED_SHORT_5_6_5_REV;
-    }
-    /* set the whole screen up as a texture to avoid alignment issues */
-    intel->vtbl.meta_tex_rect_source(intel,
-                                     src->buffer,
-                                     screen->width,
-                                     screen->height, src->pitch, format, type);
-    intel->vtbl.meta_texture_blend_replace(intel);
-    /*
-     * loop over the source window's cliprects
-     */
-    for (i = 0; i < numClipRects; i++) {
-       int srcX0 = clipRects[i].x1;
-       int srcY0 = clipRects[i].y1;
-       int srcX1 = clipRects[i].x2;
-       int srcY1 = clipRects[i].y2;
-       GLfloat verts[4][2], tex[4][2];
-       int j;
-       /* build vertices for four corners of clip rect */
-       verts[0][0] = srcX0;
-       verts[0][1] = srcY0;
-       verts[1][0] = srcX1;
-       verts[1][1] = srcY0;
-       verts[2][0] = srcX1;
-       verts[2][1] = srcY1;
-       verts[3][0] = srcX0;
-       verts[3][1] = srcY1;
-       /* .. and texcoords */
-       tex[0][0] = srcX0;
-       tex[0][1] = srcY0;
-       tex[1][0] = srcX1;
-       tex[1][1] = srcY0;
-       tex[2][0] = srcX1;
-       tex[2][1] = srcY1;
-       tex[3][0] = srcX0;
-       tex[3][1] = srcY1;
-       /* transform coords to rotated screen coords */
-       for (j = 0; j < 4; j++) {
-          matrix23TransformCoordf(&screen->rotMatrix,
-                                  &verts[j][0], &verts[j][1]);
-       }
-       /* draw polygon to map source image to dest region */
-       intel_meta_draw_poly(intel, 4, verts, 0, 0, tex);
-    }                            /* cliprect loop */
-    intel->vtbl.leave_meta_state(intel);
-    intel_batchbuffer_flush(intel->batch);
-    /* restore original drawing origin and cliprects */
-    intel->drawX = xOrig;
-    intel->drawY = yOrig;
-    intel->numClipRects = origNumClipRects;
-    intel->pClipRects = origRects;
-    UNLOCK_HARDWARE(intel);
- }
  /**
   * Called by ctx->Driver.Clear.
   */
@@@ -687,7 -506,7 +509,7 @@@ intel_wait_flips(struct intel_context *
     }
  }
  
+ #if 0
  /* Flip the front & back buffers
   */
  static GLboolean
@@@ -744,37 -563,13 +566,13 @@@ intelPageFlip(const __DRIdrawablePrivat
     intel_flip_renderbuffers(intel_fb);
     intel_draw_buffer(&intel->ctx, &intel_fb->Base);
  
+    if (INTEL_DEBUG & DEBUG_IOCTL)
+       fprintf(stderr, "%s: success\n", __FUNCTION__);
     return GL_TRUE;
  }
+ #endif
  
- #if 0
- void
- intelSwapBuffers(__DRIdrawablePrivate * dPriv)
- {
-    if (dPriv->driverPrivate) {
-       const struct gl_framebuffer *fb
-          = (struct gl_framebuffer *) dPriv->driverPrivate;
-       if (fb->Visual.doubleBufferMode) {
-          GET_CURRENT_CONTEXT(ctx);
-          if (ctx && ctx->DrawBuffer == fb) {
-             _mesa_notifySwapBuffers(ctx);       /* flush pending rendering */
-          }
-          if (intel->doPageFlip) {
-             intelPageFlip(dPriv);
-          }
-          else {
-             intelCopyBuffer(dPriv);
-          }
-       }
-    }
-    else {
-       _mesa_problem(NULL,
-                     "dPriv has no gl_framebuffer pointer in intelSwapBuffers");
-    }
- }
- #else
- /* Trunk version:
-  */
  
  static GLboolean
  intelScheduleSwap(const __DRIdrawablePrivate * dPriv, GLboolean *missed_target)
     drm_i915_vblank_swap_t swap;
     GLboolean ret;
  
 -   if ((intel_fb->vblank_flags & VBLANK_FLAG_NO_IRQ) ||
 -        intelScreen->drmMinor < (intel_fb->pf_active ? 9 : 6))
 +   if (!intel_fb->vblank_flags ||
 +       (intel_fb->vblank_flags & VBLANK_FLAG_NO_IRQ) ||
-        intelScreen->current_rotation != 0 ||
 +       intelScreen->drmMinor < (intel_fb->pf_active ? 9 : 6))
        return GL_FALSE;
  
     swap.seqtype = DRM_VBLANK_ABSOLUTE;
  
     return ret;
  }
-   
  void
  intelSwapBuffers(__DRIdrawablePrivate * dPriv)
  {
        intel = intel_context(ctx);
  
        if (ctx->Visual.doubleBufferMode) {
-          intelScreenPrivate *screen = intel->intelScreen;
         GLboolean missed_target;
         struct intel_framebuffer *intel_fb = dPriv->driverPrivate;
         int64_t ust;
  
         _mesa_notifySwapBuffers(ctx);  /* flush pending rendering comands */
  
-          if (screen->current_rotation != 0 ||
-            !intelScheduleSwap(dPriv, &missed_target)) {
+          if (!intelScheduleSwap(dPriv, &missed_target)) {
            driWaitForVBlank(dPriv, &intel_fb->vbl_seq, intel_fb->vblank_flags,
                             &missed_target);
  
-           if (screen->current_rotation != 0 || !intelPageFlip(dPriv)) {
-              intelCopyBuffer(dPriv, NULL);
-           }
-           if (screen->current_rotation != 0) {
-              intelRotateWindow(intel, dPriv, BUFFER_BIT_FRONT_LEFT);
-           }
+             intelCopyBuffer(dPriv, NULL);
         }
  
         intel_fb->swap_count++;
        fprintf(stderr, "%s: drawable has no context!\n", __FUNCTION__);
     }
  }
- #endif
  
  void
  intelCopySubBuffer(__DRIdrawablePrivate * dPriv, int x, int y, int w, int h)
  
        if (ctx->Visual.doubleBufferMode) {
           drm_clip_rect_t rect;
- #if 1
-          rect.x1 = x + dPriv->x;
-          rect.y1 = (dPriv->h - y - h) + dPriv->y;
-          rect.x2 = rect.x1 + w;
-          rect.y2 = rect.y1 + h;
- #else
+        /* fixup cliprect (driDrawable may have changed?) later */
           rect.x1 = x;
-          rect.y1 = dPriv->h - y;
-          rect.x2 = rect.x1 + w;
-          rect.y2 = rect.y1 + h;
- #endif
+          rect.y1 = y;
+          rect.x2 = w;
+          rect.y2 = h;
           _mesa_notifySwapBuffers(ctx);  /* flush pending rendering comands */
           intelCopyBuffer(dPriv, &rect);
        }
@@@ -952,7 -730,6 +734,6 @@@ intel_draw_buffer(GLcontext * ctx, stru
     struct intel_context *intel = intel_context(ctx);
     struct intel_region *colorRegion, *depthRegion = NULL;
     struct intel_renderbuffer *irbDepth = NULL, *irbStencil = NULL;
-    int front = 0;               /* drawing to front color buffer? */
  
     if (!fb) {
        /* this can happen during the initial context initialization */
        /* writing to 0 or 2 or 4 color buffers */
        /*_mesa_debug(ctx, "Software rendering\n");*/
        FALLBACK(intel, INTEL_FALLBACK_DRAW_BUFFER, GL_TRUE);
-       front = 1;                /* might not have back color buffer */
     }
     else {
        /* draw to exactly one color buffer */
        /*_mesa_debug(ctx, "Hardware rendering\n");*/
        FALLBACK(intel, INTEL_FALLBACK_DRAW_BUFFER, GL_FALSE);
-       if (fb->_ColorDrawBufferMask[0] == BUFFER_BIT_FRONT_LEFT) {
-          front = 1;
-       }
     }
  
     /*
      * Get the intel_renderbuffer for the colorbuffer we're drawing into.
      * And set up cliprects.
      */
-    if (fb->Name == 0) {
-       intelSetPrivbufClipRects(intel);
-       /* drawing to window system buffer */
-       if (front) {
-          colorRegion = intel_get_rb_region(fb, BUFFER_FRONT_LEFT);
-       }
-       else {
-          colorRegion = intel_get_rb_region(fb, BUFFER_BACK_LEFT);
-       }
-    }
-    else {
-       /* drawing to user-created FBO */
+    {
        struct intel_renderbuffer *irb;
        intelSetRenderbufferClipRects(intel);
        irb = intel_renderbuffer(fb->_ColorDrawBuffers[0][0]);
     /**
      ** Release old regions, reference new regions
      **/
- #if 0                           /* XXX FBO: this seems to be redundant with i915_state_draw_region() */
-    if (intel->draw_region != colorRegion) {
-       intel_region_release(&intel->draw_region);
-       intel_region_reference(&intel->draw_region, colorRegion);
-    }
-    if (intel->intelScreen->depth_region != depthRegion) {
-       intel_region_release(&intel->intelScreen->depth_region);
-       intel_region_reference(&intel->intelScreen->depth_region, depthRegion);
-    }
- #endif
  
     intel->vtbl.set_draw_region(intel, colorRegion, depthRegion);
  
index 61842da29d9827adc3a36804eef8bd0f6d821833,f032c97dfbb02382c4fcb27e666f20066492055c..5ab919ecb60605f3409c56d33b2ff2ba4a3f34a9
  #include "intel_buffer_objects.h"
  #include "intel_fbo.h"
  
 +#include "pipe/softpipe/sp_context.h"
 +#include "state_tracker/st_public.h"
 +
 +
  #include "drirenderbuffer.h"
  #include "vblank.h"
  #include "utils.h"
@@@ -196,6 -192,7 +196,7 @@@ const struct dri_extension card_extensi
  #if 1                           /* XXX FBO temporary? */
     {"GL_EXT_packed_depth_stencil", NULL},
  #endif
+    {"GL_EXT_pixel_buffer_object", NULL},
     {"GL_EXT_secondary_color", GL_EXT_secondary_color_functions},
     {"GL_EXT_stencil_wrap", NULL},
     {"GL_EXT_texture_edge_clamp", NULL},
@@@ -260,9 -257,6 +261,9 @@@ intelInvalidateState(GLcontext * ctx, G
     _vbo_InvalidateState(ctx, new_state);
     _tnl_InvalidateState(ctx, new_state);
     _tnl_invalidate_vertex_state(ctx, new_state);
 +
 +   st_invalidate_state( ctx, new_state );
 +
     intel_context(ctx)->NewGLState |= new_state;
  }
  
@@@ -295,16 -289,14 +296,14 @@@ static voi
  intelCheckFrontUpdate(GLcontext * ctx)
  {
     struct intel_context *intel = intel_context(ctx);
+    /* rely on _ColorDrawBufferMask being kept up to date by mesa
+       even for window-fbos. */
+    /* not sure. Might need that for all masks including
+       BUFFER_BIT_FRONT_LEFT maybe? */
     if (intel->ctx.DrawBuffer->_ColorDrawBufferMask[0] ==
         BUFFER_BIT_FRONT_LEFT) {
-       intelScreenPrivate *screen = intel->intelScreen;
        __DRIdrawablePrivate *dPriv = intel->driDrawable;
-       if (screen->current_rotation != 0) {
-          intelRotateWindow(intel, dPriv, BUFFER_BIT_FRONT_LEFT);
-       }
-       else {
-          intelCopyBuffer(dPriv, NULL);
-       }
+       intelCopyBuffer(dPriv, NULL);
     }
  }
  
@@@ -377,7 -369,7 +376,7 @@@ intelInitContext(struct intel_context *
  
     if (!havePools)
        return GL_FALSE;
-      
     if (!_mesa_initialize_context(&intel->ctx,
                                   mesaVis, shareCtx,
                                   functions, (void *) intel))
     intel->driScreen = sPriv;
     intel->sarea = saPriv;
  
-    intel->width = intelScreen->width;
-    intel->height = intelScreen->height;
-    intel->current_rotation = intelScreen->current_rotation;
     if (!lockMutexInit) {
        lockMutexInit = GL_TRUE;
        _glthread_INIT_MUTEX(lockMutex);
        FALLBACK(intel, INTEL_FALLBACK_USER, 1);
     }
  
 +
 +   st_create_context( &intel->ctx,
 +                    softpipe_create() );
 +   
 +
     return GL_TRUE;
  }
  
@@@ -576,6 -559,11 +571,11 @@@ intelDestroyContext(__DRIcontextPrivat
  GLboolean
  intelUnbindContext(__DRIcontextPrivate * driContextPriv)
  {
+    struct intel_context *intel = (struct intel_context *) driContextPriv->driverPrivate;
+    /* XXX UnbindContext is called AFTER the new context is made current.
+       Hopefully shouldn't be a problem ? */
+    FLUSH_VERTICES((&intel->ctx), 0);
+    intelFlush(&intel->ctx);
     return GL_TRUE;
  }
  
@@@ -603,72 -591,36 +603,47 @@@ intelMakeCurrent(__DRIcontextPrivate * 
           is done. Need a per-screen context? */
        intel->intelScreen->dummyctxptr = intel;
  
-       /* XXX FBO temporary fix-ups! */
-       /* if the renderbuffers don't have regions, init them from the context */
-       {
-          struct intel_renderbuffer *irbDepth
-             = intel_get_renderbuffer(&intel_fb->Base, BUFFER_DEPTH);
-          struct intel_renderbuffer *irbStencil
-             = intel_get_renderbuffer(&intel_fb->Base, BUFFER_STENCIL);
-          if (intel_fb->color_rb[0] && !intel_fb->color_rb[0]->region) {
-             intel_region_reference(&intel_fb->color_rb[0]->region,
-                                  intel->intelScreen->front_region);
-          }
-          if (intel_fb->color_rb[1] && !intel_fb->color_rb[1]->region) {
-             intel_region_reference(&intel_fb->color_rb[1]->region,
-                                  intel->intelScreen->back_region);
-          }
-          if (intel_fb->color_rb[2] && !intel_fb->color_rb[2]->region) {
-             intel_region_reference(&intel_fb->color_rb[2]->region,
-                                  intel->intelScreen->third_region);
-          }
-          if (irbDepth && !irbDepth->region) {
-             intel_region_reference(&irbDepth->region, intel->intelScreen->depth_region);
-          }
-          if (irbStencil && !irbStencil->region) {
-             intel_region_reference(&irbStencil->region, intel->intelScreen->depth_region);
-          }
-       }
-       /* set GLframebuffer size to match window, if needed */
+       /* update GLframebuffer size to match window if needed */
        driUpdateFramebufferSize(&intel->ctx, driDrawPriv);
  
        if (driReadPriv != driDrawPriv) {
-        driUpdateFramebufferSize(&intel->ctx, driReadPriv);
+          driUpdateFramebufferSize(&intel->ctx, driReadPriv);
        }
  
        _mesa_make_current(&intel->ctx, &intel_fb->Base, readFb);
-       intel->intelScreen->dummyctxptr = &intel->ctx;
  
        /* The drawbuffer won't always be updated by _mesa_make_current: 
         */
        if (intel->ctx.DrawBuffer == &intel_fb->Base) {
  
         if (intel->driDrawable != driDrawPriv) {
 -          intel_fb->vblank_flags = (intel->intelScreen->irq_active != 0)
 -             ? driGetDefaultVBlankFlags(&intel->optionCache)
 -             : VBLANK_FLAG_NO_IRQ;
 -          (*dri_interface->getUST) (&intel_fb->swap_ust);
 -          driDrawableInitVBlank(driDrawPriv, intel_fb->vblank_flags,
 -                                &intel_fb->vbl_seq);
 +          if (driDrawPriv->pdraw->swap_interval == (unsigned)-1) {
 +             int i;
 +
 +             intel_fb->vblank_flags = (intel->intelScreen->irq_active != 0)
 +                ? driGetDefaultVBlankFlags(&intel->optionCache)
 +               : VBLANK_FLAG_NO_IRQ;
 +
 +             (*dri_interface->getUST) (&intel_fb->swap_ust);
 +             driDrawableInitVBlank(driDrawPriv, intel_fb->vblank_flags,
 +                                   &intel_fb->vbl_seq);
 +             intel_fb->vbl_waited = intel_fb->vbl_seq;
 +
-              for (i = 0; i < (intel->intelScreen->third.handle ? 3 : 2); i++) {
++             for (i = 0; i < 2; i++) {
 +                if (intel_fb->color_rb[i])
 +                   intel_fb->color_rb[i]->vbl_pending = intel_fb->vbl_seq;
 +             }
 +          }
-           intel->driDrawable = driDrawPriv;
-           intelWindowMoved(intel);
         }
+       }
  
-        intel_draw_buffer(&intel->ctx, &intel_fb->Base);
+       if ((intel->driDrawable != driDrawPriv) ||
+         (intel->lastStamp != driDrawPriv->lastStamp)) {
+           intel->driDrawable = driDrawPriv;
+           intelWindowMoved(intel);
+           intel->lastStamp = driDrawPriv->lastStamp;
        }
     }
     else {
        _mesa_make_current(NULL, NULL, NULL);
@@@ -696,12 -648,10 +671,10 @@@ intelContendedLock(struct intel_contex
      * checking must be done *after* this call:
      */
     if (dPriv)
-       intel->revalidateDrawable = GL_TRUE;
- //      DRI_VALIDATE_DRAWABLE_INFO(sPriv, dPriv);
+       DRI_VALIDATE_DRAWABLE_INFO(sPriv, dPriv);
  
     if (sarea->width != intelScreen->width ||
-        sarea->height != intelScreen->height ||
-        sarea->rotation != intelScreen->current_rotation) {
+        sarea->height != intelScreen->height) {
  
        intelUpdateScreenRotation(sPriv, sarea);
     }
     if (sarea->width != intel->width ||
         sarea->height != intel->height ||
         sarea->rotation != intel->current_rotation) {
 -      
 -      void *batchMap = intel->batch->map;
 -      
 +      int numClipRects = intel->numClipRects;
 +
        /*
         * FIXME: Really only need to do this when drawing to a
         * common back- or front buffer.
         */
  
        /*
 -       * This will drop the outstanding batchbuffer on the floor
 +       * This will essentially drop the outstanding batchbuffer on the floor.
         */
 +      intel->numClipRects = 0;
  
 -      if (batchMap != NULL) {
 -       driBOUnmap(intel->batch->buffer);
 -       intel->batch->map = NULL;
 -      }
 -
 -      intel_batchbuffer_reset(intel->batch);
 +      if (intel->Fallback)
 +       _swrast_flush(&intel->ctx);
  
 -      if (batchMap == NULL) {
 -       driBOUnmap(intel->batch->buffer);
 -       intel->batch->map = NULL;
 -      }
 +      INTEL_FIREVERTICES(intel);
  
 -      /* lose all primitives */
 -      intel->prim.primitive = ~0;
 -      intel->prim.start_ptr = 0;
 -      intel->prim.flush = 0;
 +      if (intel->batch->map != intel->batch->ptr)
 +       intel_batchbuffer_flush(intel->batch);
  
 -      /* re-emit all state */
 -      intel->vtbl.lost_hardware(intel);
 +      intel->numClipRects = numClipRects;
  
        /* force window update */
        intel->lastStamp = 0;
  }
  
  
- /* Lock the hardware and validate our state.  
+ /* Lock the hardware and validate our state.
   */
  void LOCK_HARDWARE( struct intel_context *intel )
  {
                                    BUFFER_BACK_LEFT);
      }
  
 -    if (intel_rb && (intel_fb->vbl_waited - intel_rb->vbl_pending) > (1<<23)) {
 +    if (intel_rb && intel_fb->vblank_flags &&
 +      !(intel_fb->vblank_flags & VBLANK_FLAG_NO_IRQ) &&
 +      (intel_fb->vbl_waited - intel_rb->vbl_pending) > (1<<23)) {
        drmVBlank vbl;
  
        vbl.request.type = DRM_VBLANK_ABSOLUTE;
index 5a93eb7ad1987a10739d3ac539b395314cfb5efa,04ca5ae8ba0da25c5725e82d94964f31035065f2..559788f20a9b3f053b716e90f4b86e8ced0bdd80
@@@ -146,6 -146,8 +146,8 @@@ intel_delete_renderbuffer(struct gl_ren
  
     ASSERT(irb);
  
+    DBG("freeing renderbuffer\n");
     if (irb->PairedStencil || irb->PairedDepth) {
        intel_unpair_depth_stencil(ctx, irb);
     }
@@@ -289,12 -291,6 +291,12 @@@ intel_alloc_renderbuffer_storage(GLcont
        rb->Width = width;
        rb->Height = height;
  
 +#if 1
 +      /* update the surface's size too */
 +      rb->surface->width = width;
 +      rb->surface->height = height;
 +#endif
 +
        /* This sets the Get/PutRow/Value functions */
        intel_set_span_functions(&irb->Base);
  
  }
  
  
- /**
-  * Called for each hardware renderbuffer when a _window_ is resized.
-  * Just update fields.
-  * Not used for user-created renderbuffers!
-  */
- static GLboolean
- intel_alloc_window_storage(GLcontext * ctx, struct gl_renderbuffer *rb,
-                            GLenum internalFormat, GLuint width, GLuint height)
- {
-    ASSERT(rb->Name == 0);
-    rb->Width = width;
-    rb->Height = height;
-    rb->_ActualFormat = internalFormat;
-    return GL_TRUE;
- }
  static void
  intel_resize_buffers(GLcontext *ctx, struct gl_framebuffer *fb,
                     GLuint width, GLuint height)
@@@ -357,137 -335,43 +341,48 @@@ intel_nop_alloc_storage(GLcontext * ctx
  
  
  
- /**
-  * Create a new intel_renderbuffer which corresponds to an on-screen window,
-  * not a user-created renderbuffer.
-  * \param width  the screen width
-  * \param height  the screen height
-  */
  struct intel_renderbuffer *
- intel_create_renderbuffer(GLenum intFormat, GLsizei width, GLsizei height,
-                           int offset, int pitch, int cpp, void *map)
+ intel_new_renderbuffer_fb(GLuint intFormat)
  {
-    GET_CURRENT_CONTEXT(ctx);
     struct intel_renderbuffer *irb;
-    const GLuint name = 0;
  
     irb = CALLOC_STRUCT(intel_renderbuffer);
     if (!irb) {
-       _mesa_error(ctx, GL_OUT_OF_MEMORY, "creating renderbuffer");
+       _mesa_error(NULL, GL_OUT_OF_MEMORY, "creating renderbuffer");
        return NULL;
     }
  
-    _mesa_init_renderbuffer(&irb->Base, name);
+    _mesa_init_renderbuffer(&irb->Base, 0);
     irb->Base.ClassID = INTEL_RB_CLASS;
+    irb->Base.InternalFormat = intFormat;
  
     switch (intFormat) {
     case GL_RGB5:
-       irb->Base._ActualFormat = GL_RGB5;
-       irb->Base._BaseFormat = GL_RGBA;
-       irb->Base.RedBits = 5;
-       irb->Base.GreenBits = 6;
-       irb->Base.BlueBits = 5;
-       irb->Base.DataType = GL_UNSIGNED_BYTE;
-       cpp = 2;
-       break;
     case GL_RGBA8:
-       irb->Base._ActualFormat = GL_RGBA8;
        irb->Base._BaseFormat = GL_RGBA;
-       irb->Base.RedBits = 8;
-       irb->Base.GreenBits = 8;
-       irb->Base.BlueBits = 8;
-       irb->Base.AlphaBits = 8;
-       irb->Base.DataType = GL_UNSIGNED_BYTE;
-       cpp = 4;
-       break;
-    case GL_STENCIL_INDEX8_EXT:
-       irb->Base._ActualFormat = GL_STENCIL_INDEX8_EXT;
-       irb->Base._BaseFormat = GL_STENCIL_INDEX;
-       irb->Base.StencilBits = 8;
-       irb->Base.DataType = GL_UNSIGNED_BYTE;
-       cpp = 1;
        break;
     case GL_DEPTH_COMPONENT16:
-       irb->Base._ActualFormat = GL_DEPTH_COMPONENT16;
        irb->Base._BaseFormat = GL_DEPTH_COMPONENT;
-       irb->Base.DepthBits = 16;
-       irb->Base.DataType = GL_UNSIGNED_SHORT;
-       cpp = 2;
-       break;
-    case GL_DEPTH_COMPONENT24:
-       irb->Base._ActualFormat = GL_DEPTH24_STENCIL8_EXT;
-       irb->Base._BaseFormat = GL_DEPTH_COMPONENT;
-       irb->Base.DepthBits = 24;
-       irb->Base.DataType = GL_UNSIGNED_INT;
-       cpp = 4;
        break;
     case GL_DEPTH24_STENCIL8_EXT:
-       irb->Base._ActualFormat = GL_DEPTH24_STENCIL8_EXT;
        irb->Base._BaseFormat = GL_DEPTH_STENCIL_EXT;
-       irb->Base.DepthBits = 24;
-       irb->Base.StencilBits = 8;
-       irb->Base.DataType = GL_UNSIGNED_INT_24_8_EXT;
-       cpp = 4;
        break;
     default:
 -      assert(0);
 +      _mesa_problem(NULL,
-                     "Unexpected intFormat in intel_create_renderbuffer");
++                  "Unexpected intFormat in intel_create_renderbuffer");
 +      return NULL;
     }
  
-    irb->Base.InternalFormat = intFormat;
-    /* intel-specific methods */
-    irb->Base.Delete = intel_delete_renderbuffer;
-    irb->Base.AllocStorage = intel_alloc_window_storage;
-    irb->Base.GetPointer = intel_get_pointer;
-    /* This sets the Get/PutRow/Value functions */
-    intel_set_span_functions(&irb->Base);
-    irb->pfMap = map;
-    irb->pfPitch = pitch / cpp;        /* in pixels */
- #if 00
-    irb->region = intel_region_create_static(intel,
-                                             DRM_MM_TT,
-                                             offset, map, cpp, width, height);
- #endif
-    return irb;
- }
- /**
-  * Create a new renderbuffer which corresponds to an X window buffer
-  * (color, depth, stencil, etc) - not a user-created GL renderbuffer.
-  * The internal format is set at creation time and does not change.
-  */
- struct gl_renderbuffer *
- intel_new_renderbuffer_fb(GLcontext * ctx, GLuint intFormat)
- {
-    struct intel_renderbuffer *irb;
-    irb = CALLOC_STRUCT(intel_renderbuffer);
-    if (!irb) {
-       _mesa_error(ctx, GL_OUT_OF_MEMORY, "creating renderbuffer");
-       return NULL;
-    }
-    _mesa_init_renderbuffer(&irb->Base, 0);
-    irb->Base.ClassID = INTEL_RB_CLASS;
-    irb->Base.InternalFormat = intFormat;
     /* intel-specific methods */
     irb->Base.Delete = intel_delete_renderbuffer;
     irb->Base.AllocStorage = intel_alloc_renderbuffer_storage;
     irb->Base.GetPointer = intel_get_pointer;
     /* span routines set in alloc_storage function */
  
 -   return irb;
 +   irb->Base.surface = intel_new_surface(intFormat);
 +   irb->Base.surface->rb = irb;
 +
 +   return &irb->Base;
  }
  
  /**
@@@ -515,9 -399,6 +410,9 @@@ intel_new_renderbuffer(GLcontext * ctx
     irb->Base.GetPointer = intel_get_pointer;
     /* span routines set in alloc_storage function */
  
 +   irb->Base.surface = intel_new_surface(0 /*unknown format*/);
 +   irb->Base.surface->rb = irb;
 +
     return &irb->Base;
  }
  
index 86c810608451e23258ecc13266fe3df7af2bd9fc,762aac594e8acdbb7f7490459e42c7273f0c6801..7dc39675337701701ca490227bf8bbaf9f99fe21
  #define INTEL_FBO_H
  
  
 +#include "pipe/p_state.h"
 +#include "pipe/softpipe/sp_surface.h"
 +
 +
  struct intel_context;
  struct intel_region;
  
 +
  /**
   * Intel framebuffer, derived from gl_framebuffer.
   */
@@@ -87,11 -82,9 +87,11 @@@ struct intel_renderbuffe
     GLuint pf_pending;  /**< sequence number of pending flip */
  
     GLuint vbl_pending;   /**< vblank sequence number of pending flip */
 +
 +   struct intel_surface *surface;
  };
  
+ #if 0
  extern struct intel_renderbuffer *intel_create_renderbuffer(GLenum intFormat,
                                                              GLsizei width,
                                                              GLsizei height,
@@@ -99,7 -92,9 +99,9 @@@
                                                              int pitch,
                                                              int cpp,
                                                              void *map);
+ #endif
  
+ extern struct intel_renderbuffer *intel_new_renderbuffer_fb(GLuint intFormat);
  
  extern void intel_fbo_init(struct intel_context *intel);
  
@@@ -118,8 -113,5 +120,8 @@@ extern struct intel_region *intel_get_r
  
  
  
 +extern struct pipe_surface *
 +intel_new_surface(GLuint intFormat);
 +
  
  #endif /* INTEL_FBO_H */