On Mon, 1 Aug 2011 10:20:22 -0700, "Ian Romanick" <i...@freedesktop.org> wrote: > From: Ian Romanick <ian.d.roman...@intel.com> > > So far this can only happen in GLSL shaders that contain flow-control > that could not be lowered. These programs would have failed to run on > hardware anyway.
This looks reasonable, but I don't understand why this "can only happen" with flow control. Couldn't we just have something with too many temps involved without flow control? > --- > src/mesa/drivers/dri/i915/i915_fragprog.c | 15 +++++++++++++-- > 1 files changed, 13 insertions(+), 2 deletions(-) > > diff --git a/src/mesa/drivers/dri/i915/i915_fragprog.c > b/src/mesa/drivers/dri/i915/i915_fragprog.c > index 6e1d709..32050ce 100644 > --- a/src/mesa/drivers/dri/i915/i915_fragprog.c > +++ b/src/mesa/drivers/dri/i915/i915_fragprog.c > @@ -303,7 +303,7 @@ do { > \ > /* > * TODO: consider moving this into core > */ > -static void calc_live_regs( struct i915_fragment_program *p ) > +static bool calc_live_regs( struct i915_fragment_program *p ) > { > const struct gl_fragment_program *program = &p->FragProg; > GLuint regsUsed = 0xffff0000; > @@ -317,6 +317,9 @@ static void calc_live_regs( struct i915_fragment_program > *p ) > > /* Register is written to: unmark as live for this and preceeding > ops */ > if (inst->DstReg.File == PROGRAM_TEMPORARY) { > + if (inst->DstReg.Index > 16) > + return false; > + > live_components[inst->DstReg.Index] &= ~inst->DstReg.WriteMask; > if (live_components[inst->DstReg.Index] == 0) > regsUsed &= ~(1 << inst->DstReg.Index); > @@ -327,6 +330,9 @@ static void calc_live_regs( struct i915_fragment_program > *p ) > if (inst->SrcReg[a].File == PROGRAM_TEMPORARY) { > unsigned c; > > + if (inst->SrcReg[a].Index > 16) > + return false; > + > regsUsed |= 1 << inst->SrcReg[a].Index; > > for (c = 0; c < 4; c++) { > @@ -340,6 +346,8 @@ static void calc_live_regs( struct i915_fragment_program > *p ) > > p->usedRegs[i] = regsUsed; > } > + > + return true; > } > > static GLuint get_live_regs( struct i915_fragment_program *p, > @@ -394,7 +402,10 @@ upload_program(struct i915_fragment_program *p) > > /* Not always needed: > */ > - calc_live_regs(p); > + if (!calc_live_regs(p)) { > + i915_program_error(p, "Could not allocate registers"); > + return; > + } > > while (1) { > GLuint src0, src1, src2, flags; > -- > 1.7.4.4 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev
pgptNf837ZxkM.pgp
Description: PGP signature
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev