mesa,glsl: add support for GL_NV_shader_atomic_int64
authorIndrajit Kumar Das <indrajit-kumar.das@amd.com>
Sun, 27 Sep 2020 13:03:06 +0000 (18:33 +0530)
committerMarge Bot <eric+marge@anholt.net>
Tue, 29 Sep 2020 14:24:44 +0000 (14:24 +0000)
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6708>

src/compiler/glsl/builtin_functions.cpp
src/compiler/glsl/glsl_parser_extras.cpp
src/compiler/glsl/glsl_parser_extras.h
src/compiler/glsl/glsl_to_nir.cpp
src/compiler/glsl/lower_shared_reference.cpp
src/compiler/glsl/lower_ubo_reference.cpp
src/mesa/main/extensions_table.h
src/mesa/main/mtypes.h
src/mesa/state_tracker/st_extensions.c

index ae7c3da..5e5e966 100644 (file)
@@ -1368,6 +1368,9 @@ builtin_builder::create_intrinsics()
                 _atomic_intrinsic2(NV_shader_atomic_float_supported,
                                    glsl_type::float_type,
                                    ir_intrinsic_generic_atomic_add),
+                _atomic_intrinsic2(buffer_atomics_supported,
+                                   glsl_type::int64_t_type,
+                                   ir_intrinsic_generic_atomic_add),
                 _atomic_counter_intrinsic1(shader_atomic_counter_ops_or_v460_desktop,
                                            ir_intrinsic_atomic_counter_add),
                 NULL);
@@ -1381,6 +1384,12 @@ builtin_builder::create_intrinsics()
                 _atomic_intrinsic2(INTEL_shader_atomic_float_minmax_supported,
                                    glsl_type::float_type,
                                    ir_intrinsic_generic_atomic_min),
+                _atomic_intrinsic2(buffer_atomics_supported,
+                                   glsl_type::uint64_t_type,
+                                   ir_intrinsic_generic_atomic_min),
+                _atomic_intrinsic2(buffer_atomics_supported,
+                                   glsl_type::int64_t_type,
+                                   ir_intrinsic_generic_atomic_min),
                 _atomic_counter_intrinsic1(shader_atomic_counter_ops_or_v460_desktop,
                                            ir_intrinsic_atomic_counter_min),
                 NULL);
@@ -1394,6 +1403,12 @@ builtin_builder::create_intrinsics()
                 _atomic_intrinsic2(INTEL_shader_atomic_float_minmax_supported,
                                    glsl_type::float_type,
                                    ir_intrinsic_generic_atomic_max),
+                _atomic_intrinsic2(buffer_atomics_supported,
+                                   glsl_type::uint64_t_type,
+                                   ir_intrinsic_generic_atomic_max),
+                _atomic_intrinsic2(buffer_atomics_supported,
+                                   glsl_type::int64_t_type,
+                                   ir_intrinsic_generic_atomic_max),
                 _atomic_counter_intrinsic1(shader_atomic_counter_ops_or_v460_desktop,
                                            ir_intrinsic_atomic_counter_max),
                 NULL);
@@ -1404,6 +1419,12 @@ builtin_builder::create_intrinsics()
                 _atomic_intrinsic2(buffer_atomics_supported,
                                    glsl_type::int_type,
                                    ir_intrinsic_generic_atomic_and),
+                _atomic_intrinsic2(buffer_atomics_supported,
+                                   glsl_type::uint64_t_type,
+                                   ir_intrinsic_generic_atomic_and),
+                _atomic_intrinsic2(buffer_atomics_supported,
+                                   glsl_type::int64_t_type,
+                                   ir_intrinsic_generic_atomic_and),
                 _atomic_counter_intrinsic1(shader_atomic_counter_ops_or_v460_desktop,
                                            ir_intrinsic_atomic_counter_and),
                 NULL);
@@ -1414,6 +1435,12 @@ builtin_builder::create_intrinsics()
                 _atomic_intrinsic2(buffer_atomics_supported,
                                    glsl_type::int_type,
                                    ir_intrinsic_generic_atomic_or),
