From 749d7e96bf69c1e5eb27dadd3f8f60f524466921 Mon Sep 17 00:00:00 2001 From: Erico Nunes Date: Wed, 14 Aug 2024 01:19:44 +0200 Subject: [PATCH] lima/ppir: switch to derivative intrinsics Signed-off-by: Erico Nunes Reviewed-by: Alyssa Rosenzweig Part-of: --- src/gallium/drivers/lima/ir/pp/nir.c | 34 +++++++++++++++++++++++-- src/gallium/drivers/lima/lima_program.c | 1 + 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/gallium/drivers/lima/ir/pp/nir.c b/src/gallium/drivers/lima/ir/pp/nir.c index f1b8ad61481..286c187275a 100644 --- a/src/gallium/drivers/lima/ir/pp/nir.c +++ b/src/gallium/drivers/lima/ir/pp/nir.c @@ -151,8 +151,6 @@ static int nir_to_ppir_opcodes[nir_num_opcodes] = { [nir_op_inot] = ppir_op_not, [nir_op_ftrunc] = ppir_op_trunc, [nir_op_fsat] = ppir_op_sat, - [nir_op_fddx] = ppir_op_ddx, - [nir_op_fddy] = ppir_op_ddy, [nir_op_fclamp_pos_mali] = ppir_op_clamp_pos, }; @@ -200,6 +198,33 @@ static bool ppir_emit_alu(ppir_block *block, nir_instr *ni) return true; } +static bool ppir_emit_derivative(ppir_block *block, nir_instr *ni, int op) +{ + assert(op == ppir_op_ddx || op == ppir_op_ddy); + + nir_intrinsic_instr *instr = nir_instr_as_intrinsic(ni); + nir_def *def = &instr->def; + + unsigned mask = nir_component_mask(def->num_components); + ppir_alu_node *node = ppir_node_create_dest(block, op, def, mask); + if (!node) + return false; + + ppir_dest *pd = &node->dest; + unsigned src_mask = pd->write_mask; + uint8_t identity[4] = { PIPE_SWIZZLE_X, PIPE_SWIZZLE_Y, + PIPE_SWIZZLE_Z, PIPE_SWIZZLE_W }; + + node->num_src = 1; + nir_src *intr_src = instr->src; + ppir_src *ps = node->src; + memcpy(ps->swizzle, identity, sizeof(identity)); + ppir_node_add_src(block->comp, &node->node, ps, intr_src, src_mask); + + list_addtail(&node->node.list, &block->node_list); + return true; +} + static ppir_block *ppir_block_create(ppir_compiler *comp); static bool ppir_emit_discard_block(ppir_compiler *comp) @@ -416,6 +441,11 @@ static bool ppir_emit_intrinsic(ppir_block *block, nir_instr *ni) list_addtail(&node->list, &block->node_list); return true; + case nir_intrinsic_ddx: + return ppir_emit_derivative(block, ni, ppir_op_ddx); + case nir_intrinsic_ddy: + return ppir_emit_derivative(block, ni, ppir_op_ddy); + default: ppir_error("unsupported nir_intrinsic_instr %s\n", nir_intrinsic_infos[instr->intrinsic].name); diff --git a/src/gallium/drivers/lima/lima_program.c b/src/gallium/drivers/lima/lima_program.c index 985f7d5e138..cf0bd005f92 100644 --- a/src/gallium/drivers/lima/lima_program.c +++ b/src/gallium/drivers/lima/lima_program.c @@ -86,6 +86,7 @@ static const nir_shader_compiler_options fs_nir_options = { .force_indirect_unrolling_sampler = true, .lower_varying_from_uniform = true, .max_unroll_iterations = 32, + .has_ddx_intrinsics = true, }; const void *