On 02/23/2012 06:46 AM, Vincent Lejeune wrote:
Can you provide some analysis as to why this fixes the problem? That
information should be captured in the commit message. As far as I can
tell, this just prevents the LHS of the assignment from being visited,
and it's not obvious how that solves the problem. Also, what happens if
the LHS involves an array access using an output as the index? For example,
#version 130
out int i;
out vec4 v[4];
in int j;
uniform vec4 d;
void main()
{
i = j;
v[i] = d;
}
It seems like this will skip lowering the read of i in the LHS.
This fix bug #46004
Please format this as
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=46004
---
src/glsl/lower_output_reads.cpp | 8 ++++++++
1 files changed, 8 insertions(+), 0 deletions(-)
diff --git a/src/glsl/lower_output_reads.cpp b/src/glsl/lower_output_reads.cpp
index 415b541..119d45a 100644
--- a/src/glsl/lower_output_reads.cpp
+++ b/src/glsl/lower_output_reads.cpp
@@ -52,6 +52,7 @@ public:
virtual ir_visitor_status visit(class ir_dereference_variable *);
virtual ir_visitor_status visit_leave(class ir_return *);
virtual ir_visitor_status visit_leave(class ir_function_signature *);
+ virtual ir_visitor_status visit_enter(ir_assignment *ir);
};
output_read_remover::output_read_remover()
@@ -68,6 +69,13 @@ output_read_remover::~output_read_remover()
}
ir_visitor_status
+output_read_remover::visit_enter(ir_assignment *ir)
+{
+ ir->rhs->accept(this);
+ return visit_continue_with_parent;
+}
+
+ir_visitor_status
output_read_remover::visit(ir_dereference_variable *ir)
{
if (ir->var->mode != ir_var_out)
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev