[Mesa-dev] [PATCH v2 31/42] glsl: Allow atomic functions to be used with shared variables

Iago Toral itoral at igalia.com
Wed Nov 25 03:44:21 PST 2015


On Tue, 2015-11-17 at 21:55 -0800, Jordan Justen wrote:
> Signed-off-by: Jordan Justen <jordan.l.justen at intel.com>
> Reviewed-by: Timothy Arceri <timothy.arceri at collabora.com>

Reviewed-by: Iago Toral Quiroga <itoral at igalia.com>

> ---
>  src/glsl/ast_function.cpp | 18 ++++++++++--------
>  1 file changed, 10 insertions(+), 8 deletions(-)
> 
> diff --git a/src/glsl/ast_function.cpp b/src/glsl/ast_function.cpp
> index 466ece6..da1167a 100644
> --- a/src/glsl/ast_function.cpp
> +++ b/src/glsl/ast_function.cpp
> @@ -143,19 +143,21 @@ verify_image_parameter(YYLTYPE *loc, _mesa_glsl_parse_state *state,
>  }
>  
>  static bool
> -verify_first_atomic_ssbo_parameter(YYLTYPE *loc, _mesa_glsl_parse_state *state,
> +verify_first_atomic_parameter(YYLTYPE *loc, _mesa_glsl_parse_state *state,
>                                     ir_variable *var)
>  {
> -   if (!var || !var->is_in_shader_storage_block()) {
> +   if (!var ||
> +       (!var->is_in_shader_storage_block() &&
> +        var->data.mode != ir_var_shader_shared)) {
>        _mesa_glsl_error(loc, state, "First argument to atomic function "
> -                       "must be a buffer variable");
> +                       "must be a buffer or shared variable");
>        return false;
>     }
>     return true;
>  }
>  
>  static bool
> -is_atomic_ssbo_function(const char *func_name)
> +is_atomic_function(const char *func_name)
>  {
>     return !strcmp(func_name, "atomicAdd") ||
>            !strcmp(func_name, "atomicMin") ||
> @@ -276,16 +278,16 @@ verify_parameter_modes(_mesa_glsl_parse_state *state,
>  
>     /* The first parameter of atomic functions must be a buffer variable */
>     const char *func_name = sig->function_name();
> -   bool is_atomic_ssbo = is_atomic_ssbo_function(func_name);
> -   if (is_atomic_ssbo) {
> +   bool is_atomic = is_atomic_function(func_name);
> +   if (is_atomic) {
>        const ir_rvalue *const actual = (ir_rvalue *) actual_ir_parameters.head;
>  
>        const ast_expression *const actual_ast =
>           exec_node_data(ast_expression, actual_ast_parameters.head, link);
>        YYLTYPE loc = actual_ast->get_location();
>  
> -      if (!verify_first_atomic_ssbo_parameter(&loc, state,
> -                                              actual->variable_referenced())) {
> +      if (!verify_first_atomic_parameter(&loc, state,
> +                                         actual->variable_referenced())) {
>           return false;
>        }
>     }




More information about the mesa-dev mailing list