lima/ppir: switch to derivative intrinsics
Signed-off-by: Erico Nunes <nunes.erico@gmail.com> Reviewed-by: Alyssa Rosenzweig <alyssa@rosenzweig.io> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/30661>
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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 *
|
||||
|
||||
Reference in New Issue
Block a user