i965: Fix up clip min_nr_entries, preferred_nr_entries, and max_threads.
authorEric Anholt <eric@anholt.net>
Mon, 3 Nov 2008 02:43:10 +0000 (18:43 -0800)
committerEric Anholt <eric@anholt.net>
Wed, 12 Nov 2008 21:07:22 +0000 (13:07 -0800)
The clip thread could potentially deadlock when processing tristrips since
being moved back to dual-thread mode, as the two threads could each have 4 VUEs
referenced and not be able to allocate another one since SF processing
wasn't able to continue (needing 5 entries before it freed 2).
In constrained URB mode, similar deadlock could even have occurred with
polygons (so we cut back max_threads if we can't handle it any primitive type).

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

index 740c7cbd1093aeda70fe88870a53da76d8e863b1..9b0d7eab7bf180bdbd54612eb427d1527186b36b 100644 (file)
@@ -88,7 +88,21 @@ clip_unit_create_from_key(struct brw_context *brw,
 
    clip.thread4.nr_urb_entries = key->nr_urb_entries;
    clip.thread4.urb_entry_allocation_size = key->urb_size - 1;
-   clip.thread4.max_threads = 1; /* 2 threads */
+   /* If we have enough clip URB entries to run two threads, do so.
+    */
+   if (key->nr_urb_entries >= 10) {
+      /* Half of the URB entries go to each thread, and it has to be an
+       * even number.
+       */
+      assert(key->nr_urb_entries % 2 == 0);
+      clip.thread4.max_threads = 2 - 1;
+   } else {
+      assert(key->nr_urb_entries >= 5);
+      clip.thread4.max_threads = 1 - 1;
+   }
+
+   if (INTEL_DEBUG & DEBUG_SINGLE_THREAD)
+      clip.thread4.max_threads = 0;
 
    if (INTEL_DEBUG & DEBUG_STATS)
       clip.thread4.stats_enable = 1;
index 5cc51ad4ec4704a252c3396c0a089b57192f44c5..7673dd36eb90b5e44e6216fbdfb081e8b4b82323 100644 (file)
@@ -91,7 +91,7 @@ static const struct {
 } limits[CS+1] = {
    { 16, 32, 1, 5 },                   /* vs */
    { 4, 8,  1, 5 },                    /* gs */
-   { 6, 8,  1, 5 },                    /* clp */
+   { 5, 10,  1, 5 },                   /* clp */
    { 1, 8,  1, 12 },                   /* sf */
    { 1, 4,  1, 32 }                    /* cs */
 };