From: Christian Gmeiner Date: Wed, 19 Jul 2023 08:35:39 +0000 (+0200) Subject: etnaviv: extend etna_pass_flags with source modifiers X-Git-Tag: upstream/23.3.3~5159 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=8d89e78cf5ba80508b352c1225bf3e8e409d6b1a;p=platform%2Fupstream%2Fmesa.git etnaviv: extend etna_pass_flags with source modifiers As nir_lower_to_source_mods(..) will be deleted and with it the modifier storage in nir's core we need to find an other way store the information. We have have 6 bits left in nir's pass_flags - so lets go that route. This also adds some small helpers that will be used later. Signed-off-by: Christian Gmeiner Acked-by: Alyssa Rosenzweig Acked-by: Yonggang Luo Reviewed-by: Lucas Stach Part-of: --- diff --git a/src/gallium/drivers/etnaviv/etnaviv_compiler_nir.h b/src/gallium/drivers/etnaviv/etnaviv_compiler_nir.h index 3cf0127..438de6d 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_compiler_nir.h +++ b/src/gallium/drivers/etnaviv/etnaviv_compiler_nir.h @@ -70,17 +70,63 @@ struct etna_compile { enum etna_pass_flags { BYPASS_DST = BITFIELD_BIT(0), BYPASS_SRC = BITFIELD_BIT(1), + + /* source modifier */ + SRC0_MOD_NEG = BITFIELD_BIT(2), + SRC1_MOD_NEG = BITFIELD_BIT(3), + SRC2_MOD_NEG = BITFIELD_BIT(4), + SRC0_MOD_ABS = BITFIELD_BIT(5), + SRC1_MOD_ABS = BITFIELD_BIT(6), + SRC2_MOD_ABS = BITFIELD_BIT(7), }; #define PASS_FLAGS_IS_DEAD_MASK BITFIELD_RANGE(0, 2) +#define PASS_FLAGS_SRC_MOD_NEG_MASK BITFIELD_RANGE(2, 3) +#define PASS_FLAGS_SRC_MOD_ABS_MASK BITFIELD_RANGE(5, 3) -static_assert(PASS_FLAGS_IS_DEAD_MASK == (BYPASS_DST | BYPASS_SRC)); +static_assert(PASS_FLAGS_IS_DEAD_MASK == (BYPASS_DST | BYPASS_SRC), "is_dead_mask is wrong"); +static_assert(PASS_FLAGS_SRC_MOD_NEG_MASK == (SRC0_MOD_NEG | SRC1_MOD_NEG | SRC2_MOD_NEG), "src_mod_neg_mask is wrong"); +static_assert(PASS_FLAGS_SRC_MOD_ABS_MASK == (SRC0_MOD_ABS | SRC1_MOD_ABS | SRC2_MOD_ABS), "src_mod_abs_mask is wrong"); static inline bool is_dead_instruction(nir_instr *instr) { return instr->pass_flags & PASS_FLAGS_IS_DEAD_MASK; } +static inline void set_src_mod_abs(nir_instr *instr, unsigned idx) +{ + assert(idx < 3); + instr->pass_flags |= (SRC0_MOD_ABS << idx); +} + +static inline void set_src_mod_neg(nir_instr *instr, unsigned idx) +{ + assert(idx < 3); + instr->pass_flags |= (SRC0_MOD_NEG << idx); +} + +static inline void toggle_src_mod_neg(nir_instr *instr, unsigned idx) +{ + assert(idx < 3); + instr->pass_flags ^= (SRC0_MOD_NEG << idx); +} + +static inline bool is_src_mod_abs(nir_instr *instr, unsigned idx) +{ + if (idx < 3) + return instr->pass_flags & (SRC0_MOD_ABS << idx); + + return false; +} + +static inline bool is_src_mod_neg(nir_instr *instr, unsigned idx) +{ + if (idx < 3) + return instr->pass_flags & (SRC0_MOD_NEG << idx); + + return false; +} + static inline bool is_sysval(nir_instr *instr) { if (instr->type != nir_instr_type_intrinsic)