diff options
-rw-r--r-- | src/glsl/ir.cpp | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/src/glsl/ir.cpp b/src/glsl/ir.cpp index e5ed10d3e42..31e40cac8c6 100644 --- a/src/glsl/ir.cpp +++ b/src/glsl/ir.cpp @@ -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; } |