diff options
| author | Kenneth Graunke <kenneth@whitecape.org> | 2010-07-17 22:50:26 -0700 | 
|---|---|---|
| committer | Ian Romanick <ian.d.romanick@intel.com> | 2010-07-20 17:13:17 -0700 | 
| commit | 094cf8c199930d958d9e1139467eb8579d082df6 (patch) | |
| tree | 0c3fba1bcc3291262cdcb1860985bacf239a4354 /src | |
| parent | 1036a7ebae2da03efd1b990037b6fd102d4cc5ca (diff) | |
glsl2: Add support for the .length() method on arrays.
Fixes piglit test glsl-array-length, and provides proper error messages
for negative piglit tests array-length-110.frag, array-length-unsized.frag,
and array-length-args.frag.
Diffstat (limited to 'src')
| -rw-r--r-- | src/glsl/hir_field_selection.cpp | 22 | 
1 files changed, 22 insertions, 0 deletions
| diff --git a/src/glsl/hir_field_selection.cpp b/src/glsl/hir_field_selection.cpp index 5500e09d7e..db1e06932f 100644 --- a/src/glsl/hir_field_selection.cpp +++ b/src/glsl/hir_field_selection.cpp @@ -71,6 +71,28 @@ _mesa_ast_field_selection_to_hir(const ast_expression *expr,  			  "structure",  			  expr->primary_expression.identifier);        } +   } else if (expr->subexpressions[1] != NULL) { +      /* Handle "method calls" in GLSL 1.20 - namely, array.length() */ +      if (state->language_version < 120) +	 _mesa_glsl_error(&loc, state, "Methods not supported in GLSL 1.10."); + +      ast_expression *call = expr->subexpressions[1]; +      assert(call->oper == ast_function_call); + +      const char *method; +      method = call->subexpressions[0]->primary_expression.identifier; + +      if (op->type->is_array() && strcmp(method, "length") == 0) { +	 if (!call->expressions.is_empty()) +	    _mesa_glsl_error(&loc, state, "length method takes no arguments."); + +	 if (op->type->array_size() == 0) +	    _mesa_glsl_error(&loc, state, "length called on unsized array."); + +	 result = new(ctx) ir_constant(op->type->array_size()); +      } else { +	 _mesa_glsl_error(&loc, state, "Unknown method: `%s'.", method); +      }     } else {        _mesa_glsl_error(& loc, state, "Cannot access field `%s' of "  		       "non-structure / non-vector.", | 
