[Mesa-dev] [PATCH] glsl: be more strict when validating shader inputs
Ilia Mirkin
imirkin at alum.mit.edu
Fri May 13 04:42:35 UTC 2016
On Fri, May 13, 2016 at 12:41 AM, Jason Ekstrand <jason at jlekstrand.net> wrote:
>
> On May 12, 2016 9:29 PM, "Ilia Mirkin" <imirkin at alum.mit.edu> wrote:
>>
>> interpolateAt* can only take input variables or an element of an input
>> variable array. No structs.
>>
>> Further, GLSL 4.50 relaxes the requirement to allow swizzles, so enable
>> that as well.
>>
>> This fixes the following dEQP tests:
>>
>>
>> dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_sample.negative.interpolate_struct_member
>>
>> dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_centroid.negative.interpolate_struct_member
>>
>> dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_offset.negative.interpolate_struct_member
>>
>> Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
>> ---
>> src/compiler/glsl/ast_function.cpp | 26 ++++++++++++++++++--------
>> 1 file changed, 18 insertions(+), 8 deletions(-)
>>
>> diff --git a/src/compiler/glsl/ast_function.cpp
>> b/src/compiler/glsl/ast_function.cpp
>> index 4db3dd0..281735b 100644
>> --- a/src/compiler/glsl/ast_function.cpp
>> +++ b/src/compiler/glsl/ast_function.cpp
>> @@ -208,17 +208,27 @@ verify_parameter_modes(_mesa_glsl_parse_state
>> *state,
>>
>> /* 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;
>> + const ir_rvalue *val = actual;
>> +
>> + // GLSL 4.50 allows swizzles, while earlier GLSL versions do
>> not.
>> + if (val->ir_type == ir_type_swizzle) {
>> + if (!state->is_version(450, 0)) {
>
> What about GLSL 4.60? Not that it exists yet but this doesn't look like a
> greater-equal.
state->is_version == at least version X (in this case, at least
desktop glsl version 450). So 460 should follow the same rules. (The
second argument is for ES... 0 means "never").
>
>> + _mesa_glsl_error(&loc, state,
>> + "parameter `%s` must not be swizzled",
>> + formal->name);
>> + return false;
>> + }
>> + val = ((ir_swizzle *)val)->val;
>> + }
>> +
>> + while (val->ir_type == ir_type_dereference_array) {
>> + val = ((ir_dereference_array *)val)->array;
>
> What about arrays of arrays?
That's why it's a while loop.
>
>> }
>>
>> - if (actual->ir_type == ir_type_swizzle) {
>> + if (!val->as_dereference_variable() ||
>> + val->variable_referenced()->data.mode != ir_var_shader_in) {
>> _mesa_glsl_error(&loc, state,
>> - "parameter `%s` must not be swizzled",
>> + "parameter `%s` must be a shader input",
>> formal->name);
>> return false;
>> }
>> --
>> 2.7.3
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list