diff options
author | Iago Toral Quiroga <[email protected]> | 2015-04-24 11:14:17 +0200 |
---|---|---|
committer | Samuel Iglesias Gonsalvez <[email protected]> | 2015-07-14 07:04:04 +0200 |
commit | 0b1111d985714816fad20c99b4e6ea762df17b46 (patch) | |
tree | d546201d1950b1738d0573a07535c7cf0f54c374 | |
parent | 5360ff30c4de966422fde6a574e3959c81bf5037 (diff) |
glsl: Don't do constant propagation on buffer variables
Since the backing storage for these is shared we cannot ensure that
the value won't change by writes from other threads. Normally SSBO
accesses are not guaranteed to be syncronized with other threads,
except when memoryBarrier is used. So, we might be able to optimize
some SSBO accesses, but for now we always take the safe path and emit
the SSBO access.
Reviewed-by: Jordan Justen <[email protected]>
-rw-r--r-- | src/glsl/opt_constant_propagation.cpp | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/src/glsl/opt_constant_propagation.cpp b/src/glsl/opt_constant_propagation.cpp index 90cc0c89b65..10be8e800ff 100644 --- a/src/glsl/opt_constant_propagation.cpp +++ b/src/glsl/opt_constant_propagation.cpp @@ -444,6 +444,14 @@ ir_constant_propagation_visitor::add_constant(ir_assignment *ir) if (!deref->var->type->is_vector() && !deref->var->type->is_scalar()) return; + /* We can't do copy propagation on buffer variables, since the underlying + * memory storage is shared across multiple threads we can't be sure that + * the variable value isn't modified between this assignment and the next + * instruction where its value is read. + */ + if (deref->var->data.mode == ir_var_shader_storage) + return; + entry = new(this->mem_ctx) acp_entry(deref->var, ir->write_mask, constant); this->acp->push_tail(entry); } |