I wanted to question whether this was required, based on this text
from the extension spec:

"The ability to write to buffer objects creates the potential for
 multiple independent shader invocations to read and write the same
 underlying memory. The same issue exists with the
 ARB_shader_image_load_store extension provided in OpenGL 4.2, which
 can write to texture objects and buffers. In both cases, the
 specification makes few guarantees related to the relative order of
 memory reads and writes performed by the shader invocations."

But I'm not sure if we can reconcile CSE with 'memoryBarrier' and
'barrier'. curro, any thoughts from image load/store?

-Jordan

On 2015-06-03 00:01:13, Iago Toral Quiroga wrote:
> SSBOs are read/write and this CSE pass only handles read-only variables.
> ---
>  src/glsl/opt_cse.cpp | 33 ++++++++++++++++++++++++++++++++-
>  1 file changed, 32 insertions(+), 1 deletion(-)
> 
> diff --git a/src/glsl/opt_cse.cpp b/src/glsl/opt_cse.cpp
> index 4b8e9a0..a05ab46 100644
> --- a/src/glsl/opt_cse.cpp
> +++ b/src/glsl/opt_cse.cpp
> @@ -245,6 +245,28 @@ contains_rvalue(ir_rvalue *haystack, ir_rvalue *needle)
>  }
>  
>  static bool
> +expression_contains_ssbo_load(ir_expression *expr)
> +{
> +   if (expr->operation == ir_binop_ssbo_load)
> +      return true;
> +
> +   for (unsigned i = 0; i < expr->get_num_operands(); i++) {
> +      ir_rvalue *op = expr->operands[i];
> +      if (op->ir_type == ir_type_expression &&
> +          expression_contains_ssbo_load(op->as_expression())) {
> +         return true;
> +      } else if (op->ir_type == ir_type_swizzle) {
> +         ir_swizzle *swizzle = op->as_swizzle();
> +         ir_expression *val = swizzle->val->as_expression();
> +         if (val && expression_contains_ssbo_load(val))
> +            return true;
> +      }
> +   }
> +
> +   return false;
> +}
> +
> +static bool
>  is_cse_candidate(ir_rvalue *ir)
>  {
>     /* Our temporary variable assignment generation isn't ready to handle
> @@ -260,7 +282,16 @@ is_cse_candidate(ir_rvalue *ir)
>      * to variable-index array dereferences at some point.
>      */
>     switch (ir->ir_type) {
> -   case ir_type_expression:
> +   case ir_type_expression: {
> +         /* Skip expressions involving SSBO loads, since these operate on
> +          * read-write variables, meaning that the same ssbo_load expression
> +          * may return a different value if the underlying buffer storage
> +          * is written in between.
> +          */
> +         if (expression_contains_ssbo_load(ir->as_expression()))
> +            return false;
> +      }
> +      break;
>     case ir_type_texture:
>        break;
>     default:
> -- 
> 1.9.1
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to