diff options
author | Qiang Yu <yuq825@gmail.com> | 2017-10-24 15:07:15 +0800 |
---|---|---|
committer | Qiang Yu <yuq825@gmail.com> | 2017-10-24 15:21:59 +0800 |
commit | 73dcbde22ae244390545a5a027f28018a46dd135 (patch) | |
tree | dce80ebbabcbacf49f02a0e3b46eb05817964ca3 | |
parent | 4b1d212cb4628f4bbb8c205b17257768ce029aad (diff) |
lima/gpir: add rsqrt support
Signed-off-by: Qiang Yu <yuq825@gmail.com>
-rw-r--r-- | src/gallium/drivers/lima/ir/gp/codegen.c | 4 | ||||
-rw-r--r-- | src/gallium/drivers/lima/ir/gp/lower.c | 19 | ||||
-rw-r--r-- | src/gallium/drivers/lima/ir/gp/nir.c | 1 | ||||
-rw-r--r-- | src/gallium/drivers/lima/ir/gp/node.c | 1 |
4 files changed, 22 insertions, 3 deletions
diff --git a/src/gallium/drivers/lima/ir/gp/codegen.c b/src/gallium/drivers/lima/ir/gp/codegen.c index 67b8c3ebbc..35c852e085 100644 --- a/src/gallium/drivers/lima/ir/gp/codegen.c +++ b/src/gallium/drivers/lima/ir/gp/codegen.c @@ -272,6 +272,7 @@ static void gpir_codegen_complex_slot(gpir_codegen_instr *code, gpir_instr *inst switch (node->op) { case gpir_op_mov: case gpir_op_rcp_impl: + case gpir_op_rsqrt_impl: { gpir_alu_node *alu = gpir_node_to_alu(node); code->complex_src = gpir_get_alu_input(node, alu->children[0]); @@ -288,6 +289,9 @@ static void gpir_codegen_complex_slot(gpir_codegen_instr *code, gpir_instr *inst case gpir_op_rcp_impl: code->complex_op = gpir_codegen_complex_op_rcp; break; + case gpir_op_rsqrt_impl: + code->complex_op = gpir_codegen_complex_op_rsqrt; + break; default: assert(0); } diff --git a/src/gallium/drivers/lima/ir/gp/lower.c b/src/gallium/drivers/lima/ir/gp/lower.c index dff5f21f64..98d72b6a5c 100644 --- a/src/gallium/drivers/lima/ir/gp/lower.c +++ b/src/gallium/drivers/lima/ir/gp/lower.c @@ -135,7 +135,7 @@ static bool gpir_lower_neg(gpir_block *block, gpir_node *node) return true; } -static bool gpir_lower_rcp(gpir_block *block, gpir_node *node) +static bool gpir_lower_complex(gpir_block *block, gpir_node *node) { gpir_alu_node *alu = gpir_node_to_alu(node); gpir_node *child = alu->children[0]; @@ -148,7 +148,19 @@ static bool gpir_lower_rcp(gpir_block *block, gpir_node *node) gpir_node_add_child(&complex2->node, child); list_addtail(&complex2->node.list, &node->list); - gpir_alu_node *impl = gpir_node_create(block->comp, gpir_op_rcp_impl, -1); + int impl_op = 0; + switch (node->op) { + case gpir_op_rcp: + impl_op = gpir_op_rcp_impl; + break; + case gpir_op_rsqrt: + impl_op = gpir_op_rsqrt_impl; + break; + default: + assert(0); + } + + gpir_alu_node *impl = gpir_node_create(block->comp, impl_op, -1); if (!impl) return false; impl->children[0] = child; @@ -170,7 +182,8 @@ static bool gpir_lower_rcp(gpir_block *block, gpir_node *node) static bool (*gpir_lower_funcs[gpir_op_num])(gpir_block *, gpir_node *) = { [gpir_op_neg] = gpir_lower_neg, - [gpir_op_rcp] = gpir_lower_rcp, + [gpir_op_rcp] = gpir_lower_complex, + [gpir_op_rsqrt] = gpir_lower_complex, }; bool gpir_lower_prog(gpir_compiler *comp) diff --git a/src/gallium/drivers/lima/ir/gp/nir.c b/src/gallium/drivers/lima/ir/gp/nir.c index ff067f6eae..43961a2891 100644 --- a/src/gallium/drivers/lima/ir/gp/nir.c +++ b/src/gallium/drivers/lima/ir/gp/nir.c @@ -74,6 +74,7 @@ static int nir_to_gpir_opcodes[nir_num_opcodes] = { [nir_op_fadd] = gpir_op_add, [nir_op_fneg] = gpir_op_neg, [nir_op_frcp] = gpir_op_rcp, + [nir_op_frsq] = gpir_op_rsqrt, }; static gpir_node *gpir_emit_alu(gpir_compiler *comp, nir_alu_instr *instr) diff --git a/src/gallium/drivers/lima/ir/gp/node.c b/src/gallium/drivers/lima/ir/gp/node.c index d84b103081..0e6b90e811 100644 --- a/src/gallium/drivers/lima/ir/gp/node.c +++ b/src/gallium/drivers/lima/ir/gp/node.c @@ -114,6 +114,7 @@ const gpir_op_info gpir_op_infos[] = { }, [gpir_op_rsqrt_impl] = { .name = "rsqrt_impl", + .slots = (int []) { GPIR_INSTR_SLOT_COMPLEX, GPIR_INSTR_SLOT_END }, }, [gpir_op_load_uniform] = { .name = "ld_uni", |