[Mesa-dev] [PATCH 16/28] glsl: don't pack tessellation stages like we do other stages

eocallaghan at alterapraxis.com eocallaghan at alterapraxis.com
Mon Dec 28 22:38:45 PST 2015


On 2015-12-29 16:00, Timothy Arceri wrote:
> Tessellation shaders treat varyings as shared memory and invocations
> can access each others varyings therefore we can't use the existing
> method to lower them.
> 
> This adds a check for these stages as following patches will
> allow explicit locations to be lowered even when the driver and 
> existing
> tesselation checks ask for it to be disabled, we do this to enable 
> support
> for the component layout qualifier.

I find this a little hard to read and understand, could you brush it up 
a bit
please if that's ok?

> ---
>  src/glsl/lower_packed_varyings.cpp | 62 
> +++++++++++++++++++++-----------------
>  1 file changed, 34 insertions(+), 28 deletions(-)
> 
> diff --git a/src/glsl/lower_packed_varyings.cpp
> b/src/glsl/lower_packed_varyings.cpp
> index 2899846..e4e9a35 100644
> --- a/src/glsl/lower_packed_varyings.cpp
> +++ b/src/glsl/lower_packed_varyings.cpp
> @@ -737,40 +737,46 @@ lower_packed_varyings(void *mem_ctx, unsigned
> locations_used,
>                        ir_variable_mode mode, unsigned 
> gs_input_vertices,
>                        gl_shader *shader, bool disable_varying_packing)
>  {
> -   exec_list *instructions = shader->ir;
>     ir_function *main_func = shader->symbols->get_function("main");
>     exec_list void_parameters;
>     ir_function_signature *main_func_sig
>        = main_func->matching_signature(NULL, &void_parameters, false);
> -   exec_list new_instructions, new_variables;
> -   lower_packed_varyings_visitor visitor(mem_ctx, locations_used, 
> mode,
> -                                         gs_input_vertices,
> -                                         &new_instructions,
> -                                         &new_variables,
> -                                         disable_varying_packing);
> -   visitor.run(shader);
> -   if (mode == ir_var_shader_out) {
> -      if (shader->Stage == MESA_SHADER_GEOMETRY) {
> -         /* For geometry shaders, outputs need to be lowered before 
> each call
> -          * to EmitVertex()
> -          */
> -         lower_packed_varyings_gs_splicer splicer(mem_ctx, 
> &new_instructions);
> -
> -         /* Add all the variables in first. */
> -         main_func_sig->body.head->insert_before(&new_variables);
> 
> -         /* Now update all the EmitVertex instances */
> -         splicer.run(instructions);
> +   if (!(shader->Stage == MESA_SHADER_TESS_CTRL ||
> +         shader->Stage == MESA_SHADER_TESS_EVAL)) {
> +      exec_list *instructions = shader->ir;
> +      exec_list new_instructions, new_variables;
> +
> +      lower_packed_varyings_visitor visitor(mem_ctx, locations_used, 
> mode,
> +                                            gs_input_vertices,
> +                                            &new_instructions,
> +                                            &new_variables,
> +                                            disable_varying_packing);
> +      visitor.run(shader);
> +      if (mode == ir_var_shader_out) {
> +         if (shader->Stage == MESA_SHADER_GEOMETRY) {
> +            /* For geometry shaders, outputs need to be lowered before 
> each
> +             * call to EmitVertex()
> +             */
> +            lower_packed_varyings_gs_splicer splicer(mem_ctx,
> +                                                     
> &new_instructions);
> +
> +            /* Add all the variables in first. */
> +            main_func_sig->body.head->insert_before(&new_variables);
> +
> +            /* Now update all the EmitVertex instances */
> +            splicer.run(instructions);
> +         } else {
> +            /* For other shader types, outputs need to be lowered at 
> the end
> +             * of main()
> +             */
> +            main_func_sig->body.append_list(&new_variables);
> +            main_func_sig->body.append_list(&new_instructions);
> +         }
>        } else {
> -         /* For other shader types, outputs need to be lowered at the 
> end of
> -          * main()
> -          */
> -         main_func_sig->body.append_list(&new_variables);
> -         main_func_sig->body.append_list(&new_instructions);
> +         /* Shader inputs need to be lowered at the beginning of 
> main() */
> +         main_func_sig->body.head->insert_before(&new_instructions);
> +         main_func_sig->body.head->insert_before(&new_variables);
>        }
> -   } else {
> -      /* Shader inputs need to be lowered at the beginning of main() 
> */
> -      main_func_sig->body.head->insert_before(&new_instructions);
> -      main_func_sig->body.head->insert_before(&new_variables);
>     }
>  }



More information about the mesa-dev mailing list