mesa,glsl: add support for GL_NV_shader_atomic_int64

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6708>
This commit is contained in:
Indrajit Kumar Das
2020-09-27 18:33:06 +05:30
committed by Marge Bot
parent 8930b3bcdd
commit 40c1f9883e
9 changed files with 110 additions and 12 deletions

View File

@@ -1368,6 +1368,9 @@ builtin_builder::create_intrinsics()
_atomic_intrinsic2(NV_shader_atomic_float_supported, _atomic_intrinsic2(NV_shader_atomic_float_supported,
glsl_type::float_type, glsl_type::float_type,
ir_intrinsic_generic_atomic_add), 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, _atomic_counter_intrinsic1(shader_atomic_counter_ops_or_v460_desktop,
ir_intrinsic_atomic_counter_add), ir_intrinsic_atomic_counter_add),
NULL); NULL);
@@ -1381,6 +1384,12 @@ builtin_builder::create_intrinsics()
_atomic_intrinsic2(INTEL_shader_atomic_float_minmax_supported, _atomic_intrinsic2(INTEL_shader_atomic_float_minmax_supported,
glsl_type::float_type, glsl_type::float_type,
ir_intrinsic_generic_atomic_min), 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, _atomic_counter_intrinsic1(shader_atomic_counter_ops_or_v460_desktop,
ir_intrinsic_atomic_counter_min), ir_intrinsic_atomic_counter_min),
NULL); NULL);
@@ -1394,6 +1403,12 @@ builtin_builder::create_intrinsics()
_atomic_intrinsic2(INTEL_shader_atomic_float_minmax_supported, _atomic_intrinsic2(INTEL_shader_atomic_float_minmax_supported,
glsl_type::float_type, glsl_type::float_type,
ir_intrinsic_generic_atomic_max), 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, _atomic_counter_intrinsic1(shader_atomic_counter_ops_or_v460_desktop,
ir_intrinsic_atomic_counter_max), ir_intrinsic_atomic_counter_max),
NULL); NULL);
@@ -1404,6 +1419,12 @@ builtin_builder::create_intrinsics()
_atomic_intrinsic2(buffer_atomics_supported, _atomic_intrinsic2(buffer_atomics_supported,
glsl_type::int_type, glsl_type::int_type,
ir_intrinsic_generic_atomic_and), 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, _atomic_counter_intrinsic1(shader_atomic_counter_ops_or_v460_desktop,
ir_intrinsic_atomic_counter_and), ir_intrinsic_atomic_counter_and),
NULL); NULL);
@@ -1414,6 +1435,12 @@ builtin_builder::create_intrinsics()
_atomic_intrinsic2(buffer_atomics_supported, _atomic_intrinsic2(buffer_atomics_supported,
glsl_type::int_type, glsl_type::int_type,
ir_intrinsic_generic_atomic_or), 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, _atomic_counter_intrinsic1(shader_atomic_counter_ops_or_v460_desktop,
ir_intrinsic_atomic_counter_or), ir_intrinsic_atomic_counter_or),
NULL); NULL);
@@ -1424,6 +1451,12 @@ builtin_builder::create_intrinsics()
_atomic_intrinsic2(buffer_atomics_supported, _atomic_intrinsic2(buffer_atomics_supported,
glsl_type::int_type, glsl_type::int_type,
ir_intrinsic_generic_atomic_xor), 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, _atomic_counter_intrinsic1(shader_atomic_counter_ops_or_v460_desktop,
ir_intrinsic_atomic_counter_xor), ir_intrinsic_atomic_counter_xor),
NULL); NULL);
@@ -1434,6 +1467,9 @@ builtin_builder::create_intrinsics()
_atomic_intrinsic2(buffer_atomics_supported, _atomic_intrinsic2(buffer_atomics_supported,
glsl_type::int_type, glsl_type::int_type,
ir_intrinsic_generic_atomic_exchange), 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, _atomic_intrinsic2(NV_shader_atomic_float_supported,
glsl_type::float_type, glsl_type::float_type,
ir_intrinsic_generic_atomic_exchange), ir_intrinsic_generic_atomic_exchange),
@@ -1447,6 +1483,9 @@ builtin_builder::create_intrinsics()
_atomic_intrinsic3(buffer_atomics_supported, _atomic_intrinsic3(buffer_atomics_supported,
glsl_type::int_type, glsl_type::int_type,
ir_intrinsic_generic_atomic_comp_swap), 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, _atomic_intrinsic3(INTEL_shader_atomic_float_minmax_supported,
glsl_type::float_type, glsl_type::float_type,
ir_intrinsic_generic_atomic_comp_swap), ir_intrinsic_generic_atomic_comp_swap),
@@ -4063,6 +4102,9 @@ builtin_builder::create_builtins()
_atomic_op2("__intrinsic_atomic_add", _atomic_op2("__intrinsic_atomic_add",
shader_atomic_float_add, shader_atomic_float_add,
glsl_type::float_type), glsl_type::float_type),
_atomic_op2("__intrinsic_atomic_add",
buffer_atomics_supported,
glsl_type::int64_t_type),
NULL); NULL);
add_function("atomicMin", add_function("atomicMin",
_atomic_op2("__intrinsic_atomic_min", _atomic_op2("__intrinsic_atomic_min",
@@ -4074,6 +4116,12 @@ builtin_builder::create_builtins()
_atomic_op2("__intrinsic_atomic_min", _atomic_op2("__intrinsic_atomic_min",
shader_atomic_float_minmax, shader_atomic_float_minmax,
glsl_type::float_type), 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); NULL);
add_function("atomicMax", add_function("atomicMax",
_atomic_op2("__intrinsic_atomic_max", _atomic_op2("__intrinsic_atomic_max",
@@ -4085,6 +4133,12 @@ builtin_builder::create_builtins()
_atomic_op2("__intrinsic_atomic_max", _atomic_op2("__intrinsic_atomic_max",
shader_atomic_float_minmax, shader_atomic_float_minmax,
glsl_type::float_type), 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); NULL);
add_function("atomicAnd", add_function("atomicAnd",
_atomic_op2("__intrinsic_atomic_and", _atomic_op2("__intrinsic_atomic_and",
@@ -4093,6 +4147,12 @@ builtin_builder::create_builtins()
_atomic_op2("__intrinsic_atomic_and", _atomic_op2("__intrinsic_atomic_and",
buffer_atomics_supported, buffer_atomics_supported,
glsl_type::int_type), 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); NULL);
add_function("atomicOr", add_function("atomicOr",
_atomic_op2("__intrinsic_atomic_or", _atomic_op2("__intrinsic_atomic_or",
@@ -4101,6 +4161,12 @@ builtin_builder::create_builtins()
_atomic_op2("__intrinsic_atomic_or", _atomic_op2("__intrinsic_atomic_or",
buffer_atomics_supported, buffer_atomics_supported,
glsl_type::int_type), 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); NULL);
add_function("atomicXor", add_function("atomicXor",
_atomic_op2("__intrinsic_atomic_xor", _atomic_op2("__intrinsic_atomic_xor",
@@ -4109,6 +4175,12 @@ builtin_builder::create_builtins()
_atomic_op2("__intrinsic_atomic_xor", _atomic_op2("__intrinsic_atomic_xor",
buffer_atomics_supported, buffer_atomics_supported,
glsl_type::int_type), 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); NULL);
add_function("atomicExchange", add_function("atomicExchange",
_atomic_op2("__intrinsic_atomic_exchange", _atomic_op2("__intrinsic_atomic_exchange",
@@ -4117,6 +4189,9 @@ builtin_builder::create_builtins()
_atomic_op2("__intrinsic_atomic_exchange", _atomic_op2("__intrinsic_atomic_exchange",
buffer_atomics_supported, buffer_atomics_supported,
glsl_type::int_type), glsl_type::int_type),
_atomic_op2("__intrinsic_atomic_exchange",
buffer_atomics_supported,
glsl_type::int64_t_type),
_atomic_op2("__intrinsic_atomic_exchange", _atomic_op2("__intrinsic_atomic_exchange",
shader_atomic_float_exchange, shader_atomic_float_exchange,
glsl_type::float_type), glsl_type::float_type),
@@ -4128,6 +4203,9 @@ builtin_builder::create_builtins()
_atomic_op3("__intrinsic_atomic_comp_swap", _atomic_op3("__intrinsic_atomic_comp_swap",
buffer_atomics_supported, buffer_atomics_supported,
glsl_type::int_type), glsl_type::int_type),
_atomic_op3("__intrinsic_atomic_comp_swap",
buffer_atomics_supported,
glsl_type::int64_t_type),
_atomic_op3("__intrinsic_atomic_comp_swap", _atomic_op3("__intrinsic_atomic_comp_swap",
shader_atomic_float_minmax, shader_atomic_float_minmax,
glsl_type::float_type), glsl_type::float_type),

View File

@@ -761,6 +761,7 @@ static const _mesa_glsl_extension _mesa_glsl_supported_extensions[] = {
EXT(NV_fragment_shader_interlock), EXT(NV_fragment_shader_interlock),
EXT(NV_image_formats), EXT(NV_image_formats),
EXT(NV_shader_atomic_float), EXT(NV_shader_atomic_float),
EXT(NV_shader_atomic_int64),
EXT(NV_viewport_array2), EXT(NV_viewport_array2),
}; };

View File

@@ -890,6 +890,8 @@ struct _mesa_glsl_parse_state {
bool NV_image_formats_warn; bool NV_image_formats_warn;
bool NV_shader_atomic_float_enable; bool NV_shader_atomic_float_enable;
bool NV_shader_atomic_float_warn; 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_enable;
bool NV_viewport_array2_warn; bool NV_viewport_array2_warn;
/*@}*/ /*@}*/

View File

@@ -955,9 +955,11 @@ nir_visitor::visit(ir_call *ir)
break; break;
case ir_intrinsic_generic_atomic_min: case ir_intrinsic_generic_atomic_min:
assert(ir->return_deref); 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; 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; op = nir_intrinsic_deref_atomic_umin;
else if (ir->return_deref->type == glsl_type::float_type) else if (ir->return_deref->type == glsl_type::float_type)
op = nir_intrinsic_deref_atomic_fmin; op = nir_intrinsic_deref_atomic_fmin;
@@ -966,9 +968,11 @@ nir_visitor::visit(ir_call *ir)
break; break;
case ir_intrinsic_generic_atomic_max: case ir_intrinsic_generic_atomic_max:
assert(ir->return_deref); 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; 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; op = nir_intrinsic_deref_atomic_umax;
else if (ir->return_deref->type == glsl_type::float_type) else if (ir->return_deref->type == glsl_type::float_type)
op = nir_intrinsic_deref_atomic_fmax; op = nir_intrinsic_deref_atomic_fmax;
@@ -1135,9 +1139,11 @@ nir_visitor::visit(ir_call *ir)
break; break;
case ir_intrinsic_shared_atomic_min: case ir_intrinsic_shared_atomic_min:
assert(ir->return_deref); 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; 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; op = nir_intrinsic_shared_atomic_umin;
else if (ir->return_deref->type == glsl_type::float_type) else if (ir->return_deref->type == glsl_type::float_type)
op = nir_intrinsic_shared_atomic_fmin; op = nir_intrinsic_shared_atomic_fmin;
@@ -1146,9 +1152,11 @@ nir_visitor::visit(ir_call *ir)
break; break;
case ir_intrinsic_shared_atomic_max: case ir_intrinsic_shared_atomic_max:
assert(ir->return_deref); 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; 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; op = nir_intrinsic_shared_atomic_umax;
else if (ir->return_deref->type == glsl_type::float_type) else if (ir->return_deref->type == glsl_type::float_type)
op = nir_intrinsic_shared_atomic_fmax; op = nir_intrinsic_shared_atomic_fmax;
@@ -1246,8 +1254,13 @@ nir_visitor::visit(ir_call *ir)
/* Atomic result */ /* Atomic result */
assert(ir->return_deref); assert(ir->return_deref);
nir_ssa_dest_init(&instr->instr, &instr->dest, if (ir->return_deref->type->is_integer_64()) {
ir->return_deref->type->vector_elements, 32, NULL); 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); nir_builder_instr_insert(&b, &instr->instr);
break; break;
} }

View File

@@ -354,7 +354,7 @@ lower_shared_reference_visitor::lower_shared_atomic_intrinsic(ir_call *ir)
ir_rvalue *deref = (ir_rvalue *) inst; ir_rvalue *deref = (ir_rvalue *) inst;
assert(deref->type->is_scalar() && 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(); ir_variable *var = deref->variable_referenced();
assert(var); assert(var);

View File

@@ -971,7 +971,7 @@ lower_ubo_reference_visitor::lower_ssbo_atomic_intrinsic(ir_call *ir)
ir_rvalue *deref = (ir_rvalue *) inst; ir_rvalue *deref = (ir_rvalue *) inst;
assert(deref->type->is_scalar() && 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(); ir_variable *var = deref->variable_referenced();
assert(var); assert(var);

View 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_read_stencil , dummy_true , x , x , x , ES2, 2011)
EXT(NV_sample_locations , ARB_sample_locations , GLL, GLC, x , ES2, 2015) 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_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_texgen_reflection , dummy_true , GLL, x , x , x , 1999)
EXT(NV_texture_barrier , NV_texture_barrier , GLL, GLC, x , x , 2009) 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) EXT(NV_texture_env_combine4 , NV_texture_env_combine4 , GLL, x , x , x , 1999)

View File

@@ -4457,6 +4457,7 @@ struct gl_extensions
GLboolean NV_point_sprite; GLboolean NV_point_sprite;
GLboolean NV_primitive_restart; GLboolean NV_primitive_restart;
GLboolean NV_shader_atomic_float; GLboolean NV_shader_atomic_float;
GLboolean NV_shader_atomic_int64;
GLboolean NV_texture_barrier; GLboolean NV_texture_barrier;
GLboolean NV_texture_env_combine4; GLboolean NV_texture_env_combine4;
GLboolean NV_texture_rectangle; GLboolean NV_texture_rectangle;

View 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_fill_rectangle), PIPE_CAP_POLYGON_MODE_FILL_RECTANGLE },
{ o(NV_primitive_restart), PIPE_CAP_PRIMITIVE_RESTART }, { o(NV_primitive_restart), PIPE_CAP_PRIMITIVE_RESTART },
{ o(NV_shader_atomic_float), PIPE_CAP_TGSI_ATOMFADD }, { 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_texture_barrier), PIPE_CAP_TEXTURE_BARRIER },
{ o(NV_viewport_array2), PIPE_CAP_VIEWPORT_MASK }, { o(NV_viewport_array2), PIPE_CAP_VIEWPORT_MASK },
{ o(NV_viewport_swizzle), PIPE_CAP_VIEWPORT_SWIZZLE }, { 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_read_without_format = extensions->EXT_shader_image_load_formatted;
spirv_caps->image_write_without_format = extensions->ARB_shader_image_load_store; spirv_caps->image_write_without_format = extensions->ARB_shader_image_load_store;
spirv_caps->int64 = extensions->ARB_gpu_shader_int64; 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->post_depth_coverage = extensions->ARB_post_depth_coverage;
spirv_caps->shader_clock = extensions->ARB_shader_clock; spirv_caps->shader_clock = extensions->ARB_shader_clock;
spirv_caps->shader_viewport_index_layer = extensions->ARB_shader_viewport_layer_array; spirv_caps->shader_viewport_index_layer = extensions->ARB_shader_viewport_layer_array;