diff options
author | M Henning <drawoc@darkrefraction.com> | 2021-03-26 13:06:58 -0700 |
---|---|---|
committer | M Henning <drawoc@darkrefraction.com> | 2021-07-18 12:56:46 -0400 |
commit | 8413c57a3ffe2ea2d4bedd9efe5524686720495f (patch) | |
tree | 3f931c1b7cbd6fa807513ff18bf03e0799e56f84 /src/gallium/drivers/nouveau/codegen | |
parent | 57dcfb4e55346ee2d7e3da79e93a7d36a8a5ca17 (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.cpp | 36 |
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: |