lima: re-run nir_opt_algebraic after int lowering
[mesa.git] / src / gallium / drivers / lima / lima_program.c
index 1b6d65a2dbad4c417ac0c78472c992710bf88423..66962e5ce238d9f5ce8a6093e9571089d2476210 100644 (file)
@@ -43,20 +43,35 @@ static const nir_shader_compiler_options vs_nir_options = {
    .lower_fpow = true,
    .lower_ffract = true,
    .lower_fdiv = true,
+   .lower_fmod = true,
    .lower_fsqrt = true,
    .lower_sub = true,
    .lower_flrp32 = true,
    .lower_flrp64 = true,
+   .lower_ftrunc = true,
    /* could be implemented by clamp */
    .lower_fsat = true,
+   .lower_bitops = true,
+   .lower_rotate = true,
+   .lower_sincos = true,
 };
 
 static const nir_shader_compiler_options fs_nir_options = {
+   .lower_ffma = true,
    .lower_fpow = true,
    .lower_fdiv = true,
+   .lower_fmod = true,
    .lower_sub = true,
    .lower_flrp32 = true,
    .lower_flrp64 = true,
+   .lower_fsign = true,
+   .lower_rotate = true,
+   .lower_fdot = true,
+   .lower_bitops = true,
+};
+
+static const struct nir_lower_tex_options tex_options = {
+   .lower_txp = ~0u,
 };
 
 const void *
@@ -73,18 +88,18 @@ lima_program_get_compiler_options(enum pipe_shader_type shader)
 }
 
 static int
-type_size(const struct glsl_type *type)
+type_size(const struct glsl_type *type, bool bindless)
 {
    return glsl_count_attribute_slots(type, false);
 }
 
-static void
+void
 lima_program_optimize_vs_nir(struct nir_shader *s)
 {
    bool progress;
 
+   NIR_PASS_V(s, nir_lower_viewport_transform);
    NIR_PASS_V(s, nir_lower_io, nir_var_all, type_size, 0);
-   NIR_PASS_V(s, nir_lower_regs_to_ssa);
    NIR_PASS_V(s, nir_lower_load_const_to_scalar);
    NIR_PASS_V(s, lima_nir_lower_uniform_to_scalar);
    NIR_PASS_V(s, nir_lower_io_to_scalar,
@@ -94,7 +109,7 @@ lima_program_optimize_vs_nir(struct nir_shader *s)
       progress = false;
 
       NIR_PASS_V(s, nir_lower_vars_to_ssa);
-      NIR_PASS(progress, s, nir_lower_alu_to_scalar);
+      NIR_PASS(progress, s, nir_lower_alu_to_scalar, NULL);
       NIR_PASS(progress, s, nir_lower_phis_to_scalar);
       NIR_PASS(progress, s, nir_copy_prop);
       NIR_PASS(progress, s, nir_opt_remove_phis);
@@ -111,25 +126,48 @@ lima_program_optimize_vs_nir(struct nir_shader *s)
                nir_var_function_temp);
    } while (progress);
 
+   NIR_PASS_V(s, nir_lower_int_to_float);
+   NIR_PASS_V(s, nir_lower_bool_to_float);
+
+   /* Some ops must be lowered after being converted from int ops,
+    * so re-run nir_opt_algebraic after int lowering. */
+   do {
+      progress = false;
+      NIR_PASS(progress, s, nir_opt_algebraic);
+   } while (progress);
+
+   NIR_PASS_V(s, nir_copy_prop);
+   NIR_PASS_V(s, nir_opt_dce);
    NIR_PASS_V(s, nir_lower_locals_to_regs);
    NIR_PASS_V(s, nir_convert_from_ssa, true);
    NIR_PASS_V(s, nir_remove_dead_variables, nir_var_function_temp);
    nir_sweep(s);
 }
 
-static void
+void
 lima_program_optimize_fs_nir(struct nir_shader *s)
 {
+   BITSET_DECLARE(alu_lower, nir_num_opcodes) = {0};
    bool progress;
 
+   BITSET_SET(alu_lower, nir_op_frcp);
+   BITSET_SET(alu_lower, nir_op_frsq);
+   BITSET_SET(alu_lower, nir_op_flog2);
+   BITSET_SET(alu_lower, nir_op_fexp2);
+   BITSET_SET(alu_lower, nir_op_fsqrt);
+   BITSET_SET(alu_lower, nir_op_fsin);
+   BITSET_SET(alu_lower, nir_op_fcos);
+
+   NIR_PASS_V(s, nir_lower_fragcoord_wtrans);
    NIR_PASS_V(s, nir_lower_io, nir_var_all, type_size, 0);
    NIR_PASS_V(s, nir_lower_regs_to_ssa);
+   NIR_PASS_V(s, nir_lower_tex, &tex_options);
 
    do {
       progress = false;
 
       NIR_PASS_V(s, nir_lower_vars_to_ssa);
-      //NIR_PASS(progress, s, nir_lower_alu_to_scalar);
+      NIR_PASS(progress, s, nir_lower_alu_to_scalar, alu_lower);
       NIR_PASS(progress, s, nir_lower_phis_to_scalar);
       NIR_PASS(progress, s, nir_copy_prop);
       NIR_PASS(progress, s, nir_opt_remove_phis);
@@ -146,6 +184,16 @@ lima_program_optimize_fs_nir(struct nir_shader *s)
                nir_var_function_temp);
    } while (progress);
 
+   NIR_PASS_V(s, nir_lower_int_to_float);
+   NIR_PASS_V(s, nir_lower_bool_to_float);
+
+   /* Some ops must be lowered after being converted from int ops,
+    * so re-run nir_opt_algebraic after int lowering. */
+   do {
+      progress = false;
+      NIR_PASS(progress, s, nir_opt_algebraic);
+   } while (progress);
+
    /* Lower modifiers */
    NIR_PASS_V(s, nir_lower_to_source_mods, nir_lower_all_source_mods);
    NIR_PASS_V(s, nir_copy_prop);