diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp index 5ba25a6bd7c..9ce6ec986bb 100644 --- a/src/mesa/state_tracker/st_glsl_to_nir.cpp +++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp @@ -389,7 +389,10 @@ st_glsl_to_nir_post_opts(struct st_context *st, struct gl_program *prog, char *msg = NULL; if (st->allow_st_finalize_nir_twice) { st_serialize_base_nir(prog, nir); - msg = st_finalize_nir(st, prog, shader_program, nir, true, true, false); + st_finalize_nir(st, prog, shader_program, nir, true, false); + + if (screen->finalize_nir) + msg = screen->finalize_nir(screen, nir); } if (st->ctx->_Shader->Flags & GLSL_DUMP) { @@ -881,12 +884,10 @@ st_nir_lower_uniforms(struct st_context *st, nir_shader *nir) /* Last third of preparing nir from glsl, which happens after shader * variant lowering. */ -char * +void st_finalize_nir(struct st_context *st, struct gl_program *prog, - struct gl_shader_program *shader_program, - nir_shader *nir, bool finalize_by_driver, - bool is_before_variants, - bool is_draw_shader) + struct gl_shader_program *shader_program, nir_shader *nir, + bool is_before_variants, bool is_draw_shader) { struct pipe_screen *screen = st->screen; @@ -925,12 +926,6 @@ st_finalize_nir(struct st_context *st, struct gl_program *prog, st_nir_lower_samplers(screen, nir, shader_program, prog); if (!is_draw_shader && !screen->get_param(screen, PIPE_CAP_NIR_IMAGES_AS_DEREF)) NIR_PASS(_, nir, gl_nir_lower_images, false); - - char *msg = NULL; - if (!is_draw_shader && finalize_by_driver && screen->finalize_nir) - msg = screen->finalize_nir(screen, nir); - - return msg; } /** diff --git a/src/mesa/state_tracker/st_nir.h b/src/mesa/state_tracker/st_nir.h index a327ac29e1a..fe2235084be 100644 --- a/src/mesa/state_tracker/st_nir.h +++ b/src/mesa/state_tracker/st_nir.h @@ -43,11 +43,10 @@ bool st_nir_lower_wpos_ytransform(struct nir_shader *nir, struct gl_program *prog, struct pipe_screen *pscreen); -char *st_finalize_nir(struct st_context *st, struct gl_program *prog, - struct gl_shader_program *shader_program, - struct nir_shader *nir, bool finalize_by_driver, - bool is_before_variants, - bool is_draw_shader); +void st_finalize_nir(struct st_context *st, struct gl_program *prog, + struct gl_shader_program *shader_program, + struct nir_shader *nir, bool is_before_variants, + bool is_draw_shader); void st_nir_assign_vs_in_locations(struct nir_shader *nir); void st_nir_assign_varying_locations(struct st_context *st, diff --git a/src/mesa/state_tracker/st_program.c b/src/mesa/state_tracker/st_program.c index b2bf4658746..94548e4da3d 100644 --- a/src/mesa/state_tracker/st_program.c +++ b/src/mesa/state_tracker/st_program.c @@ -397,9 +397,12 @@ st_prog_to_nir_postprocess(struct st_context *st, nir_shader *nir, if (st->allow_st_finalize_nir_twice) { st_serialize_base_nir(prog, nir); + st_finalize_nir(st, prog, NULL, nir, true, false); - char *msg = st_finalize_nir(st, prog, NULL, nir, true, true, false); - free(msg); + if (screen->finalize_nir) { + char *msg = screen->finalize_nir(screen, nir); + free(msg); + } } nir_validate_shader(nir, "after st/glsl finalize_nir"); @@ -772,9 +775,14 @@ st_create_common_variant(struct st_context *st, } if (finalize || !st->allow_st_finalize_nir_twice || key->is_draw_shader) { - char *msg = st_finalize_nir(st, prog, prog->shader_program, state.ir.nir, - true, false, key->is_draw_shader); - free(msg); + st_finalize_nir(st, prog, prog->shader_program, state.ir.nir, false, + key->is_draw_shader); + + struct pipe_screen *screen = st->screen; + if (!key->is_draw_shader && screen->finalize_nir) { + char *msg = screen->finalize_nir(screen, state.ir.nir); + free(msg); + } /* Clip lowering and edgeflags may have introduced new varyings, so * update the inputs_read/outputs_written. However, with @@ -1109,11 +1117,8 @@ st_create_fp_variant(struct st_context *st, need_lower_tex_src_plane = true; } - if (finalize || !st->allow_st_finalize_nir_twice) { - char *msg = st_finalize_nir(st, fp, fp->shader_program, state.ir.nir, - false, false, false); - free(msg); - } + if (finalize || !st->allow_st_finalize_nir_twice) + st_finalize_nir(st, fp, fp->shader_program, state.ir.nir, false, false); /* This pass needs to happen *after* nir_lower_sampler */ if (unlikely(need_lower_tex_src_plane)) {