OSDN Git Service

anv,nir: Lower quad_broadcast with dynamic index in NIR
authorJason Ekstrand <jason@jlekstrand.net>
Mon, 16 Dec 2019 16:43:18 +0000 (10:43 -0600)
committerJason Ekstrand <jason@jlekstrand.net>
Wed, 15 Jan 2020 14:34:57 +0000 (08:34 -0600)
This is required for the subgroupBroadcastDynamicId feature that was
added in Vulkan 1.2.

Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
src/compiler/nir/nir.h
src/compiler/nir/nir_lower_subgroups.c
src/intel/compiler/brw_nir.c

index a8e4184..0ac3f45 100644 (file)
@@ -3839,6 +3839,7 @@ typedef struct nir_lower_subgroups_options {
    bool lower_shuffle:1;
    bool lower_shuffle_to_32bit:1;
    bool lower_quad:1;
+   bool lower_quad_broadcast_dynamic:1;
 } nir_lower_subgroups_options;
 
 bool nir_lower_subgroups(nir_shader *shader,
index 249d5e4..4462c70 100644 (file)
@@ -473,7 +473,10 @@ lower_subgroups_instr(nir_builder *b, nir_instr *instr, void *_options)
    case nir_intrinsic_quad_swap_horizontal:
    case nir_intrinsic_quad_swap_vertical:
    case nir_intrinsic_quad_swap_diagonal:
-      if (options->lower_quad)
+      if (options->lower_quad ||
+          (options->lower_quad_broadcast_dynamic &&
+           intrin->intrinsic == nir_intrinsic_quad_broadcast &&
+           !nir_src_is_const(intrin->src[1])))
          return lower_shuffle(b, intrin, options->lower_to_scalar, false);
       else if (options->lower_to_scalar && intrin->num_components > 1)
          return lower_subgroup_op_to_scalar(b, intrin, false);
index 9db35ea..e29398d 100644 (file)
@@ -713,6 +713,7 @@ brw_preprocess_nir(const struct brw_compiler *compiler, nir_shader *nir,
       .lower_to_scalar = true,
       .lower_vote_trivial = !is_scalar,
       .lower_shuffle = true,
+      .lower_quad_broadcast_dynamic = true,
    };
    OPT(nir_lower_subgroups, &subgroups_options);