diff options
Diffstat (limited to 'src/mesa/shader')
-rw-r--r-- | src/mesa/shader/prog_instruction.h | 16 | ||||
-rw-r--r-- | src/mesa/shader/program.c | 9 |
2 files changed, 21 insertions, 4 deletions
diff --git a/src/mesa/shader/prog_instruction.h b/src/mesa/shader/prog_instruction.h index c649b3db5ee..48e7b04c98c 100644 --- a/src/mesa/shader/prog_instruction.h +++ b/src/mesa/shader/prog_instruction.h @@ -240,12 +240,21 @@ typedef enum prog_opcode { /** + * Number of bits for the src/dst register Index field. + * This limits the size of temp/uniform register files. + */ +#define INST_INDEX_BITS 10 + + +/** * Instruction source register. */ struct prog_src_register { GLuint File:4; /**< One of the PROGRAM_* register file values. */ - GLint Index:9; /**< May be negative for relative addressing. */ + GLint Index:(INST_INDEX_BITS+1); /**< Extra bit here for sign bit. + * May be negative for relative addressing. + */ GLuint Swizzle:12; GLuint RelAddr:1; @@ -289,7 +298,7 @@ struct prog_src_register struct prog_dst_register { GLuint File:4; /**< One of the PROGRAM_* register file values */ - GLuint Index:8; + GLuint Index:INST_INDEX_BITS; /**< Unsigned, never negative */ GLuint WriteMask:4; GLuint RelAddr:1; @@ -322,8 +331,7 @@ struct prog_dst_register */ GLuint CondSrc:1; /*@}*/ - - GLuint pad:30; + GLuint pad:28; }; diff --git a/src/mesa/shader/program.c b/src/mesa/shader/program.c index 7a3b827352a..00655f0288a 100644 --- a/src/mesa/shader/program.c +++ b/src/mesa/shader/program.c @@ -53,6 +53,15 @@ _mesa_init_program(GLcontext *ctx) { GLuint i; + /* + * If this assertion fails, we need to increase the field + * size for register indexes. + */ + ASSERT(ctx->Const.VertexProgram.MaxUniformComponents / 4 + <= (1 << INST_INDEX_BITS)); + ASSERT(ctx->Const.FragmentProgram.MaxUniformComponents / 4 + <= (1 << INST_INDEX_BITS)); + ctx->Program.ErrorPos = -1; ctx->Program.ErrorString = _mesa_strdup(""); |