v3d: Use nir_lower_io_to_scalar_early to DCE unused VS input components.
authorEric Anholt <eric@anholt.net>
Tue, 18 Sep 2018 17:34:11 +0000 (10:34 -0700)
committerEric Anholt <eric@anholt.net>
Tue, 30 Oct 2018 17:46:52 +0000 (10:46 -0700)
This lets us trim unused trailing components in the vertex attributes,
reducing the size of our VPM allocations.

src/broadcom/compiler/vir.c
src/gallium/drivers/v3d/v3d_program.c

index 6b55b0e03bc04a19e018c1e8587b3b155cc9d166..faad65411515f43351a9c1b98ec777aa9e973d11 100644 (file)
@@ -585,6 +585,12 @@ vir_compile_init(const struct v3d_compiler *compiler,
         return c;
 }
 
+static int
+type_size_vec4(const struct glsl_type *type)
+{
+        return glsl_count_attribute_slots(type, false);
+}
+
 static void
 v3d_lower_nir(struct v3d_compile *c)
 {
@@ -713,6 +719,16 @@ uint64_t *v3d_compile_vs(const struct v3d_compiler *compiler,
 
         c->vs_key = key;
 
+        /* Split our input vars and dead code eliminate the unused
+         * components.
+         */
+        NIR_PASS_V(c->s, nir_lower_io_to_scalar_early, nir_var_shader_in);
+        v3d_optimize_nir(c->s);
+        NIR_PASS_V(c->s, nir_remove_dead_variables, nir_var_shader_in);
+        NIR_PASS_V(c->s, nir_lower_io, nir_var_shader_in,
+                   type_size_vec4,
+                   (nir_lower_io_options)0);
+
         v3d_lower_nir(c);
 
         if (key->clamp_color)
index 1d4b0bb20804f4a8bd45c53abd2641ddb091db89..17ded7571c43ff11f7cbc46de7ec847e24b779e1 100644 (file)
@@ -210,7 +210,10 @@ v3d_shader_state_create(struct pipe_context *pctx,
                 so->was_tgsi = true;
         }
 
-        NIR_PASS_V(s, nir_lower_io, nir_var_all & ~nir_var_uniform,
+        nir_variable_mode lower_mode = nir_var_all & ~nir_var_uniform;
+        if (s->info.stage == MESA_SHADER_VERTEX)
+                lower_mode &= ~nir_var_shader_in;
+        NIR_PASS_V(s, nir_lower_io, lower_mode,
                    type_size,
                    (nir_lower_io_options)0);