[Mesa-dev] [PATCH v2] nir: Allow to skip integer ops in nir_lower_to_source_mods
Jason Ekstrand
jason at jlekstrand.net
Tue Nov 13 21:58:28 UTC 2018
Looks correct.
Reviewed-by: Jason Ekstrand <jason at jlekstrand.net>
On Mon, Nov 12, 2018 at 2:17 AM Gert Wollny <gw.fossdev at gmail.com> wrote:
> From: Gert Wollny <gert.wollny at collabora.com>
>
> Some hardware supports source mods only for float operations. Make it
> possible to skip lowering to source mods in these cases.
>
> v2: use option flags instead of a boolean (Jason Ekstrand)
>
> Signed-off-by: Gert Wollny <gert.wollny at collabora.com>
> ---
> src/compiler/nir/nir.h | 10 ++-
> src/compiler/nir/nir_lower_to_source_mods.c | 78 +++++++++++++--------
> src/intel/compiler/brw_nir.c | 2 +-
> 3 files changed, 58 insertions(+), 32 deletions(-)
>
> diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h
> index dc3c729dee..c4601ed218 100644
> --- a/src/compiler/nir/nir.h
> +++ b/src/compiler/nir/nir.h
> @@ -3013,7 +3013,15 @@ typedef struct nir_lower_bitmap_options {
> void nir_lower_bitmap(nir_shader *shader, const nir_lower_bitmap_options
> *options);
>
> bool nir_lower_atomics_to_ssbo(nir_shader *shader, unsigned ssbo_offset);
> -bool nir_lower_to_source_mods(nir_shader *shader);
> +
> +typedef enum {
> + nir_lower_int_source_mods = 1 << 0,
> + nir_lower_float_source_mods = 1 << 1,
> + nir_lower_all_source_mods = (1 << 2) - 1
> +} nir_lower_to_source_mods_flags;
> +
> +
> +bool nir_lower_to_source_mods(nir_shader *shader,
> nir_lower_to_source_mods_flags options);
>
> bool nir_lower_gs_intrinsics(nir_shader *shader);
>
> diff --git a/src/compiler/nir/nir_lower_to_source_mods.c
> b/src/compiler/nir/nir_lower_to_source_mods.c
> index 077ca53704..657bf8a3d7 100644
> --- a/src/compiler/nir/nir_lower_to_source_mods.c
> +++ b/src/compiler/nir/nir_lower_to_source_mods.c
> @@ -34,7 +34,8 @@
> */
>
> static bool
> -nir_lower_to_source_mods_block(nir_block *block)
> +nir_lower_to_source_mods_block(nir_block *block,
> + nir_lower_to_source_mods_flags options)
> {
> bool progress = false;
>
> @@ -58,10 +59,14 @@ nir_lower_to_source_mods_block(nir_block *block)
>
> switch
> (nir_alu_type_get_base_type(nir_op_infos[alu->op].input_types[i])) {
> case nir_type_float:
> + if (!(options & nir_lower_float_source_mods))
> + continue;
> if (parent->op != nir_op_fmov)
> continue;
> break;
> case nir_type_int:
> + if (!(options & nir_lower_int_source_mods))
> + continue;
> if (parent->op != nir_op_imov)
> continue;
> break;
> @@ -97,33 +102,41 @@ nir_lower_to_source_mods_block(nir_block *block)
> progress = true;
> }
>
> - switch (alu->op) {
> - case nir_op_fsat:
> - alu->op = nir_op_fmov;
> - alu->dest.saturate = true;
> - break;
> - case nir_op_ineg:
> - alu->op = nir_op_imov;
> - alu->src[0].negate = !alu->src[0].negate;
> - break;
> - case nir_op_fneg:
> - alu->op = nir_op_fmov;
> - alu->src[0].negate = !alu->src[0].negate;
> - break;
> - case nir_op_iabs:
> - alu->op = nir_op_imov;
> - alu->src[0].abs = true;
> - alu->src[0].negate = false;
> - break;
> - case nir_op_fabs:
> - alu->op = nir_op_fmov;
> - alu->src[0].abs = true;
> - alu->src[0].negate = false;
> - break;
> - default:
> - break;
> + if (options & nir_lower_float_source_mods) {
> + switch (alu->op) {
> + case nir_op_fsat:
> + alu->op = nir_op_fmov;
> + alu->dest.saturate = true;
> + break;
> + case nir_op_fneg:
> + alu->op = nir_op_fmov;
> + alu->src[0].negate = !alu->src[0].negate;
> + break;
> + case nir_op_fabs:
> + alu->op = nir_op_fmov;
> + alu->src[0].abs = true;
> + alu->src[0].negate = false;
> + break;
> + default:
> + break;
> + }
> }
>
> + if (options & nir_lower_int_source_mods) {
> + switch (alu->op) {
> + case nir_op_ineg:
> + alu->op = nir_op_imov;
> + alu->src[0].negate = !alu->src[0].negate;
> + break;
> + case nir_op_iabs:
> + alu->op = nir_op_imov;
> + alu->src[0].abs = true;
> + alu->src[0].negate = false;
> + break;
> + default:
> + break;
> + }
> + }
> /* We've covered sources. Now we're going to try and saturate the
> * destination if we can.
> */
> @@ -136,6 +149,9 @@ nir_lower_to_source_mods_block(nir_block *block)
> nir_type_float)
> continue;
>
> + if (!(options & nir_lower_float_source_mods))
> + continue;
> +
> if (!list_empty(&alu->dest.dest.ssa.if_uses))
> continue;
>
> @@ -185,12 +201,13 @@ nir_lower_to_source_mods_block(nir_block *block)
> }
>
> static bool
> -nir_lower_to_source_mods_impl(nir_function_impl *impl)
> +nir_lower_to_source_mods_impl(nir_function_impl *impl,
> + nir_lower_to_source_mods_flags options)
> {
> bool progress = false;
>
> nir_foreach_block(block, impl) {
> - progress |= nir_lower_to_source_mods_block(block);
> + progress |= nir_lower_to_source_mods_block(block, options);
> }
>
> if (progress)
> @@ -201,13 +218,14 @@ nir_lower_to_source_mods_impl(nir_function_impl
> *impl)
> }
>
> bool
> -nir_lower_to_source_mods(nir_shader *shader)
> +nir_lower_to_source_mods(nir_shader *shader,
> + nir_lower_to_source_mods_flags options)
> {
> bool progress = false;
>
> nir_foreach_function(function, shader) {
> if (function->impl) {
> - progress |= nir_lower_to_source_mods_impl(function->impl);
> + progress |= nir_lower_to_source_mods_impl(function->impl,
> options);
> }
> }
>
> diff --git a/src/intel/compiler/brw_nir.c b/src/intel/compiler/brw_nir.c
> index cf5a4a96d6..eb37f739f7 100644
> --- a/src/intel/compiler/brw_nir.c
> +++ b/src/intel/compiler/brw_nir.c
> @@ -793,7 +793,7 @@ brw_postprocess_nir(nir_shader *nir, const struct
> brw_compiler *compiler,
>
> OPT(nir_opt_algebraic_late);
>
> - OPT(nir_lower_to_source_mods);
> + OPT(nir_lower_to_source_mods, nir_lower_all_source_mods);
> OPT(nir_copy_prop);
> OPT(nir_opt_dce);
> OPT(nir_opt_move_comparisons);
> --
> 2.18.1
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20181113/fe4b99e3/attachment-0001.html>
More information about the mesa-dev
mailing list