projects
/
mesa.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
69ce7ba
)
nir: Add floating point atomic min, max, and compare-swap instrinsics
author
Ian Romanick
<ian.d.romanick@intel.com>
Wed, 18 Apr 2018 20:34:25 +0000
(13:34 -0700)
committer
Ian Romanick
<ian.d.romanick@intel.com>
Thu, 23 Aug 2018 03:31:32 +0000
(20:31 -0700)
Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
src/compiler/glsl/glsl_to_nir.cpp
patch
|
blob
|
history
src/compiler/nir/nir_intrinsics.py
patch
|
blob
|
history
src/compiler/nir/nir_lower_atomics_to_ssbo.c
patch
|
blob
|
history
src/compiler/nir/nir_lower_io.c
patch
|
blob
|
history
diff --git
a/src/compiler/glsl/glsl_to_nir.cpp
b/src/compiler/glsl/glsl_to_nir.cpp
index aba8d70a8a03b132f8dafc1dee8449d86f972ee5..a53000f47e9d8826ddc49574e7bdf63a36dced5b 100644
(file)
--- a/
src/compiler/glsl/glsl_to_nir.cpp
+++ b/
src/compiler/glsl/glsl_to_nir.cpp
@@
-709,6
+709,8
@@
nir_visitor::visit(ir_call *ir)
op = nir_intrinsic_ssbo_atomic_imin;
else if (ir->return_deref->type == glsl_type::uint_type)
op = nir_intrinsic_ssbo_atomic_umin;
op = nir_intrinsic_ssbo_atomic_imin;
else if (ir->return_deref->type == glsl_type::uint_type)
op = nir_intrinsic_ssbo_atomic_umin;
+ else if (ir->return_deref->type == glsl_type::float_type)
+ op = nir_intrinsic_ssbo_atomic_fmin;
else
unreachable("Invalid type");
break;
else
unreachable("Invalid type");
break;
@@
-718,6
+720,8
@@
nir_visitor::visit(ir_call *ir)
op = nir_intrinsic_ssbo_atomic_imax;
else if (ir->return_deref->type == glsl_type::uint_type)
op = nir_intrinsic_ssbo_atomic_umax;
op = nir_intrinsic_ssbo_atomic_imax;
else if (ir->return_deref->type == glsl_type::uint_type)
op = nir_intrinsic_ssbo_atomic_umax;
+ else if (ir->return_deref->type == glsl_type::float_type)
+ op = nir_intrinsic_ssbo_atomic_fmax;
else
unreachable("Invalid type");
break;
else
unreachable("Invalid type");
break;
@@
-725,7
+729,9
@@
nir_visitor::visit(ir_call *ir)
op = nir_intrinsic_ssbo_atomic_exchange;
break;
case ir_intrinsic_ssbo_atomic_comp_swap:
op = nir_intrinsic_ssbo_atomic_exchange;
break;
case ir_intrinsic_ssbo_atomic_comp_swap:
- op = nir_intrinsic_ssbo_atomic_comp_swap;
+ op = ir->return_deref->type->is_integer_32_64()
+ ? nir_intrinsic_ssbo_atomic_comp_swap
+ : nir_intrinsic_ssbo_atomic_fcomp_swap;
break;
case ir_intrinsic_shader_clock:
op = nir_intrinsic_shader_clock;
break;
case ir_intrinsic_shader_clock:
op = nir_intrinsic_shader_clock;
@@
-777,6
+783,8
@@
nir_visitor::visit(ir_call *ir)
op = nir_intrinsic_shared_atomic_imin;
else if (ir->return_deref->type == glsl_type::uint_type)
op = nir_intrinsic_shared_atomic_umin;
op = nir_intrinsic_shared_atomic_imin;
else if (ir->return_deref->type == glsl_type::uint_type)
op = nir_intrinsic_shared_atomic_umin;
+ else if (ir->return_deref->type == glsl_type::float_type)
+ op = nir_intrinsic_shared_atomic_fmin;
else
unreachable("Invalid type");
break;
else
unreachable("Invalid type");
break;
@@
-786,6
+794,8
@@
nir_visitor::visit(ir_call *ir)
op = nir_intrinsic_shared_atomic_imax;
else if (ir->return_deref->type == glsl_type::uint_type)
op = nir_intrinsic_shared_atomic_umax;
op = nir_intrinsic_shared_atomic_imax;
else if (ir->return_deref->type == glsl_type::uint_type)
op = nir_intrinsic_shared_atomic_umax;
+ else if (ir->return_deref->type == glsl_type::float_type)
+ op = nir_intrinsic_shared_atomic_fmax;
else
unreachable("Invalid type");
break;
else
unreachable("Invalid type");
break;
@@
-793,7
+803,9
@@
nir_visitor::visit(ir_call *ir)
op = nir_intrinsic_shared_atomic_exchange;
break;
case ir_intrinsic_shared_atomic_comp_swap:
op = nir_intrinsic_shared_atomic_exchange;
break;
case ir_intrinsic_shared_atomic_comp_swap:
- op = nir_intrinsic_shared_atomic_comp_swap;
+ op = ir->return_deref->type->is_integer_32_64()
+ ? nir_intrinsic_shared_atomic_comp_swap
+ : nir_intrinsic_shared_atomic_fcomp_swap;
break;
case ir_intrinsic_vote_any:
op = nir_intrinsic_vote_any;
break;
case ir_intrinsic_vote_any:
op = nir_intrinsic_vote_any;
@@
-1042,7
+1054,10
@@
nir_visitor::visit(ir_call *ir)
case nir_intrinsic_ssbo_atomic_xor:
case nir_intrinsic_ssbo_atomic_exchange:
case nir_intrinsic_ssbo_atomic_comp_swap:
case nir_intrinsic_ssbo_atomic_xor:
case nir_intrinsic_ssbo_atomic_exchange:
case nir_intrinsic_ssbo_atomic_comp_swap:
- case nir_intrinsic_ssbo_atomic_fadd: {
+ case nir_intrinsic_ssbo_atomic_fadd:
+ case nir_intrinsic_ssbo_atomic_fmin:
+ case nir_intrinsic_ssbo_atomic_fmax:
+ case nir_intrinsic_ssbo_atomic_fcomp_swap: {
int param_count = ir->actual_parameters.length();
assert(param_count == 3 || param_count == 4);
int param_count = ir->actual_parameters.length();
assert(param_count == 3 || param_count == 4);
@@
-1063,7
+1078,8
@@
nir_visitor::visit(ir_call *ir)
/* data2 parameter (only with atomic_comp_swap) */
if (param_count == 4) {
/* data2 parameter (only with atomic_comp_swap) */
if (param_count == 4) {
- assert(op == nir_intrinsic_ssbo_atomic_comp_swap);
+ assert(op == nir_intrinsic_ssbo_atomic_comp_swap ||
+ op == nir_intrinsic_ssbo_atomic_fcomp_swap);
param = param->get_next();
inst = (ir_instruction *) param;
instr->src[3] = nir_src_for_ssa(evaluate_rvalue(inst->as_rvalue()));
param = param->get_next();
inst = (ir_instruction *) param;
instr->src[3] = nir_src_for_ssa(evaluate_rvalue(inst->as_rvalue()));
@@
-1126,7
+1142,10
@@
nir_visitor::visit(ir_call *ir)
case nir_intrinsic_shared_atomic_xor:
case nir_intrinsic_shared_atomic_exchange:
case nir_intrinsic_shared_atomic_comp_swap:
case nir_intrinsic_shared_atomic_xor:
case nir_intrinsic_shared_atomic_exchange:
case nir_intrinsic_shared_atomic_comp_swap:
- case nir_intrinsic_shared_atomic_fadd: {
+ case nir_intrinsic_shared_atomic_fadd:
+ case nir_intrinsic_shared_atomic_fmin:
+ case nir_intrinsic_shared_atomic_fmax:
+ case nir_intrinsic_shared_atomic_fcomp_swap: {
int param_count = ir->actual_parameters.length();
assert(param_count == 2 || param_count == 3);
int param_count = ir->actual_parameters.length();
assert(param_count == 2 || param_count == 3);
@@
-1142,7
+1161,8
@@
nir_visitor::visit(ir_call *ir)
/* data2 parameter (only with atomic_comp_swap) */
if (param_count == 3) {
/* data2 parameter (only with atomic_comp_swap) */
if (param_count == 3) {
- assert(op == nir_intrinsic_shared_atomic_comp_swap);
+ assert(op == nir_intrinsic_shared_atomic_comp_swap ||
+ op == nir_intrinsic_shared_atomic_fcomp_swap);
param = param->get_next();
inst = (ir_instruction *) param;
instr->src[2] =
param = param->get_next();
inst = (ir_instruction *) param;
instr->src[2] =
diff --git
a/src/compiler/nir/nir_intrinsics.py
b/src/compiler/nir/nir_intrinsics.py
index 836cb34d74a7a7aa8824be77aafbe313b98bc347..8c9bc3bbc9a46d7668103c7852d33a12ee5888cd 100644
(file)
--- a/
src/compiler/nir/nir_intrinsics.py
+++ b/
src/compiler/nir/nir_intrinsics.py
@@
-359,6
+359,9
@@
intrinsic("deref_atomic_xor", src_comp=[1, 1], dest_comp=1)
intrinsic("deref_atomic_exchange", src_comp=[1, 1], dest_comp=1)
intrinsic("deref_atomic_comp_swap", src_comp=[1, 1, 1], dest_comp=1)
intrinsic("deref_atomic_fadd", src_comp=[1, 1], dest_comp=1)
intrinsic("deref_atomic_exchange", src_comp=[1, 1], dest_comp=1)
intrinsic("deref_atomic_comp_swap", src_comp=[1, 1, 1], dest_comp=1)
intrinsic("deref_atomic_fadd", src_comp=[1, 1], dest_comp=1)
+intrinsic("deref_atomic_fmin", src_comp=[1, 1], dest_comp=1)
+intrinsic("deref_atomic_fmax", src_comp=[1, 1], dest_comp=1)
+intrinsic("deref_atomic_fcomp_swap", src_comp=[1, 1, 1], dest_comp=1)
# SSBO atomic intrinsics
#
# SSBO atomic intrinsics
#
@@
-385,7
+388,10
@@
intrinsic("ssbo_atomic_or", src_comp=[1, 1, 1], dest_comp=1)
intrinsic("ssbo_atomic_xor", src_comp=[1, 1, 1], dest_comp=1)
intrinsic("ssbo_atomic_exchange", src_comp=[1, 1, 1], dest_comp=1)
intrinsic("ssbo_atomic_comp_swap", src_comp=[1, 1, 1, 1], dest_comp=1)
intrinsic("ssbo_atomic_xor", src_comp=[1, 1, 1], dest_comp=1)
intrinsic("ssbo_atomic_exchange", src_comp=[1, 1, 1], dest_comp=1)
intrinsic("ssbo_atomic_comp_swap", src_comp=[1, 1, 1, 1], dest_comp=1)
-intrinsic("ssbo_atomic_fadd", src_comp=[1, 1, 1], dest_comp=1)
+intrinsic("ssbo_atomic_fadd", src_comp=[1, 1, 1], dest_comp=1)
+intrinsic("ssbo_atomic_fmin", src_comp=[1, 1, 1], dest_comp=1)
+intrinsic("ssbo_atomic_fmax", src_comp=[1, 1, 1], dest_comp=1)
+intrinsic("ssbo_atomic_fcomp_swap", src_comp=[1, 1, 1, 1], dest_comp=1)
# CS shared variable atomic intrinsics
#
# CS shared variable atomic intrinsics
#
@@
-412,6
+418,9
@@
intrinsic("shared_atomic_xor", src_comp=[1, 1], dest_comp=1, indices=[BASE])
intrinsic("shared_atomic_exchange", src_comp=[1, 1], dest_comp=1, indices=[BASE])
intrinsic("shared_atomic_comp_swap", src_comp=[1, 1, 1], dest_comp=1, indices=[BASE])
intrinsic("shared_atomic_fadd", src_comp=[1, 1], dest_comp=1, indices=[BASE])
intrinsic("shared_atomic_exchange", src_comp=[1, 1], dest_comp=1, indices=[BASE])
intrinsic("shared_atomic_comp_swap", src_comp=[1, 1, 1], dest_comp=1, indices=[BASE])
intrinsic("shared_atomic_fadd", src_comp=[1, 1], dest_comp=1, indices=[BASE])
+intrinsic("shared_atomic_fmin", src_comp=[1, 1], dest_comp=1, indices=[BASE])
+intrinsic("shared_atomic_fmax", src_comp=[1, 1], dest_comp=1, indices=[BASE])
+intrinsic("shared_atomic_fcomp_swap", src_comp=[1, 1, 1], dest_comp=1, indices=[BASE])
def system_value(name, dest_comp, indices=[]):
intrinsic("load_" + name, [], dest_comp, indices,
def system_value(name, dest_comp, indices=[]):
intrinsic("load_" + name, [], dest_comp, indices,
diff --git
a/src/compiler/nir/nir_lower_atomics_to_ssbo.c
b/src/compiler/nir/nir_lower_atomics_to_ssbo.c
index 72686624329e5db8be048be08cae0a89f82afc84..c165a03b141e1a870ac5d4dc5fa6be02a860a640 100644
(file)
--- a/
src/compiler/nir/nir_lower_atomics_to_ssbo.c
+++ b/
src/compiler/nir/nir_lower_atomics_to_ssbo.c
@@
-58,6
+58,9
@@
lower_instr(nir_intrinsic_instr *instr, unsigned ssbo_offset, nir_builder *b)
case nir_intrinsic_ssbo_atomic_exchange:
case nir_intrinsic_ssbo_atomic_comp_swap:
case nir_intrinsic_ssbo_atomic_fadd:
case nir_intrinsic_ssbo_atomic_exchange:
case nir_intrinsic_ssbo_atomic_comp_swap:
case nir_intrinsic_ssbo_atomic_fadd:
+ case nir_intrinsic_ssbo_atomic_fmin:
+ case nir_intrinsic_ssbo_atomic_fmax:
+ case nir_intrinsic_ssbo_atomic_fcomp_swap:
case nir_intrinsic_store_ssbo:
case nir_intrinsic_load_ssbo:
case nir_intrinsic_get_buffer_size:
case nir_intrinsic_store_ssbo:
case nir_intrinsic_load_ssbo:
case nir_intrinsic_get_buffer_size:
@@
-140,7
+143,8
@@
lower_instr(nir_intrinsic_instr *instr, unsigned ssbo_offset, nir_builder *b)
new_instr->src[0] = nir_src_for_ssa(buffer);
nir_src_copy(&new_instr->src[1], &instr->src[0], new_instr);
nir_src_copy(&new_instr->src[2], &instr->src[1], new_instr);
new_instr->src[0] = nir_src_for_ssa(buffer);
nir_src_copy(&new_instr->src[1], &instr->src[0], new_instr);
nir_src_copy(&new_instr->src[2], &instr->src[1], new_instr);
- if (op == nir_intrinsic_ssbo_atomic_comp_swap)
+ if (op == nir_intrinsic_ssbo_atomic_comp_swap ||
+ op == nir_intrinsic_ssbo_atomic_fcomp_swap)
nir_src_copy(&new_instr->src[3], &instr->src[2], new_instr);
break;
}
nir_src_copy(&new_instr->src[3], &instr->src[2], new_instr);
break;
}
diff --git
a/src/compiler/nir/nir_lower_io.c
b/src/compiler/nir/nir_lower_io.c
index 3d4451e36024d4e6e3dc114458b182da953fe868..c418433aa528514ffbdbb6b307efe6b83e7fe679 100644
(file)
--- a/
src/compiler/nir/nir_lower_io.c
+++ b/
src/compiler/nir/nir_lower_io.c
@@
-281,6
+281,9
@@
lower_atomic(nir_intrinsic_instr *intrin, struct lower_io_state *state,
OP(atomic_or)
OP(atomic_xor)
OP(atomic_fadd)
OP(atomic_or)
OP(atomic_xor)
OP(atomic_fadd)
+ OP(atomic_fmin)
+ OP(atomic_fmax)
+ OP(atomic_fcomp_swap)
#undef OP
default:
unreachable("Invalid atomic");
#undef OP
default:
unreachable("Invalid atomic");
@@
-382,6
+385,9
@@
nir_lower_io_block(nir_block *block,
case nir_intrinsic_deref_atomic_exchange:
case nir_intrinsic_deref_atomic_comp_swap:
case nir_intrinsic_deref_atomic_fadd:
case nir_intrinsic_deref_atomic_exchange:
case nir_intrinsic_deref_atomic_comp_swap:
case nir_intrinsic_deref_atomic_fadd:
+ case nir_intrinsic_deref_atomic_fmin:
+ case nir_intrinsic_deref_atomic_fmax:
+ case nir_intrinsic_deref_atomic_fcomp_swap:
/* We can lower the io for this nir instrinsic */
break;
case nir_intrinsic_interp_deref_at_centroid:
/* We can lower the io for this nir instrinsic */
break;
case nir_intrinsic_interp_deref_at_centroid:
@@
-444,6
+450,9
@@
nir_lower_io_block(nir_block *block,
case nir_intrinsic_deref_atomic_exchange:
case nir_intrinsic_deref_atomic_comp_swap:
case nir_intrinsic_deref_atomic_fadd:
case nir_intrinsic_deref_atomic_exchange:
case nir_intrinsic_deref_atomic_comp_swap:
case nir_intrinsic_deref_atomic_fadd:
+ case nir_intrinsic_deref_atomic_fmin:
+ case nir_intrinsic_deref_atomic_fmax:
+ case nir_intrinsic_deref_atomic_fcomp_swap:
assert(vertex_index == NULL);
replacement = lower_atomic(intrin, state, var, offset);
break;
assert(vertex_index == NULL);
replacement = lower_atomic(intrin, state, var, offset);
break;