+                _atomic_intrinsic2(buffer_atomics_supported,
+                                   glsl_type::uint64_t_type,
+                                   ir_intrinsic_generic_atomic_or),
+                _atomic_intrinsic2(buffer_atomics_supported,
+                                   glsl_type::int64_t_type,
+                                   ir_intrinsic_generic_atomic_or),
                 _atomic_counter_intrinsic1(shader_atomic_counter_ops_or_v460_desktop,
                                            ir_intrinsic_atomic_counter_or),
                 NULL);
@@ -1424,6 +1451,12 @@ builtin_builder::create_intrinsics()
                 _atomic_intrinsic2(buffer_atomics_supported,
                                    glsl_type::int_type,
                                    ir_intrinsic_generic_atomic_xor),
+                _atomic_intrinsic2(buffer_atomics_supported,
+                                   glsl_type::uint64_t_type,
+                                   ir_intrinsic_generic_atomic_xor),
+                _atomic_intrinsic2(buffer_atomics_supported,
+                                   glsl_type::int64_t_type,
+                                   ir_intrinsic_generic_atomic_xor),
                 _atomic_counter_intrinsic1(shader_atomic_counter_ops_or_v460_desktop,
                                            ir_intrinsic_atomic_counter_xor),
                 NULL);
@@ -1434,6 +1467,9 @@ builtin_builder::create_intrinsics()
                 _atomic_intrinsic2(buffer_atomics_supported,
                                    glsl_type::int_type,
                                    ir_intrinsic_generic_atomic_exchange),
+                _atomic_intrinsic2(buffer_atomics_supported,
+                                   glsl_type::int64_t_type,
+                                   ir_intrinsic_generic_atomic_exchange),
                 _atomic_intrinsic2(NV_shader_atomic_float_supported,
                                    glsl_type::float_type,
                                    ir_intrinsic_generic_atomic_exchange),
@@ -1447,6 +1483,9 @@ builtin_builder::create_intrinsics()
                 _atomic_intrinsic3(buffer_atomics_supported,
                                    glsl_type::int_type,
                                    ir_intrinsic_generic_atomic_comp_swap),
+                _atomic_intrinsic3(buffer_atomics_supported,
+                                   glsl_type::int64_t_type,
+                                   ir_intrinsic_generic_atomic_comp_swap),
                 _atomic_intrinsic3(INTEL_shader_atomic_float_minmax_supported,
                                    glsl_type::float_type,
                                    ir_intrinsic_generic_atomic_comp_swap),
@@ -4063,6 +4102,9 @@ builtin_builder::create_builtins()
                 _atomic_op2("__intrinsic_atomic_add",
                             shader_atomic_float_add,
                             glsl_type::float_type),
+                _atomic_op2("__intrinsic_atomic_add",
+                            buffer_atomics_supported,
+                            glsl_type::int64_t_type),
                 NULL);
    add_function("atomicMin",
                 _atomic_op2("__intrinsic_atomic_min",
@@ -4074,6 +4116,12 @@ builtin_builder::create_builtins()
                 _atomic_op2("__intrinsic_atomic_min",
                             shader_atomic_float_minmax,
                             glsl_type::float_type),
+                _atomic_op2("__intrinsic_atomic_min",
+                            buffer_atomics_supported,
+                            glsl_type::uint64_t_type),
+                _atomic_op2("__intrinsic_atomic_min",
+                            buffer_atomics_supported,
+                            glsl_type::int64_t_type),
                 NULL);
    add_function("atomicMax",
                 _atomic_op2("__intrinsic_atomic_max",
@@ -4085,6 +4133,12 @@ builtin_builder::create_builtins()
                 _atomic_op2("__intrinsic_atomic_max",
                             shader_atomic_float_minmax,
                             glsl_type::float_type),
+                _atomic_op2("__intrinsic_atomic_max",
+                            buffer_atomics_supported,
+                            glsl_type::uint64_t_type),
+                _atomic_op2("__intrinsic_atomic_max",
+                            buffer_atomics_supported,
+                            glsl_type::int64_t_type),
                 NULL);
    add_function("atomicAnd",
                 _atomic_op2("__intrinsic_atomic_and",
@@ -4093,6 +4147,12 @@ builtin_builder::create_builtins()
                 _atomic_op2("__intrinsic_atomic_and",
                             buffer_atomics_supported,
                             glsl_type::int_type),
+                _atomic_op2("__intrinsic_atomic_and",
+                            buffer_atomics_supported,
+                            glsl_type::uint64_t_type),
+                _atomic_op2("__intrinsic_atomic_and",
+                            buffer_atomics_supported,
+                            glsl_type::int64_t_type),
                 NULL);
    add_function("atomicOr",
                 _atomic_op2("__intrinsic_atomic_or",
@@ -4101,6 +4161,12 @@ builtin_builder::create_builtins()
                 _atomic_op2("__intrinsic_atomic_or",
                             buffer_atomics_supported,
                             glsl_type::int_type),
+                _atomic_op2("__intrinsic_atomic_or",
+                            buffer_atomics_supported,
+                            glsl_type::uint64_t_type),
+                _atomic_op2("__intrinsic_atomic_or",
+                            buffer_atomics_supported,
+                            glsl_type::int64_t_type),
                 NULL);
    add_function("atomicXor",
                 _atomic_op2("__intrinsic_atomic_xor",
@@ -4109,6 +4175,12 @@ builtin_builder::create_builtins()
                 _atomic_op2("__intrinsic_atomic_xor",
                             buffer_atomics_supported,
                             glsl_type::int_type),
+                _atomic_op2("__intrinsic_atomic_xor",
+                            buffer_atomics_supported,
+                            glsl_type::uint64_t_type),
+                _atomic_op2("__intrinsic_atomic_xor",
+                            buffer_atomics_supported,
+                            glsl_type::int64_t_type),
                 NULL);
    add_function("atomicExchange",
                 _atomic_op2("__intrinsic_atomic_exchange",
@@ -4118,6 +4190,9 @@ builtin_builder::create_builtins()
                             buffer_atomics_supported,
                             glsl_type::int_type),
                 _atomic_op2("__intrinsic_atomic_exchange",
+                            buffer_atomics_supported,
+                            glsl_type::int64_t_type),
+                _atomic_op2("__intrinsic_atomic_exchange",
                             shader_atomic_float_exchange,
                             glsl_type::float_type),
                 NULL);
@@ -4129,6 +4204,9 @@ builtin_builder::create_builtins()
                             buffer_atomics_supported,
                             glsl_type::int_type),
                 _atomic_op3("__intrinsic_atomic_comp_swap",
+                            buffer_atomics_supported,
+                            glsl_type::int64_t_type),
+                _atomic_op3("__intrinsic_atomic_comp_swap",
                             shader_atomic_float_minmax,
                             glsl_type::float_type),
                 NULL);
index cb206e3..8fb7cbd 100644 (file)
@@ -761,6 +761,7 @@ static const _mesa_glsl_extension _mesa_glsl_supported_extensions[] = {
    EXT(NV_fragment_shader_interlock),
    EXT(NV_image_formats),
    EXT(NV_shader_atomic_float),
+   EXT(NV_shader_atomic_int64),
    EXT(NV_viewport_array2),
 };
 
index bd1392f..e475e18 100644 (file)
@@ -890,6 +890,8 @@ struct _mesa_glsl_parse_state {
    bool NV_image_formats_warn;
    bool NV_shader_atomic_float_enable;
    bool NV_shader_atomic_float_warn;
+   bool NV_shader_atomic_int64_enable;
+   bool NV_shader_atomic_int64_warn;
    bool NV_viewport_array2_enable;
    bool NV_viewport_array2_warn;
    /*@}*/
index 5a89cf4..108ce71 100644 (file)
@@ -955,9 +955,11 @@ nir_visitor::visit(ir_call *ir)
          break;
       case ir_intrinsic_generic_atomic_min:
          assert(ir->return_deref);
-         if (ir->return_deref->type == glsl_type::int_type)
+         if (ir->return_deref->type == glsl_type::int_type ||
+             ir->return_deref->type == glsl_type::int64_t_type)
             op = nir_intrinsic_deref_atomic_imin;
-         else if (ir->return_deref->type == glsl_type::uint_type)
+         else if (ir->return_deref->type == glsl_type::uint_type ||
+                  ir->return_deref->type == glsl_type::uint64_t_type)
             op = nir_intrinsic_deref_atomic_umin;
          else if (ir->return_deref->type == glsl_type::float_type)
             op = nir_intrinsic_deref_atomic_fmin;
@@ -966,9 +968,11 @@ nir_visitor::visit(ir_call *ir)
          break;
       case ir_intrinsic_generic_atomic_max:
          assert(ir->return_deref);
-         if (ir->return_deref->type == glsl_type::int_type)
+         if (ir->return_deref->type == glsl_type::int_type ||
+             ir->return_deref->type == glsl_type::int64_t_type)
             op = nir_intrinsic_deref_atomic_imax;
-         else if (ir->return_deref->type == glsl_type::uint_type)
+         else if (ir->return_deref->type == glsl_type::uint_type ||
+                  ir->return_deref->type == glsl_type::uint64_t_type)
             op = nir_intrinsic_deref_atomic_umax;
          else if (ir->return_deref->type == glsl_type::float_type)
             op = nir_intrinsic_deref_atomic_fmax;
@@ -1135,9 +1139,11 @@ nir_visitor::visit(ir_call *ir)
          break;
       case ir_intrinsic_shared_atomic_min:
          assert(ir->return_deref);
-         if (ir->return_deref->type == glsl_type::int_type)
+         if (ir->return_deref->type == glsl_type::int_type ||
+             ir->return_deref->type == glsl_type::int64_t_type)
             op = nir_intrinsic_shared_atomic_imin;
-         else if (ir->return_deref->type == glsl_type::uint_type)
+         else if (ir->return_deref->type == glsl_type::uint_type ||
+                  ir->return_deref->type == glsl_type::uint64_t_type)
             op = nir_intrinsic_shared_atomic_umin;
          else if (ir->return_deref->type == glsl_type::float_type)
             op = nir_intrinsic_shared_atomic_fmin;
@@ -1146,9 +1152,11 @@ nir_visitor::visit(ir_call *ir)
          break;
       case ir_intrinsic_shared_atomic_max:
          assert(ir->return_deref);
-         if (ir->return_deref->type == glsl_type::int_type)
+         if (ir->return_deref->type == glsl_type::int_type ||
+             ir->return_deref->type == glsl_type::int64_t_type)
             op = nir_intrinsic_shared_atomic_imax;
-         else if (ir->return_deref->type == glsl_type::uint_type)
+         else if (ir->return_deref->type == glsl_type::uint_type ||
+                  ir->return_deref->type == glsl_type::uint64_t_type)
             op = nir_intrinsic_shared_atomic_umax;
          else if (ir->return_deref->type == glsl_type::float_type)
             op = nir_intrinsic_shared_atomic_fmax;
@@ -1246,8 +1254,13 @@ nir_visitor::visit(ir_call *ir)
 
          /* Atomic result */
          assert(ir->return_deref);
-         nir_ssa_dest_init(&instr->instr, &instr->dest,
-                           ir->return_deref->type->vector_elements, 32, NULL);
+         if (ir->return_deref->type->is_integer_64()) {
+            nir_ssa_dest_init(&instr->instr, &instr->dest,
+                              ir->return_deref->type->vector_elements, 64, NULL);
+         } else {
+            nir_ssa_dest_init(&instr->instr, &instr->dest,
+                              ir->return_deref->type->vector_elements, 32, NULL);
+         }
          nir_builder_instr_insert(&b, &instr->instr);
          break;
       }
index fb6af0c..beb5d80 100644 (file)
@@ -354,7 +354,7 @@ lower_shared_reference_visitor::lower_shared_atomic_intrinsic(ir_call *ir)
 
    ir_rvalue *deref = (ir_rvalue *) inst;
    assert(deref->type->is_scalar() &&
-          (deref->type->is_integer_32() || deref->type->is_float()));
+          (deref->type->is_integer_32_64() || deref->type->is_float()));
 
    ir_variable *var = deref->variable_referenced();
    assert(var);
index 08d4f72..9c1325b 100644 (file)
@@ -971,7 +971,7 @@ lower_ubo_reference_visitor::lower_ssbo_atomic_intrinsic(ir_call *ir)
 
    ir_rvalue *deref = (ir_rvalue *) inst;
    assert(deref->type->is_scalar() &&
-          (deref->type->is_integer_32() || deref->type->is_float()));
+          (deref->type->is_integer_32_64() || deref->type->is_float()));
 
    ir_variable *var = deref->variable_referenced();
    assert(var);
index c2541de..aa72241 100644 (file)
@@ -402,6 +402,7 @@ EXT(NV_read_depth_stencil                   , dummy_true
 EXT(NV_read_stencil                         , dummy_true                             ,  x ,  x ,  x , ES2, 2011)
 EXT(NV_sample_locations                     , ARB_sample_locations                   , GLL, GLC,  x , ES2, 2015)
 EXT(NV_shader_atomic_float                  , NV_shader_atomic_float                 , GLL, GLC,  x ,  x , 2012)
+EXT(NV_shader_atomic_int64                  , NV_shader_atomic_int64                 , GLL, GLC,  x ,  x , 2014)
 EXT(NV_texgen_reflection                    , dummy_true                             , GLL,  x ,  x ,  x , 1999)
 EXT(NV_texture_barrier                      , NV_texture_barrier                     , GLL, GLC,  x ,  x , 2009)
 EXT(NV_texture_env_combine4                 , NV_texture_env_combine4                , GLL,  x ,  x ,  x , 1999)
index 80dff85..04b9702 100644 (file)
@@ -4457,6 +4457,7 @@ struct gl_extensions
    GLboolean NV_point_sprite;
    GLboolean NV_primitive_restart;
    GLboolean NV_shader_atomic_float;
+   GLboolean NV_shader_atomic_int64;
    GLboolean NV_texture_barrier;
    GLboolean NV_texture_env_combine4;
    GLboolean NV_texture_rectangle;
index da4cfc1..6258d08 100644 (file)
@@ -815,6 +815,7 @@ void st_init_extensions(struct pipe_screen *screen,
       { o(NV_fill_rectangle),                PIPE_CAP_POLYGON_MODE_FILL_RECTANGLE      },
       { o(NV_primitive_restart),             PIPE_CAP_PRIMITIVE_RESTART                },
       { o(NV_shader_atomic_float),           PIPE_CAP_TGSI_ATOMFADD                    },
+      { o(NV_shader_atomic_int64),           PIPE_CAP_SHADER_ATOMIC_INT64              },
       { o(NV_texture_barrier),               PIPE_CAP_TEXTURE_BARRIER                  },
       { o(NV_viewport_array2),               PIPE_CAP_VIEWPORT_MASK                    },
       { o(NV_viewport_swizzle),              PIPE_CAP_VIEWPORT_SWIZZLE                 },
@@ -1751,6 +1752,7 @@ void st_init_extensions(struct pipe_screen *screen,
       spirv_caps->image_read_without_format  = extensions->EXT_shader_image_load_formatted;
       spirv_caps->image_write_without_format = extensions->ARB_shader_image_load_store;
       spirv_caps->int64                      = extensions->ARB_gpu_shader_int64;
+      spirv_caps->int64_atomics              = extensions->NV_shader_atomic_int64;
       spirv_caps->post_depth_coverage        = extensions->ARB_post_depth_coverage;
       spirv_caps->shader_clock               = extensions->ARB_shader_clock;
       spirv_caps->shader_viewport_index_layer = extensions->ARB_shader_viewport_layer_array;