[Mesa-dev] [PATCH] mesa/st: move cloning of NIR shader for compute

Marek Olšák maraeo at gmail.com
Tue Dec 5 18:00:11 UTC 2017


Reviewed-by: Marek Olšák <marek.olsak at amd.com>

Marek

On Tue, Dec 5, 2017 at 4:05 PM, Rob Clark <robdclark at gmail.com> wrote:
> Since in the NIR case, driver takes ownership of the NIR shader, we need
> to clone what is passed to the driver.  Normally this is done as part of
> creating the shader variant (where is clone is anyways needed).  But
> compute shaders have no variants, so we were cloning earlier.
>
> The problem is that after the NIR linking optimizations, we ended up
> cloning *before* all the lowering passes where done.
>
> So move this into st_get_cp_variant(), to make compute shaders work more
> like other shader stages.
>
> Signed-off-by: Rob Clark <robdclark at gmail.com>
> ---
>  src/mesa/state_tracker/st_glsl_to_nir.cpp | 2 +-
>  src/mesa/state_tracker/st_program.c       | 5 ++++-
>  2 files changed, 5 insertions(+), 2 deletions(-)
>
> diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp
> index 5d18e7b62bf..36adf55cd45 100644
> --- a/src/mesa/state_tracker/st_glsl_to_nir.cpp
> +++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp
> @@ -431,7 +431,7 @@ set_st_program(struct gl_program *prog,
>        stcp = (struct st_compute_program *)prog;
>        stcp->shader_program = shader_program;
>        stcp->tgsi.ir_type = PIPE_SHADER_IR_NIR;
> -      stcp->tgsi.prog = nir_shader_clone(NULL, nir);
> +      stcp->tgsi.prog = nir;
>        break;
>     default:
>        unreachable("unknown shader stage");
> diff --git a/src/mesa/state_tracker/st_program.c b/src/mesa/state_tracker/st_program.c
> index 5c0a58104fc..258f5e47cbe 100644
> --- a/src/mesa/state_tracker/st_program.c
> +++ b/src/mesa/state_tracker/st_program.c
> @@ -1659,7 +1659,10 @@ st_get_cp_variant(struct st_context *st,
>        v = CALLOC_STRUCT(st_basic_variant);
>        if (v) {
>           /* fill in new variant */
> -         v->driver_shader = pipe->create_compute_state(pipe, tgsi);
> +         struct pipe_compute_state cs = *tgsi;
> +         if (tgsi->ir_type == PIPE_SHADER_IR_NIR)
> +            cs.prog = nir_shader_clone(NULL, tgsi->prog);;
> +         v->driver_shader = pipe->create_compute_state(pipe, &cs);
>           v->key = key;
>
>           /* insert into list */
> --
> 2.13.6
>


More information about the mesa-dev mailing list