[Mesa-dev] [PATCH 3/4] glsl: Set UsesDFdy appropriately for GLSL shaders.
Brian Paul
brianp at vmware.com
Wed Jul 18 14:16:33 PDT 2012
On 07/18/2012 01:16 PM, Paul Berry wrote:
> This patch updates the ir_set_program_inouts_visitor so that it also
> sets gl_fragment_program::UsesDFdy.
>
> This is a bit of a hack (since dFdy() isn't an input or an output),
> but there's no other obvious visitor to squeeze this functionality
> into, and it would be silly to create a brand new visitor just for
> this purpose.
> ---
> src/glsl/ir_set_program_inouts.cpp | 16 ++++++++++++++--
> 1 files changed, 14 insertions(+), 2 deletions(-)
>
> diff --git a/src/glsl/ir_set_program_inouts.cpp b/src/glsl/ir_set_program_inouts.cpp
> index a7415c7..9b82f17 100644
> --- a/src/glsl/ir_set_program_inouts.cpp
> +++ b/src/glsl/ir_set_program_inouts.cpp
> @@ -26,8 +26,8 @@
> *
> * Sets the InputsRead and OutputsWritten of Mesa programs.
> *
> - * Additionally, for fragment shaders, sets the InterpQualifier array and
> - * IsCentroid bitfield.
> + * Additionally, for fragment shaders, sets the InterpQualifier array, the
> + * IsCentroid bitfield, and the UsesDFdy flag.
> *
> * Mesa programs (gl_program, not gl_shader_program) have a set of
> * flags indicating which varyings are read and written. Computing
> @@ -61,6 +61,7 @@ public:
>
> virtual ir_visitor_status visit_enter(ir_dereference_array *);
> virtual ir_visitor_status visit_enter(ir_function_signature *);
> + virtual ir_visitor_status visit_enter(ir_expression *);
> virtual ir_visitor_status visit(ir_dereference_variable *);
> virtual ir_visitor_status visit(ir_variable *);
>
> @@ -169,6 +170,16 @@ ir_set_program_inouts_visitor::visit_enter(ir_function_signature *ir)
> return visit_continue_with_parent;
> }
>
> +ir_visitor_status
> +ir_set_program_inouts_visitor::visit_enter(ir_expression *ir)
> +{
> + if (is_fragment_shader&& ir->operation == ir_unop_dFdy) {
> + gl_fragment_program *fprog = (gl_fragment_program *) prog;
> + fprog->UsesDFdy = true;
> + }
> + return visit_continue;
> +}
> +
> void
> do_set_program_inouts(exec_list *instructions, struct gl_program *prog,
> bool is_fragment_shader)
> @@ -182,6 +193,7 @@ do_set_program_inouts(exec_list *instructions, struct gl_program *prog,
> memset(((gl_fragment_program *) prog)->InterpQualifier, 0,
> sizeof(((gl_fragment_program *) prog)->InterpQualifier));
> ((gl_fragment_program *) prog)->IsCentroid = 0;
> + ((gl_fragment_program *) prog)->UsesDFdy = false;
> }
> visit_list_elements(&v, instructions);
> }
Reviewed-by: Brian Paul <brianp at vmware.com>
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.
-Brian
More information about the mesa-dev
mailing list