diff options
author | Chris Forbes <[email protected]> | 2013-11-10 21:19:31 +1300 |
---|---|---|
committer | Chris Forbes <[email protected]> | 2014-07-12 11:19:50 +1200 |
commit | 8b7a323596992a2a2127f40d2d4cae1e9fb0a94d (patch) | |
tree | 59d9ca571f3080b54e035a5d1c290d57a945f01a /src | |
parent | ee2a818d3306170ba18f44342aa759c2892a293f (diff) |
allow builtin functions to require parameters to be shader inputs
The new interpolateAt* builtins have strange restrictions on the
<interpolant> parameter.
- It must be a shader input, or an element of a shader input array.
- It must not include a swizzle.
V2: Don't abuse ir_var_mode_shader_in for this; make a new flag.
Signed-off-by: Chris Forbes <[email protected]>
Reviewed-by: Ilia Mirkin <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/glsl/ast_function.cpp | 18 | ||||
-rw-r--r-- | src/glsl/ir.h | 6 |
2 files changed, 24 insertions, 0 deletions
diff --git a/src/glsl/ast_function.cpp b/src/glsl/ast_function.cpp index cdb34cc6988..631b793c830 100644 --- a/src/glsl/ast_function.cpp +++ b/src/glsl/ast_function.cpp @@ -178,6 +178,24 @@ verify_parameter_modes(_mesa_glsl_parse_state *state, return false; } + /* Verify that shader_in parameters are shader inputs */ + if (formal->data.must_be_shader_input) { + ir_variable *var = actual->variable_referenced(); + if (var && var->data.mode != ir_var_shader_in) { + _mesa_glsl_error(&loc, state, + "parameter `%s` must be a shader input", + formal->name); + return false; + } + + if (actual->ir_type == ir_type_swizzle) { + _mesa_glsl_error(&loc, state, + "parameter `%s` must not be swizzled", + formal->name); + return false; + } + } + /* Verify that 'out' and 'inout' actual parameters are lvalues. */ if (formal->data.mode == ir_var_function_out || formal->data.mode == ir_var_function_inout) { diff --git a/src/glsl/ir.h b/src/glsl/ir.h index d5239d4de1b..fa93efd2de1 100644 --- a/src/glsl/ir.h +++ b/src/glsl/ir.h @@ -678,6 +678,12 @@ public: unsigned from_named_ifc_block_array:1; /** + * Non-zero if the variable must be a shader input. This is useful for + * constraints on function parameters. + */ + unsigned must_be_shader_input:1; + + /** * \brief Layout qualifier for gl_FragDepth. * * This is not equal to \c ir_depth_layout_none if and only if this |