mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-21 22:20:14 +01:00
glsl: Don't early-out for error-type inputs
Check the type of the array operand and the index operand before doing
other checks. This simplifies the code a bit now (eliminating the
error_emitted parameter), and enables some later functional changes.
The shader
uniform float x[6];
uniform sampler2D s;
void main() { gl_Position.x = xx[s + 1]; }
still generates (only) the two expected errors:
0:3(33): error: `xx' undeclared
0:3(39): error: Operands to arithmetic operators must be numeric
Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
parent
a131b87706
commit
58d93e3247
3 changed files with 11 additions and 15 deletions
|
|
@ -858,8 +858,7 @@ extern ir_rvalue *
|
|||
_mesa_ast_array_index_to_hir(void *mem_ctx,
|
||||
struct _mesa_glsl_parse_state *state,
|
||||
ir_rvalue *array, ir_rvalue *idx,
|
||||
YYLTYPE &loc, YYLTYPE &idx_loc,
|
||||
bool error_emitted);
|
||||
YYLTYPE &loc, YYLTYPE &idx_loc);
|
||||
|
||||
void
|
||||
emit_function(_mesa_glsl_parse_state *state, ir_function *f);
|
||||
|
|
|
|||
|
|
@ -29,15 +29,12 @@ ir_rvalue *
|
|||
_mesa_ast_array_index_to_hir(void *mem_ctx,
|
||||
struct _mesa_glsl_parse_state *state,
|
||||
ir_rvalue *array, ir_rvalue *idx,
|
||||
YYLTYPE &loc, YYLTYPE &idx_loc,
|
||||
bool error_emitted)
|
||||
YYLTYPE &loc, YYLTYPE &idx_loc)
|
||||
{
|
||||
ir_rvalue *result = new(mem_ctx) ir_dereference_array(array, idx);
|
||||
|
||||
if (error_emitted)
|
||||
return result;
|
||||
|
||||
if (!array->type->is_array()
|
||||
if (!array->type->is_error()
|
||||
&& !array->type->is_array()
|
||||
&& !array->type->is_matrix()
|
||||
&& !array->type->is_vector()) {
|
||||
_mesa_glsl_error(& idx_loc, state,
|
||||
|
|
@ -46,10 +43,12 @@ _mesa_ast_array_index_to_hir(void *mem_ctx,
|
|||
result->type = glsl_type::error_type;
|
||||
}
|
||||
|
||||
if (!idx->type->is_integer()) {
|
||||
_mesa_glsl_error(& idx_loc, state, "array index must be integer type");
|
||||
} else if (!idx->type->is_scalar()) {
|
||||
_mesa_glsl_error(& idx_loc, state, "array index must be scalar");
|
||||
if (!idx->type->is_error()) {
|
||||
if (!idx->type->is_integer()) {
|
||||
_mesa_glsl_error(& idx_loc, state, "array index must be integer type");
|
||||
} else if (!idx->type->is_scalar()) {
|
||||
_mesa_glsl_error(& idx_loc, state, "array index must be scalar");
|
||||
}
|
||||
}
|
||||
|
||||
/* If the array index is a constant expression and the array has a
|
||||
|
|
|
|||
|
|
@ -1514,10 +1514,8 @@ ast_expression::hir(exec_list *instructions,
|
|||
op[0] = subexpressions[0]->hir(instructions, state);
|
||||
op[1] = subexpressions[1]->hir(instructions, state);
|
||||
|
||||
error_emitted = op[0]->type->is_error() || op[1]->type->is_error();
|
||||
|
||||
result = _mesa_ast_array_index_to_hir(ctx, state, op[0], op[1],
|
||||
loc, index_loc, error_emitted);
|
||||
loc, index_loc);
|
||||
|
||||
if (result->type->is_error())
|
||||
error_emitted = true;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue