diff --git a/src/compiler/glsl/builtin_functions.cpp b/src/compiler/glsl/builtin_functions.cpp index ae7c3da2a41..5e5e966b771 100644 --- a/src/compiler/glsl/builtin_functions.cpp +++ b/src/compiler/glsl/builtin_functions.cpp @@ -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", @@ -4117,6 +4189,9 @@ builtin_builder::create_builtins() _atomic_op2("__intrinsic_atomic_exchange", 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), @@ -4128,6 +4203,9 @@ builtin_builder::create_builtins() _atomic_op3("__intrinsic_atomic_comp_swap", 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), diff --git a/src/compiler/glsl/glsl_parser_extras.cpp b/src/compiler/glsl/glsl_parser_extras.cpp index cb206e32a49..8fb7cbd5a2f 100644 --- a/src/compiler/glsl/glsl_parser_extras.cpp +++ b/src/compiler/glsl/glsl_parser_extras.cpp @@ -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), }; diff --git a/src/compiler/glsl/glsl_parser_extras.h b/src/compiler/glsl/glsl_parser_extras.h index bd1392f7ce1..e475e18fdd9 100644 --- a/src/compiler/glsl/glsl_parser_extras.h +++ b/src/compiler/glsl/glsl_parser_extras.h @@ -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; /*@}*/ diff --git a/src/compiler/glsl/glsl_to_nir.cpp b/src/compiler/glsl/glsl_to_nir.cpp index 5a89cf49beb..108ce7177f6 100644 --- a/src/compiler/glsl/glsl_to_nir.cpp +++ b/src/compiler/glsl/glsl_to_nir.cpp @@ -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; } diff --git a/src/compiler/glsl/lower_shared_reference.cpp b/src/compiler/glsl/lower_shared_reference.cpp index fb6af0c088f..beb5d804a65 100644 --- a/src/compiler/glsl/lower_shared_reference.cpp +++ b/src/compiler/glsl/lower_shared_reference.cpp @@ -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); diff --git a/src/compiler/glsl/lower_ubo_reference.cpp b/src/compiler/glsl/lower_ubo_reference.cpp index 08d4f72efa0..9c1325b53ac 100644 --- a/src/compiler/glsl/lower_ubo_reference.cpp +++ b/src/compiler/glsl/lower_ubo_reference.cpp @@ -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); diff --git a/src/mesa/main/extensions_table.h b/src/mesa/main/extensions_table.h index c2541de3b1a..aa72241bfa9 100644 --- a/src/mesa/main/extensions_table.h +++ b/src/mesa/main/extensions_table.h @@ -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) diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 80dff85e3e8..04b97028237 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -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; diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c index da4cfc1c469..6258d08bb09 100644 --- a/src/mesa/state_tracker/st_extensions.c +++ b/src/mesa/state_tracker/st_extensions.c @@ -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;