On 18 July 2012 14:16, Brian Paul <span dir="ltr"><<a href="mailto:brianp@vmware.com" target="_blank">brianp@vmware.com</a>></span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="HOEnZb"><div class="h5">On 07/18/2012 01:16 PM, Paul Berry wrote:<br>
</div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div class="h5">
This patch updates the ir_set_program_inouts_visitor so that it also<br>
sets gl_fragment_program::UsesDFdy.<br>
<br>
This is a bit of a hack (since dFdy() isn't an input or an output),<br>
but there's no other obvious visitor to squeeze this functionality<br>
into, and it would be silly to create a brand new visitor just for<br>
this purpose.<br>
---<br>
  src/glsl/ir_set_program_<u></u>inouts.cpp |   16 ++++++++++++++--<br>
  1 files changed, 14 insertions(+), 2 deletions(-)<br>
<br>
diff --git a/src/glsl/ir_set_program_<u></u>inouts.cpp b/src/glsl/ir_set_program_<u></u>inouts.cpp<br>
index a7415c7..9b82f17 100644<br>
--- a/src/glsl/ir_set_program_<u></u>inouts.cpp<br>
+++ b/src/glsl/ir_set_program_<u></u>inouts.cpp<br>
@@ -26,8 +26,8 @@<br>
   *<br>
   * Sets the InputsRead and OutputsWritten of Mesa programs.<br>
   *<br>
- * Additionally, for fragment shaders, sets the InterpQualifier array and<br>
- * IsCentroid bitfield.<br>
+ * Additionally, for fragment shaders, sets the InterpQualifier array, the<br>
+ * IsCentroid bitfield, and the UsesDFdy flag.<br>
   *<br>
   * Mesa programs (gl_program, not gl_shader_program) have a set of<br>
   * flags indicating which varyings are read and written.  Computing<br>
@@ -61,6 +61,7 @@ public:<br>
<br>
     virtual ir_visitor_status visit_enter(ir_dereference_<u></u>array *);<br>
     virtual ir_visitor_status visit_enter(ir_function_<u></u>signature *);<br>
+   virtual ir_visitor_status visit_enter(ir_expression *);<br>
     virtual ir_visitor_status visit(ir_dereference_variable *);<br>
     virtual ir_visitor_status visit(ir_variable *);<br>
<br>
@@ -169,6 +170,16 @@ ir_set_program_inouts_visitor:<u></u>:visit_enter(ir_function_<u></u>signature *ir)<br>
     return visit_continue_with_parent;<br>
  }<br>
<br>
+ir_visitor_status<br>
+ir_set_program_inouts_<u></u>visitor::visit_enter(ir_<u></u>expression *ir)<br>
+{<br></div></div>
+   if (is_fragment_shader&&  ir->operation == ir_unop_dFdy) {<div class="im"><br>
+      gl_fragment_program *fprog = (gl_fragment_program *) prog;<br>
+      fprog->UsesDFdy = true;<br>
+   }<br>
+   return visit_continue;<br>
+}<br>
+<br>
  void<br>
  do_set_program_inouts(exec_<u></u>list *instructions, struct gl_program *prog,<br>
                        bool is_fragment_shader)<br>
@@ -182,6 +193,7 @@ do_set_program_inouts(exec_<u></u>list *instructions, struct gl_program *prog,<br>
        memset(((gl_fragment_program *) prog)->InterpQualifier, 0,<br>
               sizeof(((gl_fragment_program *) prog)->InterpQualifier));<br>
        ((gl_fragment_program *) prog)->IsCentroid = 0;<br>
+      ((gl_fragment_program *) prog)->UsesDFdy = false;<br>
     }<br>
     visit_list_elements(&v, instructions);<br>
  }<br>
</div></blockquote>
<br>
Reviewed-by: Brian Paul <<a href="mailto:brianp@vmware.com" target="_blank">brianp@vmware.com</a>><br>
<br>
BTW, I thought we had a cast wrapper somewhere for casting gl_program to gl_fragment_program or gl_vertex_program, etc. but I can't find it at the moment.  It would be good to use wrapper like that instead of casts everywhere.  The last hunk has 3 such casts.  A local 'fprog' var would make things a bit more readable there.<span class="HOEnZb"><font color="#888888"><br>
</font></span></blockquote><div><br>Good point, thanks.  I'll add a local 'fprog' var before pushing the patch.<br> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<span class="HOEnZb"><font color="#888888">
<br>
-Brian<br>
</font></span></blockquote></div><br>