[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