1) Add a new flag in the sarea (coopting the unused texAge value) to
authorKeith Whitwell <keith@tungstengraphics.com>
Wed, 20 Sep 2006 14:44:40 +0000 (14:44 +0000)
committerKeith Whitwell <keith@tungstengraphics.com>
Wed, 20 Sep 2006 14:44:40 +0000 (14:44 +0000)
identify context switches between members of a share group -
ie. multiple contexts in a single application, possibly on different
threads.  In this case the contexts share a bufmgr instance and there
is no need to evict textures - so don't.

2) Use a new flag 'need_flush' to ensure hardware rendering is flushed
prior to starting a software fallback.

src/mesa/drivers/dri/i965/brw_draw.c
src/mesa/drivers/dri/i965/bufmgr.h
src/mesa/drivers/dri/i965/bufmgr_fake.c
src/mesa/drivers/dri/i965/intel_context.c
src/mesa/drivers/dri/i965/intel_span.c

index cd821b9045a32cc3b4decf3464ae5afb1da711ba..e476b18ceae1671aace1e6c94427a6d064757761 100644 (file)
@@ -328,6 +328,7 @@ static GLboolean brw_try_draw_prims( GLcontext *ctx,
         brw_emit_prim(brw, &prim[i]);   
       }
       
+      intel->need_flush = GL_TRUE;
       retval = GL_TRUE;
    }
 
index 83a810cc6dd1342ad8ac1d5d6be3412ae0fc0b34..6932522d3d30356554e84387fb25ba720c9688ba 100644 (file)
@@ -182,6 +182,8 @@ void bmUnmapBufferAUB( struct intel_context *,
 int bmValidateBuffers( struct intel_context * );
 void bmReleaseBuffers( struct intel_context * );
 
+GLuint bmCtxId( struct intel_context *intel );
+
 
 GLboolean bmError( struct intel_context * );
 void bmEvictAll( struct intel_context * );
index 8f182f3d8778f933f3f4c40608c1fa25a8a91dcb..30a235a2e53621b9a45f915981754c89e81860b1 100644 (file)
@@ -117,6 +117,7 @@ struct bufmgr {
    struct block fenced;                /* after bmFenceBuffers (mi_flush, emit irq, write dword) */
                                 /* then to pool->lru or free() */
 
+   unsigned ctxId;
    unsigned last_fence;
    unsigned free_on_hardware;
 
@@ -578,6 +579,12 @@ struct bufmgr *bm_fake_intel_Attach( struct intel_context *intel )
       make_empty_list(&bm.referenced);
       make_empty_list(&bm.fenced);
       make_empty_list(&bm.on_hardware);
+      
+      /* The context id of any of the share group.  This won't be used
+       * in communication with the kernel, so it doesn't matter if
+       * this context is eventually deleted.
+       */
+      bm.ctxId = intel->hHWContext;
    }
 
    nr_attach++;
@@ -1242,7 +1249,6 @@ void bmReleaseBuffers( struct intel_context *intel )
    LOCK(bm);
    {
       struct block *block, *tmp;
-      assert(intel->locked);
 
       foreach_s (block, tmp, &bm->referenced) {
 
@@ -1432,3 +1438,9 @@ GLboolean bmError( struct intel_context *intel )
 
    return retval;
 }
+
+
+GLuint bmCtxId( struct intel_context *intel )
+{
+   return intel->bm->ctxId;
+}
index eabb98ca231e6a8e33616a7b3f83b42be5d4e71e..47c8510ad39ecea049fe7a22a4282ba20a1e4580 100644 (file)
@@ -539,18 +539,13 @@ GLboolean intelMakeCurrent(__DRIcontextPrivate *driContextPriv,
 }
 
 
-static void lost_hardware( struct intel_context *intel )
-{
-   bm_fake_NotifyContendedLockTake( intel ); 
-   intel->vtbl.lost_hardware( intel );
-}
-
 static void intelContendedLock( struct intel_context *intel, GLuint flags )
 {
    __DRIdrawablePrivate *dPriv = intel->driDrawable;
    __DRIscreenPrivate *sPriv = intel->driScreen;
    volatile drmI830Sarea * sarea = intel->sarea;
    int me = intel->hHWContext;
+   int my_bufmgr = bmCtxId(intel);
 
    drmGetLock(intel->driFd, intel->hHWContext, flags);
 
@@ -564,12 +559,23 @@ static void intelContendedLock( struct intel_context *intel, GLuint flags )
 
 
    intel->locked = 1;
+   intel->need_flush = 1;
 
    /* Lost context?
     */
    if (sarea->ctxOwner != me) {
+      DBG("Lost Context: sarea->ctxOwner %x me %x\n", sarea->ctxOwner, me);
       sarea->ctxOwner = me;
-      lost_hardware(intel);
+      intel->vtbl.lost_hardware( intel );
+   }
+
+   /* As above, but don't evict the texture data on transitions
+    * between contexts which all share a local buffer manager.
+    */
+   if (sarea->texAge != my_bufmgr) {
+      DBG("Lost Textures: sarea->texAge %x my_bufmgr %x\n", sarea->ctxOwner, my_bufmgr);
+      sarea->texAge = my_bufmgr;
+      bm_fake_NotifyContendedLockTake( intel ); 
    }
 
    /* Drawable changed?
index c68def5a9f95fa24d4fa5996e80e8ff17668b64e..a202491101294b8b7eda450221157debc8d44844 100644 (file)
@@ -207,6 +207,16 @@ void intelSpanRenderStart( GLcontext *ctx )
 {
    struct intel_context *intel = intel_context(ctx);
 
+   if (intel->need_flush) {
+      LOCK_HARDWARE(intel);
+      intel->vtbl.emit_flush(intel, 0);
+      intel_batchbuffer_flush(intel->batch);
+      intel->need_flush = 0;
+      UNLOCK_HARDWARE(intel);
+      intelFinish(intel);
+   }
+
+
    LOCK_HARDWARE(intel);
 
    /* Just map the framebuffer and all textures.  Bufmgr code will