summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTimothy Arceri <timothy.arceri@collabora.com>2015-11-21 19:02:01 +1100
committerTimothy Arceri <timothy.arceri@collabora.com>2015-11-25 09:50:13 +1100
commit7436d7c33b65f8f3875d908f08acb15c57f9bd08 (patch)
treeff31f60c154f859fe4528f1a694614e654bca8ab
parent404ac4bf9e2e0ed388edc3553a6b9a31d59d7e03 (diff)
downloadexternal_mesa3d-7436d7c33b65f8f3875d908f08acb15c57f9bd08.zip
external_mesa3d-7436d7c33b65f8f3875d908f08acb15c57f9bd08.tar.gz
external_mesa3d-7436d7c33b65f8f3875d908f08acb15c57f9bd08.tar.bz2
glsl: only call dead code pass when new inputs/outputs demoted
This will help avoid eliminating inputs/outputs needed by SSOs. Cc: Gregory Hainaut <gregory.hainaut@gmail.com> Reviewed-by: Juha-Pekka Heikkila <juhapekka.heikkila@gmail.com>
-rw-r--r--src/glsl/linker.cpp24
1 files changed, 14 insertions, 10 deletions
diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
index eac2536..5ff433c 100644
--- a/src/glsl/linker.cpp
+++ b/src/glsl/linker.cpp
@@ -4327,13 +4327,14 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog)
do_dead_builtin_varyings(ctx, sh, NULL,
num_tfeedback_decls, tfeedback_decls);
- if (!prog->SeparateShader)
+ if (!prog->SeparateShader) {
demote_shader_inputs_and_outputs(sh, ir_var_shader_out);
-
- /* Eliminate code that is now dead due to unused outputs being demoted.
- */
- while (do_dead_code(sh->ir, false))
- ;
+ /* Eliminate code that is now dead due to unused outputs being
+ * demoted.
+ */
+ while (do_dead_code(sh->ir, false))
+ ;
+ }
}
else if (first == MESA_SHADER_FRAGMENT) {
/* If the program only contains a fragment shader...
@@ -4350,11 +4351,14 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog)
0 /* num_tfeedback_decls */,
NULL /* tfeedback_decls */))
goto done;
- } else
+ } else {
demote_shader_inputs_and_outputs(sh, ir_var_shader_in);
-
- while (do_dead_code(sh->ir, false))
- ;
+ /* Eliminate code that is now dead due to unused inputs being
+ * demoted.
+ */
+ while (do_dead_code(sh->ir, false))
+ ;
+ }
}
next = last;