Commit c735d853 authored by Eric Anholt's avatar Eric Anholt

glsl: Don't consider things with a type containing a sampler as an lvalue.

We had ad-hoc handled some common cases by flagging sampler-typed
variables as read_only, and rejected initializers of samplers.
However, people could sneak them in in all sorts of surprising ways,
like using whole-array or structure assignment.

Fixes:
glslparsertest/glsl2/sampler-01.frag
glslparsertest/glsl2/sampler-03.frag
glslparsertest/glsl2/sampler-04.frag
glslparsertest/glsl2/sampler-06.frag

Bug #27403.
parent aa2f5588
......@@ -697,6 +697,20 @@ ir_dereference_record::ir_dereference_record(ir_variable *var,
? this->record->type->field_type(field) : glsl_type::error_type;
}
bool type_contains_sampler(const glsl_type *type)
{
if (type->is_array()) {
return type_contains_sampler(type->fields.array);
} else if (type->is_record()) {
for (unsigned int i = 0; i < type->length; i++) {
if (type_contains_sampler(type->fields.structure[i].type))
return true;
}
return false;
} else {
return type->is_sampler();
}
}
bool
ir_dereference::is_lvalue()
......@@ -711,6 +725,15 @@ ir_dereference::is_lvalue()
if (this->type->is_array() && !var->array_lvalue)
return false;
/* From page 17 (page 23 of the PDF) of the GLSL 1.20 spec:
*
* "Samplers cannot be treated as l-values; hence cannot be used
* as out or inout function parameters, nor can they be
* assigned into."
*/
if (type_contains_sampler(this->type))
return false;
return true;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment