freedreno: Remove the Emacs mode lines
[mesa.git] / src / gallium / drivers / freedreno / ir3 / ir3_nir.c
index 2393306e19cbee956273a0ce263e47fc493cd103..d934acc74273d461be17b959b8ea52089267f315 100644 (file)
@@ -1,5 +1,3 @@
-/* -*- mode: C; c-file-style: "k&r"; tab-width 4; indent-tabs-mode: t; -*- */
-
 /*
  * Copyright (C) 2015 Rob Clark <robclark@freedesktop.org>
  *
@@ -35,9 +33,9 @@
 
 #include "nir/tgsi_to_nir.h"
 
+
 static const nir_shader_compiler_options options = {
                .lower_fpow = true,
-               .lower_fsat = true,
                .lower_scmp = true,
                .lower_flrp32 = true,
                .lower_flrp64 = true,
@@ -45,12 +43,14 @@ static const nir_shader_compiler_options options = {
                .lower_fmod32 = true,
                .lower_fmod64 = true,
                .lower_fdiv = true,
+               .lower_ldexp = true,
                .fuse_ffma = true,
                .native_integers = true,
                .vertex_id_zero_based = true,
                .lower_extract_byte = true,
                .lower_extract_word = true,
                .lower_all_io_to_temps = true,
+               .lower_helper_invocation = true,
 };
 
 struct nir_shader *
@@ -92,15 +92,37 @@ ir3_optimize_loop(nir_shader *s)
 
                OPT_V(s, nir_lower_vars_to_ssa);
                progress |= OPT(s, nir_opt_copy_prop_vars);
+               progress |= OPT(s, nir_opt_dead_write_vars);
                progress |= OPT(s, nir_lower_alu_to_scalar);
                progress |= OPT(s, nir_lower_phis_to_scalar);
 
                progress |= OPT(s, nir_copy_prop);
                progress |= OPT(s, nir_opt_dce);
                progress |= OPT(s, nir_opt_cse);
-               progress |= OPT(s, ir3_nir_lower_if_else);
+               static int gcm = -1;
+               if (gcm == -1)
+                       gcm = env2u("GCM");
+               if (gcm == 1)
+                       progress |= OPT(s, nir_opt_gcm, true);
+               else if (gcm == 2)
+                       progress |= OPT(s, nir_opt_gcm, false);
+               progress |= OPT(s, nir_opt_peephole_select, 16);
+               progress |= OPT(s, nir_opt_intrinsics);
                progress |= OPT(s, nir_opt_algebraic);
                progress |= OPT(s, nir_opt_constant_folding);
+               progress |= OPT(s, nir_opt_dead_cf);
+               if (OPT(s, nir_opt_trivial_continues)) {
+                       progress |= true;
+                       /* If nir_opt_trivial_continues makes progress, then we need to clean
+                        * things up if we want any hope of nir_opt_if or nir_opt_loop_unroll
+                        * to make progress.
+                        */
+                       OPT(s, nir_copy_prop);
+                       OPT(s, nir_opt_dce);
+               }
+               progress |= OPT(s, nir_opt_if);
+               progress |= OPT(s, nir_opt_remove_phis);
+               progress |= OPT(s, nir_opt_undef);
 
        } while (progress);
 }
@@ -183,6 +205,8 @@ ir3_optimize_nir(struct ir3_shader *shader, nir_shader *s,
 
        OPT_V(s, nir_remove_dead_variables, nir_var_local);
 
+       OPT_V(s, nir_move_load_const);
+
        if (fd_mesa_debug & FD_DBG_DISASM) {
                debug_printf("----------------------\n");
                nir_print_shader(s, stdout);
@@ -221,12 +245,20 @@ ir3_nir_scan_driver_consts(nir_shader *shader,
                                                layout->ssbo_size.count;
                                        layout->ssbo_size.count += 1; /* one const per */
                                        break;
-                               case nir_intrinsic_image_store:
-                                       idx = intr->variables[0]->var->data.driver_location;
+                               case nir_intrinsic_image_deref_atomic_add:
+                               case nir_intrinsic_image_deref_atomic_min:
+                               case nir_intrinsic_image_deref_atomic_max:
+                               case nir_intrinsic_image_deref_atomic_and:
+                               case nir_intrinsic_image_deref_atomic_or:
+                               case nir_intrinsic_image_deref_atomic_xor:
+                               case nir_intrinsic_image_deref_atomic_exchange:
+                               case nir_intrinsic_image_deref_atomic_comp_swap:
+                               case nir_intrinsic_image_deref_store:
+                                       idx = nir_intrinsic_get_var(intr, 0)->data.driver_location;
                                        if (layout->image_dims.mask & (1 << idx))
                                                break;
                                        layout->image_dims.mask |= (1 << idx);
-                                       layout->ssbo_size.off[idx] =
+                                       layout->image_dims.off[idx] =
                                                layout->image_dims.count;
                                        layout->image_dims.count += 3; /* three const per */
                                        break;