[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