[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