mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-20 16:00:08 +01:00
Check that we don't try to reference more than one target of a texture unit.
For example, referencing both "texture[0], 2D" and "texture[0], CUBE" in one program is an error.
This commit is contained in:
parent
f6de865e56
commit
b7fc1c32f8
1 changed files with 17 additions and 1 deletions
|
|
@ -2643,6 +2643,10 @@ parse_fp_vector_src_reg(GLcontext * ctx, GLubyte ** inst,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse fragment program destination register.
|
||||||
|
* \return 1 if error, 0 if no error.
|
||||||
|
*/
|
||||||
static GLuint
|
static GLuint
|
||||||
parse_fp_dst_reg(GLcontext * ctx, GLubyte ** inst,
|
parse_fp_dst_reg(GLcontext * ctx, GLubyte ** inst,
|
||||||
struct var_cache **vc_head, struct arb_program *Program,
|
struct var_cache **vc_head, struct arb_program *Program,
|
||||||
|
|
@ -2666,6 +2670,7 @@ parse_fp_dst_reg(GLcontext * ctx, GLubyte ** inst,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parse fragment program scalar src register.
|
* Parse fragment program scalar src register.
|
||||||
|
* \return 1 if error, 0 if no error.
|
||||||
*/
|
*/
|
||||||
static GLuint
|
static GLuint
|
||||||
parse_fp_scalar_src_reg (GLcontext * ctx, GLubyte ** inst,
|
parse_fp_scalar_src_reg (GLcontext * ctx, GLubyte ** inst,
|
||||||
|
|
@ -2703,6 +2708,7 @@ parse_fp_scalar_src_reg (GLcontext * ctx, GLubyte ** inst,
|
||||||
/**
|
/**
|
||||||
* This is a big mother that handles getting opcodes into the instruction
|
* This is a big mother that handles getting opcodes into the instruction
|
||||||
* and handling the src & dst registers for fragment program instructions
|
* and handling the src & dst registers for fragment program instructions
|
||||||
|
* \return 1 if error, 0 if no error
|
||||||
*/
|
*/
|
||||||
static GLuint
|
static GLuint
|
||||||
parse_fp_instruction (GLcontext * ctx, GLubyte ** inst,
|
parse_fp_instruction (GLcontext * ctx, GLubyte ** inst,
|
||||||
|
|
@ -3051,7 +3057,14 @@ parse_fp_instruction (GLcontext * ctx, GLubyte ** inst,
|
||||||
/* TODO ARB_fragment_program_shadow code */
|
/* TODO ARB_fragment_program_shadow code */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
Program->TexturesUsed[texcoord] |= (1<<fp->TexSrcTarget);
|
Program->TexturesUsed[texcoord] |= (1 << fp->TexSrcTarget);
|
||||||
|
/* Check that both "2D" and "CUBE" (for example) aren't both used */
|
||||||
|
if (_mesa_bitcount(Program->TexturesUsed[texcoord]) > 1) {
|
||||||
|
char *msg = "multiple targets used on one texture image unit";
|
||||||
|
_mesa_set_program_error(ctx, Program->Position, msg);
|
||||||
|
_mesa_error(ctx, GL_INVALID_OPERATION, msg);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OP_TEX_KIL:
|
case OP_TEX_KIL:
|
||||||
|
|
@ -3060,6 +3073,9 @@ parse_fp_instruction (GLcontext * ctx, GLubyte ** inst,
|
||||||
return 1;
|
return 1;
|
||||||
fp->Opcode = OPCODE_KIL;
|
fp->Opcode = OPCODE_KIL;
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
_mesa_problem(ctx, "bad type 0x%x in parse_fp_instruction()", type);
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue