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.
This commit is contained in:
@@ -697,6 +697,20 @@ ir_dereference_record::ir_dereference_record(ir_variable *var,
|
|||||||
? this->record->type->field_type(field) : glsl_type::error_type;
|
? 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
|
bool
|
||||||
ir_dereference::is_lvalue()
|
ir_dereference::is_lvalue()
|
||||||
@@ -711,6 +725,15 @@ ir_dereference::is_lvalue()
|
|||||||
if (this->type->is_array() && !var->array_lvalue)
|
if (this->type->is_array() && !var->array_lvalue)
|
||||||
return false;
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user