nir: split SSBO min/max atomic instrinsics into signed/unsigned versions
NIR is typeless so this is the only way to keep track of the type to select the proper atomic to use. v2: - Use imin,imax,umin,umax for the intrinsic names (Connor Abbott) - Change message for unreachable paths (Michael Schellenberger) Tested-by: Markus Wick <markus@selfnet.de> Reviewed-by: Kristian Høgsberg <krh@bitplanet.net> Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
@@ -691,9 +691,21 @@ nir_visitor::visit(ir_call *ir)
|
|||||||
} else if (strcmp(ir->callee_name(), "__intrinsic_ssbo_atomic_xor_internal") == 0) {
|
} else if (strcmp(ir->callee_name(), "__intrinsic_ssbo_atomic_xor_internal") == 0) {
|
||||||
op = nir_intrinsic_ssbo_atomic_xor;
|
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_ssbo_atomic_min_internal") == 0) {
|
||||||
op = nir_intrinsic_ssbo_atomic_min;
|
assert(ir->return_deref);
|
||||||
|
if (ir->return_deref->type == glsl_type::int_type)
|
||||||
|
op = nir_intrinsic_ssbo_atomic_imin;
|
||||||
|
else if (ir->return_deref->type == glsl_type::uint_type)
|
||||||
|
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_ssbo_atomic_max_internal") == 0) {
|
||||||
op = nir_intrinsic_ssbo_atomic_max;
|
assert(ir->return_deref);
|
||||||
|
if (ir->return_deref->type == glsl_type::int_type)
|
||||||
|
op = nir_intrinsic_ssbo_atomic_imax;
|
||||||
|
else if (ir->return_deref->type == glsl_type::uint_type)
|
||||||
|
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_ssbo_atomic_exchange_internal") == 0) {
|
||||||
op = nir_intrinsic_ssbo_atomic_exchange;
|
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_ssbo_atomic_comp_swap_internal") == 0) {
|
||||||
@@ -902,8 +914,10 @@ nir_visitor::visit(ir_call *ir)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case nir_intrinsic_ssbo_atomic_add:
|
case nir_intrinsic_ssbo_atomic_add:
|
||||||
case nir_intrinsic_ssbo_atomic_min:
|
case nir_intrinsic_ssbo_atomic_imin:
|
||||||
case nir_intrinsic_ssbo_atomic_max:
|
case nir_intrinsic_ssbo_atomic_umin:
|
||||||
|
case nir_intrinsic_ssbo_atomic_imax:
|
||||||
|
case nir_intrinsic_ssbo_atomic_umax:
|
||||||
case nir_intrinsic_ssbo_atomic_and:
|
case nir_intrinsic_ssbo_atomic_and:
|
||||||
case nir_intrinsic_ssbo_atomic_or:
|
case nir_intrinsic_ssbo_atomic_or:
|
||||||
case nir_intrinsic_ssbo_atomic_xor:
|
case nir_intrinsic_ssbo_atomic_xor:
|
||||||
|
@@ -174,8 +174,10 @@ INTRINSIC(image_samples, 0, ARR(), true, 1, 1, 0,
|
|||||||
* 3: For CompSwap only: the second data parameter.
|
* 3: For CompSwap only: the second data parameter.
|
||||||
*/
|
*/
|
||||||
INTRINSIC(ssbo_atomic_add, 3, ARR(1, 1, 1), true, 1, 0, 0, 0)
|
INTRINSIC(ssbo_atomic_add, 3, ARR(1, 1, 1), true, 1, 0, 0, 0)
|
||||||
INTRINSIC(ssbo_atomic_min, 3, ARR(1, 1, 1), true, 1, 0, 0, 0)
|
INTRINSIC(ssbo_atomic_imin, 3, ARR(1, 1, 1), true, 1, 0, 0, 0)
|
||||||
INTRINSIC(ssbo_atomic_max, 3, ARR(1, 1, 1), true, 1, 0, 0, 0)
|
INTRINSIC(ssbo_atomic_umin, 3, ARR(1, 1, 1), true, 1, 0, 0, 0)
|
||||||
|
INTRINSIC(ssbo_atomic_imax, 3, ARR(1, 1, 1), true, 1, 0, 0, 0)
|
||||||
|
INTRINSIC(ssbo_atomic_umax, 3, ARR(1, 1, 1), true, 1, 0, 0, 0)
|
||||||
INTRINSIC(ssbo_atomic_and, 3, ARR(1, 1, 1), true, 1, 0, 0, 0)
|
INTRINSIC(ssbo_atomic_and, 3, ARR(1, 1, 1), true, 1, 0, 0, 0)
|
||||||
INTRINSIC(ssbo_atomic_or, 3, ARR(1, 1, 1), true, 1, 0, 0, 0)
|
INTRINSIC(ssbo_atomic_or, 3, ARR(1, 1, 1), true, 1, 0, 0, 0)
|
||||||
INTRINSIC(ssbo_atomic_xor, 3, ARR(1, 1, 1), true, 1, 0, 0, 0)
|
INTRINSIC(ssbo_atomic_xor, 3, ARR(1, 1, 1), true, 1, 0, 0, 0)
|
||||||
|
@@ -1834,17 +1834,17 @@ fs_visitor::nir_emit_intrinsic(const fs_builder &bld, nir_intrinsic_instr *instr
|
|||||||
case nir_intrinsic_ssbo_atomic_add:
|
case nir_intrinsic_ssbo_atomic_add:
|
||||||
nir_emit_ssbo_atomic(bld, BRW_AOP_ADD, instr);
|
nir_emit_ssbo_atomic(bld, BRW_AOP_ADD, instr);
|
||||||
break;
|
break;
|
||||||
case nir_intrinsic_ssbo_atomic_min:
|
case nir_intrinsic_ssbo_atomic_imin:
|
||||||
if (dest.type == BRW_REGISTER_TYPE_D)
|
nir_emit_ssbo_atomic(bld, BRW_AOP_IMIN, instr);
|
||||||
nir_emit_ssbo_atomic(bld, BRW_AOP_IMIN, instr);
|
|
||||||
else
|
|
||||||
nir_emit_ssbo_atomic(bld, BRW_AOP_UMIN, instr);
|
|
||||||
break;
|
break;
|
||||||
case nir_intrinsic_ssbo_atomic_max:
|
case nir_intrinsic_ssbo_atomic_umin:
|
||||||
if (dest.type == BRW_REGISTER_TYPE_D)
|
nir_emit_ssbo_atomic(bld, BRW_AOP_UMIN, instr);
|
||||||
nir_emit_ssbo_atomic(bld, BRW_AOP_IMAX, instr);
|
break;
|
||||||
else
|
case nir_intrinsic_ssbo_atomic_imax:
|
||||||
nir_emit_ssbo_atomic(bld, BRW_AOP_UMAX, instr);
|
nir_emit_ssbo_atomic(bld, BRW_AOP_IMAX, instr);
|
||||||
|
break;
|
||||||
|
case nir_intrinsic_ssbo_atomic_umax:
|
||||||
|
nir_emit_ssbo_atomic(bld, BRW_AOP_UMAX, instr);
|
||||||
break;
|
break;
|
||||||
case nir_intrinsic_ssbo_atomic_and:
|
case nir_intrinsic_ssbo_atomic_and:
|
||||||
nir_emit_ssbo_atomic(bld, BRW_AOP_AND, instr);
|
nir_emit_ssbo_atomic(bld, BRW_AOP_AND, instr);
|
||||||
|
@@ -645,17 +645,17 @@ vec4_visitor::nir_emit_intrinsic(nir_intrinsic_instr *instr)
|
|||||||
case nir_intrinsic_ssbo_atomic_add:
|
case nir_intrinsic_ssbo_atomic_add:
|
||||||
nir_emit_ssbo_atomic(BRW_AOP_ADD, instr);
|
nir_emit_ssbo_atomic(BRW_AOP_ADD, instr);
|
||||||
break;
|
break;
|
||||||
case nir_intrinsic_ssbo_atomic_min:
|
case nir_intrinsic_ssbo_atomic_imin:
|
||||||
if (dest.type == BRW_REGISTER_TYPE_D)
|
nir_emit_ssbo_atomic(BRW_AOP_IMIN, instr);
|
||||||
nir_emit_ssbo_atomic(BRW_AOP_IMIN, instr);
|
|
||||||
else
|
|
||||||
nir_emit_ssbo_atomic(BRW_AOP_UMIN, instr);
|
|
||||||
break;
|
break;
|
||||||
case nir_intrinsic_ssbo_atomic_max:
|
case nir_intrinsic_ssbo_atomic_umin:
|
||||||
if (dest.type == BRW_REGISTER_TYPE_D)
|
nir_emit_ssbo_atomic(BRW_AOP_UMIN, instr);
|
||||||
nir_emit_ssbo_atomic(BRW_AOP_IMAX, instr);
|
break;
|
||||||
else
|
case nir_intrinsic_ssbo_atomic_imax:
|
||||||
nir_emit_ssbo_atomic(BRW_AOP_UMAX, instr);
|
nir_emit_ssbo_atomic(BRW_AOP_IMAX, instr);
|
||||||
|
break;
|
||||||
|
case nir_intrinsic_ssbo_atomic_umax:
|
||||||
|
nir_emit_ssbo_atomic(BRW_AOP_UMAX, instr);
|
||||||
break;
|
break;
|
||||||
case nir_intrinsic_ssbo_atomic_and:
|
case nir_intrinsic_ssbo_atomic_and:
|
||||||
nir_emit_ssbo_atomic(BRW_AOP_AND, instr);
|
nir_emit_ssbo_atomic(BRW_AOP_AND, instr);
|
||||||
|
Reference in New Issue
Block a user