Potential fix for doom3 lockups. Seems that there is a conflict
authorKeith Whitwell <keith@tungstengraphics.com>
Tue, 12 Sep 2006 13:54:31 +0000 (13:54 +0000)
committerKeith Whitwell <keith@tungstengraphics.com>
Tue, 12 Sep 2006 13:54:31 +0000 (13:54 +0000)
between the vertex cache, the vertex shader and the clipping stages,
all of which are competitors for URB entries assigned to the VS unit.
This change reduces the maximum number of clip and VS threads by
enough to ensure that they cannot consume all the available URB
entries, and then reduces the number somewhat more up to an arbitary
amount I discovered by trial and error.  Unfortunately trial and error
solutions don't inspire total confidence...

src/mesa/drivers/dri/i965/brw_clip_state.c
src/mesa/drivers/dri/i965/brw_urb.c
src/mesa/drivers/dri/i965/brw_vs_state.c

index cb982850f23d26e67f155c78827cf06a962efa7a..1e6d6fa176285f88cd6efe68c907bf27dcf87ffa 100644 (file)
@@ -55,10 +55,7 @@ static void upload_clip_unit( struct brw_context *brw )
    /* BRW_NEW_URB_FENCE */
    clip.thread4.nr_urb_entries = brw->urb.nr_clip_entries; 
    clip.thread4.urb_entry_allocation_size = brw->urb.vsize - 1;
-   clip.thread4.max_threads = MIN2(brw->urb.nr_clip_entries, 16) - 1;
-
-   if (INTEL_DEBUG & DEBUG_SINGLE_THREAD)
-      clip.thread4.max_threads = 0;
+   clip.thread4.max_threads = 0; /* Hmm, maybe the max is 1 or 2 threads */
 
    if (INTEL_DEBUG & DEBUG_STATS)
       clip.thread4.stats_enable = 1; 
index 40af0bfa93d6874f51c1e22e3b9c8fccefc2282f..b4293046474bc325578a0e01631326453947131e 100644 (file)
@@ -53,7 +53,7 @@ static const struct {
    GLuint min_entry_size;
    GLuint max_entry_size;
 } limits[CS+1] = {
-   { 8, 16, 1, 5 },                    /* vs */
+   { 8, 24, 1, 5 },                    /* vs */
    { 4, 8,  1, 5 },                    /* gs */
    { 6, 12, 1, 5 },                    /* clp */
    { 1, 8,  1, 12 },                   /* sf */
index 70de0e82566f43699f9b7cee9a5e2931bea7d475..c225bf8f5c5cb4c28f5ea6f493603eda9426f608 100644 (file)
@@ -53,7 +53,11 @@ static void upload_vs_unit( struct brw_context *brw )
    /* BRW_NEW_URB_FENCE  */
    vs.thread4.nr_urb_entries = brw->urb.nr_vs_entries; 
    vs.thread4.urb_entry_allocation_size = brw->urb.vsize - 1;
-   vs.thread4.max_threads = MIN2(brw->urb.nr_vs_entries, 16) - 1;
+   vs.thread4.max_threads = MIN2(
+      MAX2(0, (brw->urb.nr_vs_entries - 6) / 2 - 1), 
+      15);
+
+
 
    if (INTEL_DEBUG & DEBUG_SINGLE_THREAD)
       vs.thread4.max_threads = 0;