blob: 5ad2fa48d218f9dc6640d6196d0948d4fea5ba7b [file] [log] [blame]
From 0d50be1a1ff4264bd48f93b0e85544ace1807c0a Mon Sep 17 00:00:00 2001
From: Chris Wolfe <cwolfe@chromium.org>
Date: Tue, 7 Aug 2012 18:57:05 -0400
Subject: [PATCH] glsl: Restrict opt_dead_code_local to variable assignment
Temporary fix to Chrome OS bug <http://crosbug.com/32326>
Change-Id: I4ca51603da18e3156f90ed77490902b3f8229f5c
---
src/glsl/opt_dead_code_local.cpp | 12 +++++++++++-
1 files changed, 11 insertions(+), 1 deletions(-)
diff --git a/src/glsl/opt_dead_code_local.cpp b/src/glsl/opt_dead_code_local.cpp
index 4af78a7..0e3a7f4 100644
--- a/src/glsl/opt_dead_code_local.cpp
+++ b/src/glsl/opt_dead_code_local.cpp
@@ -252,10 +252,20 @@ process_assignment(void *ctx, ir_assignment *ir, exec_list *assignments)
}
}
+ if (ir->lhs->as_dereference_variable() == NULL) {
+ /* HACK: Chrome has encountered bugs when this optimization processes
+ * array elements in the lhs. For example:
+ * vec4 tmp; tmp[3] = 1.0;
+ * is incorrectly recorded as writing to only the (x) element, and will
+ * be killed if a later statement replaces (x). To sidestep this problem
+ * temporarily, trim only assignments to bare variables.
+ */
+ return progress;
+ }
+
/* Add this instruction to the assignment list available to be removed. */
assignment_entry *entry = new(ctx) assignment_entry(var, ir);
assignments->push_tail(entry);
-
if (debug) {
printf("add %s\n", var->name);
--
1.7.7.3