[Mesa-dev] [PATCH 30/36] glsl: Replace atomic_ssbo and ssbo_atomic with atomic

Iago Toral itoral at igalia.com
Mon Nov 16 06:46:57 PST 2015


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

On Sat, 2015-11-14 at 13:44 -0800, Jordan Justen wrote:
> The atomic functions can also be used with shared variables in compute
> shaders.
> 
> When lowering the intrinsic in lower_ubo_reference, we still create an
> SSBO specific intrinsic since SSBO accesses can be indirectly
> addressed, whereas all compute shader shared variable live in a single
> shared variable area.
> 
> Signed-off-by: Jordan Justen <jordan.l.justen at intel.com>
> Cc: Samuel Iglesias Gonsalvez <siglesias at igalia.com>
> Cc: Iago Toral Quiroga <itoral at igalia.com>
> ---
>  src/glsl/builtin_functions.cpp   | 230 +++++++++++++++++++--------------------
>  src/glsl/lower_ubo_reference.cpp |  18 +--
>  src/glsl/nir/glsl_to_nir.cpp     |  16 +--
>  3 files changed, 132 insertions(+), 132 deletions(-)
> 
> diff --git a/src/glsl/builtin_functions.cpp b/src/glsl/builtin_functions.cpp
> index 1349444..3e767e8 100644
> --- a/src/glsl/builtin_functions.cpp
> +++ b/src/glsl/builtin_functions.cpp
> @@ -759,16 +759,16 @@ private:
>     ir_function_signature *_atomic_counter_op(const char *intrinsic,
>                                               builtin_available_predicate avail);
>  
> -   ir_function_signature *_atomic_ssbo_intrinsic2(builtin_available_predicate avail,
> -                                                  const glsl_type *type);
> -   ir_function_signature *_atomic_ssbo_op2(const char *intrinsic,
> -                                           builtin_available_predicate avail,
> -                                           const glsl_type *type);
> -   ir_function_signature *_atomic_ssbo_intrinsic3(builtin_available_predicate avail,
> -                                                  const glsl_type *type);
> -   ir_function_signature *_atomic_ssbo_op3(const char *intrinsic,
> -                                           builtin_available_predicate avail,
> -                                           const glsl_type *type);
> +   ir_function_signature *_atomic_intrinsic2(builtin_available_predicate avail,
> +                                             const glsl_type *type);
> +   ir_function_signature *_atomic_op2(const char *intrinsic,
> +                                      builtin_available_predicate avail,
> +                                      const glsl_type *type);
> +   ir_function_signature *_atomic_intrinsic3(builtin_available_predicate avail,
> +                                             const glsl_type *type);
> +   ir_function_signature *_atomic_op3(const char *intrinsic,
> +                                      builtin_available_predicate avail,
> +                                      const glsl_type *type);
>  
>     B1(min3)
>     B1(max3)
> @@ -915,53 +915,53 @@ builtin_builder::create_intrinsics()
>                  _atomic_counter_intrinsic(shader_atomic_counters),
>                  NULL);
>  
> -   add_function("__intrinsic_ssbo_atomic_add",
> -                _atomic_ssbo_intrinsic2(shader_storage_buffer_object,
> -                                        glsl_type::uint_type),
> -                _atomic_ssbo_intrinsic2(shader_storage_buffer_object,
> -                                        glsl_type::int_type),
> -                NULL);
> -   add_function("__intrinsic_ssbo_atomic_min",
> -                _atomic_ssbo_intrinsic2(shader_storage_buffer_object,
> -                                        glsl_type::uint_type),
> -                _atomic_ssbo_intrinsic2(shader_storage_buffer_object,
> -                                        glsl_type::int_type),
> -                NULL);
> -   add_function("__intrinsic_ssbo_atomic_max",
> -                _atomic_ssbo_intrinsic2(shader_storage_buffer_object,
> -                                        glsl_type::uint_type),
> -                _atomic_ssbo_intrinsic2(shader_storage_buffer_object,
> -                                        glsl_type::int_type),
> -                NULL);
> -   add_function("__intrinsic_ssbo_atomic_and",
> -                _atomic_ssbo_intrinsic2(shader_storage_buffer_object,
> -                                        glsl_type::uint_type),
> -                _atomic_ssbo_intrinsic2(shader_storage_buffer_object,
> -                                        glsl_type::int_type),
> -                NULL);
> -   add_function("__intrinsic_ssbo_atomic_or",
> -                _atomic_ssbo_intrinsic2(shader_storage_buffer_object,
> -                                        glsl_type::uint_type),
> -                _atomic_ssbo_intrinsic2(shader_storage_buffer_object,
> -                                        glsl_type::int_type),
> -                NULL);
> -   add_function("__intrinsic_ssbo_atomic_xor",
> -                _atomic_ssbo_intrinsic2(shader_storage_buffer_object,
> -                                        glsl_type::uint_type),
> -                _atomic_ssbo_intrinsic2(shader_storage_buffer_object,
> -                                        glsl_type::int_type),
> -                NULL);
> -   add_function("__intrinsic_ssbo_atomic_exchange",
> -                _atomic_ssbo_intrinsic2(shader_storage_buffer_object,
> -                                        glsl_type::uint_type),
> -                _atomic_ssbo_intrinsic2(shader_storage_buffer_object,
> -                                        glsl_type::int_type),
> -                NULL);
> -   add_function("__intrinsic_ssbo_atomic_comp_swap",
> -                _atomic_ssbo_intrinsic3(shader_storage_buffer_object,
> -                                        glsl_type::uint_type),
> -                _atomic_ssbo_intrinsic3(shader_storage_buffer_object,
> -                                        glsl_type::int_type),
> +   add_function("__intrinsic_atomic_add",
> +                _atomic_intrinsic2(shader_storage_buffer_object,
> +                                   glsl_type::uint_type),
> +                _atomic_intrinsic2(shader_storage_buffer_object,
> +                                   glsl_type::int_type),
> +                NULL);
> +   add_function("__intrinsic_atomic_min",
> +                _atomic_intrinsic2(shader_storage_buffer_object,
> +                                   glsl_type::uint_type),
> +                _atomic_intrinsic2(shader_storage_buffer_object,
> +                                   glsl_type::int_type),
> +                NULL);
> +   add_function("__intrinsic_atomic_max",
> +                _atomic_intrinsic2(shader_storage_buffer_object,
> +                                   glsl_type::uint_type),
> +                _atomic_intrinsic2(shader_storage_buffer_object,
> +                                   glsl_type::int_type),
> +                NULL);
> +   add_function("__intrinsic_atomic_and",
> +                _atomic_intrinsic2(shader_storage_buffer_object,
> +                                   glsl_type::uint_type),
> +                _atomic_intrinsic2(shader_storage_buffer_object,
> +                                   glsl_type::int_type),
> +                NULL);
> +   add_function("__intrinsic_atomic_or",
> +                _atomic_intrinsic2(shader_storage_buffer_object,
> +                                   glsl_type::uint_type),
> +                _atomic_intrinsic2(shader_storage_buffer_object,
> +                                   glsl_type::int_type),
> +                NULL);
> +   add_function("__intrinsic_atomic_xor",
> +                _atomic_intrinsic2(shader_storage_buffer_object,
> +                                   glsl_type::uint_type),
> +                _atomic_intrinsic2(shader_storage_buffer_object,
> +                                   glsl_type::int_type),
> +                NULL);
> +   add_function("__intrinsic_atomic_exchange",
> +                _atomic_intrinsic2(shader_storage_buffer_object,
> +                                   glsl_type::uint_type),
> +                _atomic_intrinsic2(shader_storage_buffer_object,
> +                                   glsl_type::int_type),
> +                NULL);
> +   add_function("__intrinsic_atomic_comp_swap",
> +                _atomic_intrinsic3(shader_storage_buffer_object,
> +                                   glsl_type::uint_type),
> +                _atomic_intrinsic3(shader_storage_buffer_object,
> +                                   glsl_type::int_type),
>                  NULL);
>  
>     add_image_functions(false);
> @@ -2657,68 +2657,68 @@ builtin_builder::create_builtins()
>                  NULL);
>  
>     add_function("atomicAdd",
> -                _atomic_ssbo_op2("__intrinsic_ssbo_atomic_add",
> -                                 shader_storage_buffer_object,
> -                                 glsl_type::uint_type),
> -                _atomic_ssbo_op2("__intrinsic_ssbo_atomic_add",
> -                                 shader_storage_buffer_object,
> -                                 glsl_type::int_type),
> +                _atomic_op2("__intrinsic_atomic_add",
> +                            shader_storage_buffer_object,
> +                            glsl_type::uint_type),
> +                _atomic_op2("__intrinsic_atomic_add",
> +                            shader_storage_buffer_object,
> +                            glsl_type::int_type),
>                  NULL);
>     add_function("atomicMin",
> -                _atomic_ssbo_op2("__intrinsic_ssbo_atomic_min",
> -                                 shader_storage_buffer_object,
> -                                 glsl_type::uint_type),
> -                _atomic_ssbo_op2("__intrinsic_ssbo_atomic_min",
> -                                 shader_storage_buffer_object,
> -                                 glsl_type::int_type),
> +                _atomic_op2("__intrinsic_atomic_min",
> +                            shader_storage_buffer_object,
> +                            glsl_type::uint_type),
> +                _atomic_op2("__intrinsic_atomic_min",
> +                            shader_storage_buffer_object,
> +                            glsl_type::int_type),
>                  NULL);
>     add_function("atomicMax",
> -                _atomic_ssbo_op2("__intrinsic_ssbo_atomic_max",
> -                                 shader_storage_buffer_object,
> -                                 glsl_type::uint_type),
> -                _atomic_ssbo_op2("__intrinsic_ssbo_atomic_max",
> -                                 shader_storage_buffer_object,
> -                                 glsl_type::int_type),
> +                _atomic_op2("__intrinsic_atomic_max",
> +                            shader_storage_buffer_object,
> +                            glsl_type::uint_type),
> +                _atomic_op2("__intrinsic_atomic_max",
> +                            shader_storage_buffer_object,
> +                            glsl_type::int_type),
>                  NULL);
>     add_function("atomicAnd",
> -                _atomic_ssbo_op2("__intrinsic_ssbo_atomic_and",
> -                                 shader_storage_buffer_object,
> -                                 glsl_type::uint_type),
> -                _atomic_ssbo_op2("__intrinsic_ssbo_atomic_and",
> -                                 shader_storage_buffer_object,
> -                                 glsl_type::int_type),
> +                _atomic_op2("__intrinsic_atomic_and",
> +                            shader_storage_buffer_object,
> +                            glsl_type::uint_type),
> +                _atomic_op2("__intrinsic_atomic_and",
> +                            shader_storage_buffer_object,
> +                            glsl_type::int_type),
>                  NULL);
>     add_function("atomicOr",
> -                _atomic_ssbo_op2("__intrinsic_ssbo_atomic_or",
> -                                 shader_storage_buffer_object,
> -                                 glsl_type::uint_type),
> -                _atomic_ssbo_op2("__intrinsic_ssbo_atomic_or",
> -                                 shader_storage_buffer_object,
> -                                 glsl_type::int_type),
> +                _atomic_op2("__intrinsic_atomic_or",
> +                            shader_storage_buffer_object,
> +                            glsl_type::uint_type),
> +                _atomic_op2("__intrinsic_atomic_or",
> +                            shader_storage_buffer_object,
> +                            glsl_type::int_type),
>                  NULL);
>     add_function("atomicXor",
> -                _atomic_ssbo_op2("__intrinsic_ssbo_atomic_xor",
> -                                 shader_storage_buffer_object,
> -                                 glsl_type::uint_type),
> -                _atomic_ssbo_op2("__intrinsic_ssbo_atomic_xor",
> -                                 shader_storage_buffer_object,
> -                                 glsl_type::int_type),
> +                _atomic_op2("__intrinsic_atomic_xor",
> +                            shader_storage_buffer_object,
> +                            glsl_type::uint_type),
> +                _atomic_op2("__intrinsic_atomic_xor",
> +                            shader_storage_buffer_object,
> +                            glsl_type::int_type),
>                  NULL);
>     add_function("atomicExchange",
> -                _atomic_ssbo_op2("__intrinsic_ssbo_atomic_exchange",
> -                                 shader_storage_buffer_object,
> -                                 glsl_type::uint_type),
> -                _atomic_ssbo_op2("__intrinsic_ssbo_atomic_exchange",
> -                                 shader_storage_buffer_object,
> -                                 glsl_type::int_type),
> +                _atomic_op2("__intrinsic_atomic_exchange",
> +                            shader_storage_buffer_object,
> +                            glsl_type::uint_type),
> +                _atomic_op2("__intrinsic_atomic_exchange",
> +                            shader_storage_buffer_object,
> +                            glsl_type::int_type),
>                  NULL);
>     add_function("atomicCompSwap",
> -                _atomic_ssbo_op3("__intrinsic_ssbo_atomic_comp_swap",
> -                                 shader_storage_buffer_object,
> -                                 glsl_type::uint_type),
> -                _atomic_ssbo_op3("__intrinsic_ssbo_atomic_comp_swap",
> -                                 shader_storage_buffer_object,
> -                                 glsl_type::int_type),
> +                _atomic_op3("__intrinsic_atomic_comp_swap",
> +                            shader_storage_buffer_object,
> +                            glsl_type::uint_type),
> +                _atomic_op3("__intrinsic_atomic_comp_swap",
> +                            shader_storage_buffer_object,
> +                            glsl_type::int_type),
>                  NULL);
>  
>     add_function("min3",
> @@ -5043,8 +5043,8 @@ builtin_builder::_atomic_counter_intrinsic(builtin_available_predicate avail)
>  }
>  
>  ir_function_signature *
> -builtin_builder::_atomic_ssbo_intrinsic2(builtin_available_predicate avail,
> -                                         const glsl_type *type)
> +builtin_builder::_atomic_intrinsic2(builtin_available_predicate avail,
> +                                    const glsl_type *type)
>  {
>     ir_variable *atomic = in_var(type, "atomic");
>     ir_variable *data = in_var(type, "data");
> @@ -5053,8 +5053,8 @@ builtin_builder::_atomic_ssbo_intrinsic2(builtin_available_predicate avail,
>  }
>  
>  ir_function_signature *
> -builtin_builder::_atomic_ssbo_intrinsic3(builtin_available_predicate avail,
> -                                         const glsl_type *type)
> +builtin_builder::_atomic_intrinsic3(builtin_available_predicate avail,
> +                                    const glsl_type *type)
>  {
>     ir_variable *atomic = in_var(type, "atomic");
>     ir_variable *data1 = in_var(type, "data1");
> @@ -5078,9 +5078,9 @@ builtin_builder::_atomic_counter_op(const char *intrinsic,
>  }
>  
>  ir_function_signature *
> -builtin_builder::_atomic_ssbo_op2(const char *intrinsic,
> -                                  builtin_available_predicate avail,
> -                                  const glsl_type *type)
> +builtin_builder::_atomic_op2(const char *intrinsic,
> +                             builtin_available_predicate avail,
> +                             const glsl_type *type)
>  {
>     ir_variable *atomic = in_var(type, "atomic_var");
>     ir_variable *data = in_var(type, "atomic_data");
> @@ -5094,9 +5094,9 @@ builtin_builder::_atomic_ssbo_op2(const char *intrinsic,
>  }
>  
>  ir_function_signature *
> -builtin_builder::_atomic_ssbo_op3(const char *intrinsic,
> -                                  builtin_available_predicate avail,
> -                                  const glsl_type *type)
> +builtin_builder::_atomic_op3(const char *intrinsic,
> +                             builtin_available_predicate avail,
> +                             const glsl_type *type)
>  {
>     ir_variable *atomic = in_var(type, "atomic_var");
>     ir_variable *data1 = in_var(type, "atomic_data1");
> diff --git a/src/glsl/lower_ubo_reference.cpp b/src/glsl/lower_ubo_reference.cpp
> index 6212b87..a64e9d7 100644
> --- a/src/glsl/lower_ubo_reference.cpp
> +++ b/src/glsl/lower_ubo_reference.cpp
> @@ -831,7 +831,7 @@ lower_ubo_reference_visitor::lower_ssbo_atomic_intrinsic(ir_call *ir)
>     sig->is_intrinsic = true;
>  
>     char func_name[64];
> -   sprintf(func_name, "%s_internal", ir->callee_name());
> +   sprintf(func_name, "%s_ssbo_internal", ir->callee_name());
>     ir_function *f = new(mem_ctx) ir_function(func_name);
>     f->add_signature(sig);
>  
> @@ -856,14 +856,14 @@ ir_call *
>  lower_ubo_reference_visitor::check_for_ssbo_atomic_intrinsic(ir_call *ir)
>  {
>     const char *callee = ir->callee_name();
> -   if (!strcmp("__intrinsic_ssbo_atomic_add", callee) ||
> -       !strcmp("__intrinsic_ssbo_atomic_min", callee) ||
> -       !strcmp("__intrinsic_ssbo_atomic_max", callee) ||
> -       !strcmp("__intrinsic_ssbo_atomic_and", callee) ||
> -       !strcmp("__intrinsic_ssbo_atomic_or", callee) ||
> -       !strcmp("__intrinsic_ssbo_atomic_xor", callee) ||
> -       !strcmp("__intrinsic_ssbo_atomic_exchange", callee) ||
> -       !strcmp("__intrinsic_ssbo_atomic_comp_swap", callee)) {
> +   if (!strcmp("__intrinsic_atomic_add", callee) ||
> +       !strcmp("__intrinsic_atomic_min", callee) ||
> +       !strcmp("__intrinsic_atomic_max", callee) ||
> +       !strcmp("__intrinsic_atomic_and", callee) ||
> +       !strcmp("__intrinsic_atomic_or", callee) ||
> +       !strcmp("__intrinsic_atomic_xor", callee) ||
> +       !strcmp("__intrinsic_atomic_exchange", callee) ||
> +       !strcmp("__intrinsic_atomic_comp_swap", callee)) {
>        return lower_ssbo_atomic_intrinsic(ir);
>     }
>  
> diff --git a/src/glsl/nir/glsl_to_nir.cpp b/src/glsl/nir/glsl_to_nir.cpp
> index cc1719a..231870d 100644
> --- a/src/glsl/nir/glsl_to_nir.cpp
> +++ b/src/glsl/nir/glsl_to_nir.cpp
> @@ -692,15 +692,15 @@ nir_visitor::visit(ir_call *ir)
>           op = nir_intrinsic_store_ssbo;
>        } else if (strcmp(ir->callee_name(), "__intrinsic_load_ssbo") == 0) {
>           op = nir_intrinsic_load_ssbo;
> -      } else if (strcmp(ir->callee_name(), "__intrinsic_ssbo_atomic_add_internal") == 0) {
> +      } else if (strcmp(ir->callee_name(), "__intrinsic_atomic_add_ssbo_internal") == 0) {
>           op = nir_intrinsic_ssbo_atomic_add;
> -      } else if (strcmp(ir->callee_name(), "__intrinsic_ssbo_atomic_and_internal") == 0) {
> +      } else if (strcmp(ir->callee_name(), "__intrinsic_atomic_and_ssbo_internal") == 0) {
>           op = nir_intrinsic_ssbo_atomic_and;
> -      } else if (strcmp(ir->callee_name(), "__intrinsic_ssbo_atomic_or_internal") == 0) {
> +      } else if (strcmp(ir->callee_name(), "__intrinsic_atomic_or_ssbo_internal") == 0) {
>           op = nir_intrinsic_ssbo_atomic_or;
> -      } else if (strcmp(ir->callee_name(), "__intrinsic_ssbo_atomic_xor_internal") == 0) {
> +      } else if (strcmp(ir->callee_name(), "__intrinsic_atomic_xor_ssbo_internal") == 0) {
>           op = nir_intrinsic_ssbo_atomic_xor;
> -      } else if (strcmp(ir->callee_name(), "__intrinsic_ssbo_atomic_min_internal") == 0) {
> +      } else if (strcmp(ir->callee_name(), "__intrinsic_atomic_min_ssbo_internal") == 0) {
>           assert(ir->return_deref);
>           if (ir->return_deref->type == glsl_type::int_type)
>              op = nir_intrinsic_ssbo_atomic_imin;
> @@ -708,7 +708,7 @@ nir_visitor::visit(ir_call *ir)
>              op = nir_intrinsic_ssbo_atomic_umin;
>           else
>              unreachable("Invalid type");
> -      } else if (strcmp(ir->callee_name(), "__intrinsic_ssbo_atomic_max_internal") == 0) {
> +      } else if (strcmp(ir->callee_name(), "__intrinsic_atomic_max_ssbo_internal") == 0) {
>           assert(ir->return_deref);
>           if (ir->return_deref->type == glsl_type::int_type)
>              op = nir_intrinsic_ssbo_atomic_imax;
> @@ -716,9 +716,9 @@ nir_visitor::visit(ir_call *ir)
>              op = nir_intrinsic_ssbo_atomic_umax;
>           else
>              unreachable("Invalid type");
> -      } else if (strcmp(ir->callee_name(), "__intrinsic_ssbo_atomic_exchange_internal") == 0) {
> +      } else if (strcmp(ir->callee_name(), "__intrinsic_atomic_exchange_ssbo_internal") == 0) {
>           op = nir_intrinsic_ssbo_atomic_exchange;
> -      } else if (strcmp(ir->callee_name(), "__intrinsic_ssbo_atomic_comp_swap_internal") == 0) {
> +      } else if (strcmp(ir->callee_name(), "__intrinsic_atomic_comp_swap_ssbo_internal") == 0) {
>           op = nir_intrinsic_ssbo_atomic_comp_swap;
>        } else if (strcmp(ir->callee_name(), "__intrinsic_shader_clock") == 0) {
>           op = nir_intrinsic_shader_clock;




More information about the mesa-dev mailing list