[Mesa-dev] [PATCH 6/7] i915: Fail without crashing if a Mesa IR program uses too many registers

Eric Anholt eric at anholt.net
Mon Aug 1 11:39:47 PDT 2011


On Mon,  1 Aug 2011 10:20:22 -0700, "Ian Romanick" <idr at freedesktop.org> wrote:
> From: Ian Romanick <ian.d.romanick at 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 at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 197 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20110801/c7d672d2/attachment.pgp>


More information about the mesa-dev mailing list