mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-03 20:48:08 +02:00
nir: add nir_scalar intrinsic helpers
Reviewed-by: Rhys Perry <pendingchaos02@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24656>
This commit is contained in:
parent
1ae3c40732
commit
bce9bba90d
6 changed files with 32 additions and 21 deletions
|
|
@ -257,7 +257,7 @@ can_move_coord(nir_scalar scalar, coord_info *info)
|
|||
if (nir_scalar_is_const(scalar))
|
||||
return true;
|
||||
|
||||
if (scalar.def->parent_instr->type != nir_instr_type_intrinsic)
|
||||
if (!nir_scalar_is_intrinsic(scalar))
|
||||
return false;
|
||||
|
||||
nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(scalar.def->parent_instr);
|
||||
|
|
@ -272,8 +272,8 @@ can_move_coord(nir_scalar scalar, coord_info *info)
|
|||
|
||||
nir_scalar coord_x = nir_scalar_resolved(intrin->src[0].ssa, 0);
|
||||
nir_scalar coord_y = nir_scalar_resolved(intrin->src[0].ssa, 1);
|
||||
if (coord_x.def->parent_instr->type != nir_instr_type_intrinsic || coord_x.comp != 0 ||
|
||||
coord_y.def->parent_instr->type != nir_instr_type_intrinsic || coord_y.comp != 1)
|
||||
if (!nir_scalar_is_intrinsic(coord_x) || coord_x.comp != 0 ||
|
||||
!nir_scalar_is_intrinsic(coord_y) || coord_y.comp != 1)
|
||||
return false;
|
||||
|
||||
nir_intrinsic_instr *intrin_x = nir_instr_as_intrinsic(coord_x.def->parent_instr);
|
||||
|
|
|
|||
|
|
@ -2623,6 +2623,18 @@ nir_scalar_alu_op(nir_scalar s)
|
|||
return nir_instr_as_alu(s.def->parent_instr)->op;
|
||||
}
|
||||
|
||||
static inline bool
|
||||
nir_scalar_is_intrinsic(nir_scalar s)
|
||||
{
|
||||
return s.def->parent_instr->type == nir_instr_type_intrinsic;
|
||||
}
|
||||
|
||||
static inline nir_intrinsic_op
|
||||
nir_scalar_intrinsic_op(nir_scalar s)
|
||||
{
|
||||
return nir_instr_as_intrinsic(s.def->parent_instr)->intrinsic;
|
||||
}
|
||||
|
||||
static inline nir_scalar
|
||||
nir_scalar_chase_alu_src(nir_scalar s, unsigned alu_src_idx)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -31,18 +31,16 @@ static bool
|
|||
src_is_invocation_id(const nir_src *src)
|
||||
{
|
||||
nir_scalar s = nir_scalar_resolved(src->ssa, 0);
|
||||
return s.def->parent_instr->type == nir_instr_type_intrinsic &&
|
||||
nir_instr_as_intrinsic(s.def->parent_instr)->intrinsic ==
|
||||
nir_intrinsic_load_invocation_id;
|
||||
return nir_scalar_is_intrinsic(s) &&
|
||||
nir_scalar_intrinsic_op(s) == nir_intrinsic_load_invocation_id;
|
||||
}
|
||||
|
||||
static bool
|
||||
src_is_local_invocation_index(const nir_src *src)
|
||||
{
|
||||
nir_scalar s = nir_scalar_resolved(src->ssa, 0);
|
||||
return s.def->parent_instr->type == nir_instr_type_intrinsic &&
|
||||
nir_instr_as_intrinsic(s.def->parent_instr)->intrinsic ==
|
||||
nir_intrinsic_load_local_invocation_index;
|
||||
return nir_scalar_is_intrinsic(s) &&
|
||||
nir_scalar_intrinsic_op(s) == nir_intrinsic_load_local_invocation_index;
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
|||
|
|
@ -1408,10 +1408,10 @@ opt_if_rewrite_uniform_uses(nir_builder *b, nir_if *nif, nir_scalar cond, bool a
|
|||
nir_scalar src_uni = nir_scalar_chase_alu_src(cond, i);
|
||||
nir_scalar src_div = nir_scalar_chase_alu_src(cond, !i);
|
||||
|
||||
if (src_uni.def->parent_instr->type == nir_instr_type_load_const && src_div.def != src_uni.def)
|
||||
if (nir_scalar_is_const(src_uni) && src_div.def != src_uni.def)
|
||||
return rewrite_comp_uses_within_if(b, nif, op == nir_op_ine, src_div, src_uni);
|
||||
|
||||
if (src_uni.def->parent_instr->type != nir_instr_type_intrinsic)
|
||||
if (!nir_scalar_is_intrinsic(src_uni))
|
||||
continue;
|
||||
nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(src_uni.def->parent_instr);
|
||||
if (intrin->intrinsic != nir_intrinsic_read_first_invocation &&
|
||||
|
|
|
|||
|
|
@ -119,18 +119,19 @@ get_dim(nir_scalar scalar)
|
|||
if (!scalar.def->divergent)
|
||||
return 0;
|
||||
|
||||
if (scalar.def->parent_instr->type == nir_instr_type_intrinsic) {
|
||||
nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(scalar.def->parent_instr);
|
||||
if (intrin->intrinsic == nir_intrinsic_load_subgroup_invocation)
|
||||
if (nir_scalar_is_intrinsic(scalar)) {
|
||||
switch (nir_scalar_intrinsic_op(scalar)) {
|
||||
case nir_intrinsic_load_subgroup_invocation:
|
||||
return 0x8;
|
||||
else if (intrin->intrinsic == nir_intrinsic_load_local_invocation_index)
|
||||
case nir_intrinsic_load_global_invocation_index:
|
||||
case nir_intrinsic_load_local_invocation_index:
|
||||
return 0x7;
|
||||
else if (intrin->intrinsic == nir_intrinsic_load_local_invocation_id)
|
||||
return 1 << scalar.comp;
|
||||
else if (intrin->intrinsic == nir_intrinsic_load_global_invocation_index)
|
||||
return 0x7;
|
||||
else if (intrin->intrinsic == nir_intrinsic_load_global_invocation_id)
|
||||
case nir_intrinsic_load_global_invocation_id:
|
||||
case nir_intrinsic_load_local_invocation_id:
|
||||
return 1 << scalar.comp;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
} else if (nir_scalar_is_alu(scalar)) {
|
||||
if (nir_scalar_alu_op(scalar) == nir_op_iadd ||
|
||||
nir_scalar_alu_op(scalar) == nir_op_imul) {
|
||||
|
|
|
|||
|
|
@ -1927,7 +1927,7 @@ process_uub_query(struct analysis_state *state, struct analysis_query *aq, uint3
|
|||
*result = bitmask(q.scalar.def->bit_size);
|
||||
if (nir_scalar_is_const(q.scalar))
|
||||
*result = nir_scalar_as_uint(q.scalar);
|
||||
else if (q.scalar.def->parent_instr->type == nir_instr_type_intrinsic)
|
||||
else if (nir_scalar_is_intrinsic(q.scalar))
|
||||
get_intrinsic_uub(state, q, result, src);
|
||||
else if (nir_scalar_is_alu(q.scalar))
|
||||
get_alu_uub(state, q, result, src);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue