mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-16 14:08:07 +02:00
i915: Fail without crashing if a Mesa IR program uses too many registers
This can only happen in GLSL shaders because assembly shaders that use
too many temps are rejected by core Mesa. It is easiest to make this
happen with shaders that contain flow-control that could not be lowered.
Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Eric Anholt <eric@anholt.net>
(cherry picked from commit 3bb2f0dde1)
This commit is contained in:
parent
f2d166583d
commit
13a2d4a985
1 changed files with 13 additions and 2 deletions
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue