summaryrefslogtreecommitdiff
path: root/src/gallium/drivers/nouveau/codegen
diff options
context:
space:
mode:
authorM Henning <drawoc@darkrefraction.com>2021-03-26 13:06:58 -0700
committerM Henning <drawoc@darkrefraction.com>2021-07-18 12:56:46 -0400
commit8413c57a3ffe2ea2d4bedd9efe5524686720495f (patch)
tree3f931c1b7cbd6fa807513ff18bf03e0799e56f84 /src/gallium/drivers/nouveau/codegen
parent57dcfb4e55346ee2d7e3da79e93a7d36a8a5ca17 (diff)
nouveau: Support nir_intrinsic_*_atomic_fadd
This fixes failures in piglit's nv_shader_atomic_float tests with NV50_PROG_USE_NIR=1 Reviewed-by: Karol Herbst <kherbst@redhat.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9866>
Diffstat (limited to 'src/gallium/drivers/nouveau/codegen')
-rw-r--r--src/gallium/drivers/nouveau/codegen/nv50_ir_from_nir.cpp36
1 files changed, 26 insertions, 10 deletions
diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_from_nir.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_from_nir.cpp
index 59c0ed89eb6..d6dcc6b11af 100644
--- a/src/gallium/drivers/nouveau/codegen/nv50_ir_from_nir.cpp
+++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_from_nir.cpp
@@ -132,7 +132,6 @@ private:
DataType getDType(nir_alu_instr *);
DataType getDType(nir_intrinsic_instr *);
- DataType getDType(nir_intrinsic_instr *, bool isSigned);
DataType getDType(nir_op, uint8_t);
DataFile getFile(nir_intrinsic_op);
@@ -271,29 +270,33 @@ Converter::getDType(nir_alu_instr *insn)
DataType
Converter::getDType(nir_intrinsic_instr *insn)
{
- bool isSigned;
+ bool isFloat, isSigned;
switch (insn->intrinsic) {
+ case nir_intrinsic_bindless_image_atomic_fadd:
+ case nir_intrinsic_global_atomic_fadd:
+ case nir_intrinsic_image_atomic_fadd:
+ case nir_intrinsic_shared_atomic_fadd:
+ case nir_intrinsic_ssbo_atomic_fadd:
+ isFloat = true;
+ isSigned = false;
+ break;
case nir_intrinsic_shared_atomic_imax:
case nir_intrinsic_shared_atomic_imin:
case nir_intrinsic_ssbo_atomic_imax:
case nir_intrinsic_ssbo_atomic_imin:
+ isFloat = false;
isSigned = true;
break;
default:
+ isFloat = false;
isSigned = false;
break;
}
- return getDType(insn, isSigned);
-}
-
-DataType
-Converter::getDType(nir_intrinsic_instr *insn, bool isSigned)
-{
if (insn->dest.is_ssa)
- return typeOfSize(insn->dest.ssa.bit_size / 8, false, isSigned);
+ return typeOfSize(insn->dest.ssa.bit_size / 8, isFloat, isSigned);
else
- return typeOfSize(insn->dest.reg.reg->bit_size / 8, false, isSigned);
+ return typeOfSize(insn->dest.reg.reg->bit_size / 8, isFloat, isSigned);
}
DataType
@@ -615,6 +618,12 @@ Converter::getSubOp(nir_intrinsic_op op)
case nir_intrinsic_shared_atomic_add:
case nir_intrinsic_ssbo_atomic_add:
return NV50_IR_SUBOP_ATOM_ADD;
+ case nir_intrinsic_bindless_image_atomic_fadd:
+ case nir_intrinsic_global_atomic_fadd:
+ case nir_intrinsic_image_atomic_fadd:
+ case nir_intrinsic_shared_atomic_fadd:
+ case nir_intrinsic_ssbo_atomic_fadd:
+ return NV50_IR_SUBOP_ATOM_ADD;
case nir_intrinsic_bindless_image_atomic_and:
case nir_intrinsic_global_atomic_and:
case nir_intrinsic_image_atomic_and:
@@ -2042,6 +2051,7 @@ Converter::visit(nir_intrinsic_instr *insn)
break;
}
case nir_intrinsic_shared_atomic_add:
+ case nir_intrinsic_shared_atomic_fadd:
case nir_intrinsic_shared_atomic_and:
case nir_intrinsic_shared_atomic_comp_swap:
case nir_intrinsic_shared_atomic_exchange:
@@ -2064,6 +2074,7 @@ Converter::visit(nir_intrinsic_instr *insn)
break;
}
case nir_intrinsic_ssbo_atomic_add:
+ case nir_intrinsic_ssbo_atomic_fadd:
case nir_intrinsic_ssbo_atomic_and:
case nir_intrinsic_ssbo_atomic_comp_swap:
case nir_intrinsic_ssbo_atomic_exchange:
@@ -2093,6 +2104,7 @@ Converter::visit(nir_intrinsic_instr *insn)
break;
}
case nir_intrinsic_global_atomic_add:
+ case nir_intrinsic_global_atomic_fadd:
case nir_intrinsic_global_atomic_and:
case nir_intrinsic_global_atomic_comp_swap:
case nir_intrinsic_global_atomic_exchange:
@@ -2119,6 +2131,7 @@ Converter::visit(nir_intrinsic_instr *insn)
break;
}
case nir_intrinsic_bindless_image_atomic_add:
+ case nir_intrinsic_bindless_image_atomic_fadd:
case nir_intrinsic_bindless_image_atomic_and:
case nir_intrinsic_bindless_image_atomic_comp_swap:
case nir_intrinsic_bindless_image_atomic_exchange:
@@ -2135,6 +2148,7 @@ Converter::visit(nir_intrinsic_instr *insn)
case nir_intrinsic_bindless_image_size:
case nir_intrinsic_bindless_image_store:
case nir_intrinsic_image_atomic_add:
+ case nir_intrinsic_image_atomic_fadd:
case nir_intrinsic_image_atomic_and:
case nir_intrinsic_image_atomic_comp_swap:
case nir_intrinsic_image_atomic_exchange:
@@ -2172,6 +2186,7 @@ Converter::visit(nir_intrinsic_instr *insn)
bool bindless = false;
switch (op) {
case nir_intrinsic_bindless_image_atomic_add:
+ case nir_intrinsic_bindless_image_atomic_fadd:
case nir_intrinsic_bindless_image_atomic_and:
case nir_intrinsic_bindless_image_atomic_comp_swap:
case nir_intrinsic_bindless_image_atomic_exchange:
@@ -2189,6 +2204,7 @@ Converter::visit(nir_intrinsic_instr *insn)
mask = 0x1;
break;
case nir_intrinsic_image_atomic_add:
+ case nir_intrinsic_image_atomic_fadd:
case nir_intrinsic_image_atomic_and:
case nir_intrinsic_image_atomic_comp_swap:
case nir_intrinsic_image_atomic_exchange: