summaryrefslogtreecommitdiffstats
path: root/src/mesa
diff options
context:
space:
mode:
authorKeith Whitwell <keith@tungstengraphics.com>2006-09-12 13:54:31 +0000
committerKeith Whitwell <keith@tungstengraphics.com>2006-09-12 13:54:31 +0000
commit16a22a5f4a9e0497164ef0fddcb4fe9ba1f6756e (patch)
tree0a4b10bc277424345557664884c0548f03abb781 /src/mesa
parent72e810db9db663dd3ff5f746d942423d87928e86 (diff)
downloadexternal_mesa3d-16a22a5f4a9e0497164ef0fddcb4fe9ba1f6756e.zip
external_mesa3d-16a22a5f4a9e0497164ef0fddcb4fe9ba1f6756e.tar.gz
external_mesa3d-16a22a5f4a9e0497164ef0fddcb4fe9ba1f6756e.tar.bz2
Potential fix for doom3 lockups. Seems that there is a conflict
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...
Diffstat (limited to 'src/mesa')
-rw-r--r--src/mesa/drivers/dri/i965/brw_clip_state.c5
-rw-r--r--src/mesa/drivers/dri/i965/brw_urb.c2
-rw-r--r--src/mesa/drivers/dri/i965/brw_vs_state.c6
3 files changed, 7 insertions, 6 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_clip_state.c b/src/mesa/drivers/dri/i965/brw_clip_state.c
index cb98285..1e6d6fa 100644
--- a/src/mesa/drivers/dri/i965/brw_clip_state.c
+++ b/src/mesa/drivers/dri/i965/brw_clip_state.c
@@ -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;
diff --git a/src/mesa/drivers/dri/i965/brw_urb.c b/src/mesa/drivers/dri/i965/brw_urb.c
index 40af0bf..b429304 100644
--- a/src/mesa/drivers/dri/i965/brw_urb.c
+++ b/src/mesa/drivers/dri/i965/brw_urb.c
@@ -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 */
diff --git a/src/mesa/drivers/dri/i965/brw_vs_state.c b/src/mesa/drivers/dri/i965/brw_vs_state.c
index 70de0e8..c225bf8 100644
--- a/src/mesa/drivers/dri/i965/brw_vs_state.c
+++ b/src/mesa/drivers/dri/i965/brw_vs_state.c
@@ -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;