_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);
_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);
_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);
_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);
_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);
_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);
_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),
_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),
_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",
_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",
_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",
_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",
_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",
_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",
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);
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);
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;
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;
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;
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;
/* 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;
}