glsl: Don't early-out for error-type inputs
authorIan Romanick <ian.d.romanick@intel.com>
Fri, 15 Mar 2013 22:23:19 +0000 (15:23 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Mon, 8 Apr 2013 22:17:05 +0000 (15:17 -0700)
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>
src/glsl/ast.h
src/glsl/ast_array_index.cpp
src/glsl/ast_to_hir.cpp

index 41254cc53bf14d97127719419ef882762e4c71f8..730027177e8912f9bb22047c844f6082980ca3b6 100644 (file)
@@ -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);
index c7ebcbdc6b7227c38898462d010a95e5230e9a30..862f64c809b7880bc1b4ee0acce2149206fd5bff 100644 (file)
@@ -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
index e9fa4a8cabfac3872ec154b0cc056b2c22970ea3..a0ec71cde7b0c9570ed17133d792c13ae57352b7 100644 (file)
@@ -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;