[Mesa-dev] [PATCH] radeonsi/nir: set TGSI_PROPERTY_NEXT_SHADER

Timothy Arceri tarceri at itsqueeze.com
Mon Feb 26 09:30:18 UTC 2018


Please ignore. This is something that's been sitting in my branch for a 
while, on second look the logic is wrong.

On 26/02/18 20:25, Timothy Arceri wrote:
> ---
>   src/compiler/shader_info.h                   |  5 +++++
>   src/gallium/drivers/radeonsi/si_shader_nir.c |  9 +++++++++
>   src/mesa/state_tracker/st_glsl_to_nir.cpp    | 12 ++++++++++++
>   3 files changed, 26 insertions(+)
> 
> diff --git a/src/compiler/shader_info.h b/src/compiler/shader_info.h
> index e7fd7dbe62..11a59ff6ac 100644
> --- a/src/compiler/shader_info.h
> +++ b/src/compiler/shader_info.h
> @@ -54,6 +54,11 @@ typedef struct shader_info {
>      /** The shader stage, such as MESA_SHADER_VERTEX. */
>      gl_shader_stage stage;
>   
> +   /** The shader stage in a non SSO linked program that follows this stage,
> +     * such as MESA_SHADER_FRAGMENT.
> +     */
> +   gl_shader_stage next_stage;
> +
>      /* Number of textures used by this shader */
>      unsigned num_textures;
>      /* Number of uniform buffers used by this shader */
> diff --git a/src/gallium/drivers/radeonsi/si_shader_nir.c b/src/gallium/drivers/radeonsi/si_shader_nir.c
> index d410a6c2d6..57f8dc6f03 100644
> --- a/src/gallium/drivers/radeonsi/si_shader_nir.c
> +++ b/src/gallium/drivers/radeonsi/si_shader_nir.c
> @@ -247,6 +247,15 @@ void si_nir_scan_shader(const struct nir_shader *nir,
>   	info->num_tokens = 2; /* indicate that the shader is non-empty */
>   	info->num_instructions = 2;
>   
> +	/* Set the next shader stage hint for VS and TES. */
> +	if (!nir->info.separate_shader &&
> +	    (nir->info.stage == MESA_SHADER_VERTEX ||
> +	     nir->info.stage == MESA_SHADER_TESS_EVAL)) {
> +
> +		info->properties[TGSI_PROPERTY_NEXT_SHADER] =
> +			pipe_shader_type_from_mesa(nir->info.next_stage);
> +	}
> +
>   	if (nir->info.stage == MESA_SHADER_TESS_CTRL) {
>   		info->properties[TGSI_PROPERTY_TCS_VERTICES_OUT] =
>   			nir->info.tess.tcs_vertices_out;
> diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp
> index 765c827d93..760aee1af6 100644
> --- a/src/mesa/state_tracker/st_glsl_to_nir.cpp
> +++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp
> @@ -317,6 +317,18 @@ st_glsl_to_nir(struct st_context *st, struct gl_program *prog,
>   
>      nir_shader *nir = glsl_to_nir(shader_program, stage, options);
>   
> +   /* Set the next shader stage hint for VS and TES. */
> +   if (!nir->info.separate_shader &&
> +       (nir->info.stage == MESA_SHADER_VERTEX ||
> +        nir->info.stage == MESA_SHADER_TESS_EVAL)) {
> +
> +      unsigned stages_mask =
> +          (prog->info.stage + 1) >> shader_program->data->linked_stages;
> +
> +      nir->info.next_stage = stages_mask ?
> +         (gl_shader_stage) u_bit_scan(&stages_mask) : MESA_SHADER_FRAGMENT;
> +   }
> +
>      nir_variable_mode mask =
>         (nir_variable_mode) (nir_var_shader_in | nir_var_shader_out);
>      nir_remove_dead_variables(nir, mask);
> 


More information about the mesa-dev mailing list