lima: move pp_max_stack_size to lima_submit
[mesa.git] / src / gallium / drivers / lima / lima_program.c
index 21e64fb6aafcd3fed8b7a41ef0dd804c37a7cdc9..5a743130c51246fa0c963e4bdacc9d9551b67985 100644 (file)
@@ -34,6 +34,7 @@
 
 #include "lima_screen.h"
 #include "lima_context.h"
+#include "lima_submit.h"
 #include "lima_program.h"
 #include "lima_bo.h"
 #include "ir/lima_ir.h"
@@ -43,23 +44,38 @@ 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,
-   .native_integers = true,
+   .lower_bitops = true,
+   .lower_rotate = true,
+   .lower_sincos = true,
+   .lower_fceil = 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,
-   .native_integers = true,
+   .lower_rotate = true,
+   .lower_fdot = true,
+   .lower_fdph = true,
+   .lower_bitops = true,
+   .lower_vector_cmp = true,
+};
+
+static const struct nir_lower_tex_options tex_options = {
+   .lower_txp = ~0u,
 };
 
 const void *
@@ -81,13 +97,14 @@ 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_point_size, 1.0f, 100.0f);
    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,
@@ -97,7 +114,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, 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);
@@ -115,14 +132,69 @@ lima_program_optimize_vs_nir(struct nir_shader *s)
    } while (progress);
 
    NIR_PASS_V(s, nir_lower_int_to_float);
+   /* Run opt_algebraic between int_to_float and bool_to_float because
+    * int_to_float emits ftrunc, and ftrunc lowering generates bool ops
+    */
+   do {
+      progress = false;
+      NIR_PASS(progress, s, nir_opt_algebraic);
+   } while (progress);
+
+   NIR_PASS_V(s, nir_lower_bool_to_float);
+
    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
+static bool
+lima_alu_to_scalar_filter_cb(const nir_instr *instr, const void *data)
+{
+   if (instr->type != nir_instr_type_alu)
+      return false;
+
+   nir_alu_instr *alu = nir_instr_as_alu(instr);
+   switch (alu->op) {
+   case nir_op_frcp:
+   case nir_op_frsq:
+   case nir_op_flog2:
+   case nir_op_fexp2:
+   case nir_op_fsqrt:
+   case nir_op_fsin:
+   case nir_op_fcos:
+      return true;
+   default:
+      break;
+   }
+
+   /* nir vec4 fcsel assumes that each component of the condition will be
+    * used to select the same component from the two options, but Utgard PP
+    * has only 1 component condition. If all condition components are not the
+    * same we need to lower it to scalar.
+    */
+   switch (alu->op) {
+   case nir_op_bcsel:
+   case nir_op_fcsel:
+      break;
+   default:
+      return false;
+   }
+
+   int num_components = nir_dest_num_components(alu->dest.dest);
+
+   uint8_t swizzle = alu->src[0].swizzle[0];
+
+   for (int i = 1; i < num_components; i++)
+      if (alu->src[0].swizzle[i] != swizzle)
+         return true;
+
+   return false;
+}
+
+void
 lima_program_optimize_fs_nir(struct nir_shader *s)
 {
    bool progress;
@@ -130,13 +202,18 @@ lima_program_optimize_fs_nir(struct nir_shader *s)
    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(progress, s, nir_opt_vectorize);
+   } while (progress);
 
    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_phis_to_scalar);
+      NIR_PASS(progress, s, nir_lower_alu_to_scalar, lima_alu_to_scalar_filter_cb, NULL);
       NIR_PASS(progress, s, nir_copy_prop);
       NIR_PASS(progress, s, nir_opt_remove_phis);
       NIR_PASS(progress, s, nir_opt_dce);
@@ -150,9 +227,21 @@ lima_program_optimize_fs_nir(struct nir_shader *s)
                nir_var_shader_in |
                nir_var_shader_out |
                nir_var_function_temp);
+      NIR_PASS(progress, s, lima_nir_split_load_input);
    } 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);
+
+   /* Must be run after optimization loop */
+   NIR_PASS_V(s, lima_nir_scale_trig);
 
    /* Lower modifiers */
    NIR_PASS_V(s, nir_lower_to_source_mods, nir_lower_all_source_mods);
@@ -173,6 +262,7 @@ static void *
 lima_create_fs_state(struct pipe_context *pctx,
                      const struct pipe_shader_state *cso)
 {
+   struct lima_context *ctx = lima_context(pctx);
    struct lima_screen *screen = lima_screen(pctx->screen);
    struct lima_fs_shader_state *so = rzalloc(NULL, struct lima_fs_shader_state);
 
@@ -193,11 +283,13 @@ lima_create_fs_state(struct pipe_context *pctx,
    if (lima_debug & LIMA_DEBUG_PP)
       nir_print_shader(nir, stdout);
 
-   if (!ppir_compile_nir(so, nir, screen->pp_ra)) {
+   if (!ppir_compile_nir(so, nir, screen->pp_ra, &ctx->debug)) {
       ralloc_free(so);
       return NULL;
    }
 
+   so->uses_discard = nir->info.fs.uses_discard;
+
    return so;
 }
 
@@ -216,7 +308,7 @@ lima_delete_fs_state(struct pipe_context *pctx, void *hwcso)
    struct lima_fs_shader_state *so = hwcso;
 
    if (so->bo)
-      lima_bo_free(so->bo);
+      lima_bo_unreference(so->bo);
 
    ralloc_free(so);
 }
@@ -258,6 +350,9 @@ lima_update_fs_state(struct lima_context *ctx)
       fs->shader = NULL;
    }
 
+   struct lima_submit *submit = lima_submit_get(ctx);
+   submit->pp_max_stack_size = MAX2(submit->pp_max_stack_size, ctx->fs->stack_size);
+
    return true;
 }
 
@@ -265,6 +360,7 @@ static void *
 lima_create_vs_state(struct pipe_context *pctx,
                      const struct pipe_shader_state *cso)
 {
+   struct lima_context *ctx = lima_context(pctx);
    struct lima_vs_shader_state *so = rzalloc(NULL, struct lima_vs_shader_state);
 
    if (!so)
@@ -284,11 +380,13 @@ lima_create_vs_state(struct pipe_context *pctx,
    if (lima_debug & LIMA_DEBUG_GP)
       nir_print_shader(nir, stdout);
 
-   if (!gpir_compile_nir(so, nir)) {
+   if (!gpir_compile_nir(so, nir, &ctx->debug)) {
       ralloc_free(so);
       return NULL;
    }
 
+   ralloc_free(nir);
+
    return so;
 }
 
@@ -307,7 +405,7 @@ lima_delete_vs_state(struct pipe_context *pctx, void *hwcso)
    struct lima_vs_shader_state *so = hwcso;
 
    if (so->bo)
-      lima_bo_free(so->bo);
+      lima_bo_unreference(so->bo);
 
    ralloc_free(so);
 }