summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Paul <brianp@vmware.com>2009-03-06 16:00:25 -0700
committerBrian Paul <brianp@vmware.com>2009-03-06 16:21:21 -0700
commite60b3067d81319236d63ad497e70658fd2e14eb3 (patch)
tree9dd8aa6929a70915e6d30f6a3e365801335466c7
parentd42cfa6e6ea458a3eb05310d4c25acc777820fea (diff)
i965: check if we run out of GRF/temp registers
Before this change we would up emitting instructions with invalid register numbers. This typically (but not always) hung the GPU. For now, just prevent emitting bad instructions to avoid hangs. Still need to do some kind of proper error recovery.
-rw-r--r--src/mesa/drivers/dri/i965/brw_wm_glsl.c26
1 files changed, 25 insertions, 1 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_wm_glsl.c b/src/mesa/drivers/dri/i965/brw_wm_glsl.c
index bc82c0100de..ac7de6f95b5 100644
--- a/src/mesa/drivers/dri/i965/brw_wm_glsl.c
+++ b/src/mesa/drivers/dri/i965/brw_wm_glsl.c
@@ -120,8 +120,14 @@ get_reg(struct brw_wm_compile *c, int file, int index, int component,
break;
case PROGRAM_UNDEFINED:
return brw_null_reg();
- default:
+ case PROGRAM_TEMPORARY:
+ case PROGRAM_INPUT:
+ case PROGRAM_OUTPUT:
+ case PROGRAM_PAYLOAD:
break;
+ default:
+ _mesa_problem(NULL, "Unexpected file in get_reg()");
+ return brw_null_reg();
}
/* see if we've already allocated a HW register for this Mesa register */
@@ -140,6 +146,19 @@ get_reg(struct brw_wm_compile *c, int file, int index, int component,
c->reg_index++;
}
+ if (c->reg_index >= BRW_WM_MAX_GRF - 12) {
+ /* ran out of temporary registers! */
+#if 1
+ /* This is a big hack for now.
+ * Return bad register index, but don't just crash hange the GPU.
+ */
+ _mesa_fprintf(stderr, "out of regs %d\n", c->reg_index);
+ c->reg_index = BRW_WM_MAX_GRF - 13;
+#else
+ return brw_null_reg();
+#endif
+ }
+
if (neg & (1 << component)) {
reg = negate(reg);
}
@@ -2573,6 +2592,11 @@ static void brw_wm_emit_glsl(struct brw_context *brw, struct brw_wm_compile *c)
brw_set_predicate_control(p, BRW_PREDICATE_NONE);
}
post_wm_emit(c);
+
+ if (c->reg_index >= BRW_WM_MAX_GRF) {
+ _mesa_problem(NULL, "Ran out of registers in brw_wm_emit_glsl()");
+ /* XXX we need to do some proper error recovery here */
+ }
}