From f2f640f3c7b6931ff27564b863c8e1d2d55fd8a1 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Wed, 13 Mar 2024 15:26:35 -0400 Subject: [PATCH] mesa/st: add 'base_serialized_nir' MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit this is the pre-finalize nir which has (ideally) not been mangled by driver-specific lowering passes Reviewed-by: Marek Olšák Part-of: --- src/mesa/main/shader_types.h | 2 ++ src/mesa/program/program.c | 1 + src/mesa/state_tracker/st_glsl_to_nir.cpp | 4 +++- src/mesa/state_tracker/st_program.c | 18 ++++++++++++++++++ src/mesa/state_tracker/st_program.h | 2 ++ 5 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/mesa/main/shader_types.h b/src/mesa/main/shader_types.h index ab7bac8f275..fbf5ce839cc 100644 --- a/src/mesa/main/shader_types.h +++ b/src/mesa/main/shader_types.h @@ -504,6 +504,8 @@ struct gl_program GLboolean _Used; /**< Ever used for drawing? Used for debugging */ struct nir_shader *nir; + void *base_serialized_nir; + size_t base_serialized_nir_size; /* Saved and restored with metadata. Freed with ralloc. */ void *driver_cache_blob; diff --git a/src/mesa/program/program.c b/src/mesa/program/program.c index 5c0951251f0..807adbc6c82 100644 --- a/src/mesa/program/program.c +++ b/src/mesa/program/program.c @@ -251,6 +251,7 @@ _mesa_delete_program(struct gl_context *ctx, struct gl_program *prog) st_release_variants(st, prog); free(prog->serialized_nir); + free(prog->base_serialized_nir); if (prog == &_mesa_DummyProgram) return; diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp index 2c974092ef0..6a668555c7e 100644 --- a/src/mesa/state_tracker/st_glsl_to_nir.cpp +++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp @@ -385,8 +385,10 @@ st_glsl_to_nir_post_opts(struct st_context *st, struct gl_program *prog, st_finalize_nir_before_variants(nir); char *msg = NULL; - if (st->allow_st_finalize_nir_twice) + if (st->allow_st_finalize_nir_twice) { + st_serialize_base_nir(prog, nir); msg = st_finalize_nir(st, prog, shader_program, nir, true, true); + } if (st->ctx->_Shader->Flags & GLSL_DUMP) { _mesa_log("\n"); diff --git a/src/mesa/state_tracker/st_program.c b/src/mesa/state_tracker/st_program.c index 1497283f470..e3a30ce155b 100644 --- a/src/mesa/state_tracker/st_program.c +++ b/src/mesa/state_tracker/st_program.c @@ -390,6 +390,8 @@ st_prog_to_nir_postprocess(struct st_context *st, nir_shader *nir, st_finalize_nir_before_variants(nir); if (st->allow_st_finalize_nir_twice) { + st_serialize_base_nir(prog, nir); + char *msg = st_finalize_nir(st, prog, NULL, nir, true, true); free(msg); } @@ -560,6 +562,7 @@ st_translate_vertex_program(struct st_context *st, free(prog->serialized_nir); prog->serialized_nir = NULL; } + free(prog->base_serialized_nir); prog->state.type = PIPE_SHADER_IR_NIR; if (prog->arb.Instructions) @@ -1301,6 +1304,20 @@ st_serialize_nir(struct gl_program *prog) } } +void +st_serialize_base_nir(struct gl_program *prog, nir_shader *nir) +{ + if (!prog->base_serialized_nir && nir->info.stage == MESA_SHADER_VERTEX) { + struct blob blob; + size_t size; + + blob_init(&blob); + nir_serialize(&blob, nir, false); + blob_finish_get_buffer(&blob, &prog->base_serialized_nir, &size); + prog->base_serialized_nir_size = size; + } +} + void st_finalize_program(struct st_context *st, struct gl_program *prog) { @@ -1338,6 +1355,7 @@ st_finalize_program(struct st_context *st, struct gl_program *prog) * is disabled. If the disk cache is enabled, GLSL programs are * serialized in write_nir_to_cache. */ + st_serialize_base_nir(prog, prog->nir); st_serialize_nir(prog); } diff --git a/src/mesa/state_tracker/st_program.h b/src/mesa/state_tracker/st_program.h index e212abcb85e..1a0699b0fbb 100644 --- a/src/mesa/state_tracker/st_program.h +++ b/src/mesa/state_tracker/st_program.h @@ -352,6 +352,8 @@ st_translate_stream_output_info(struct gl_program *prog); extern void st_serialize_nir(struct gl_program *stp); +void +st_serialize_base_nir(struct gl_program *prog, struct nir_shader *nir); extern void st_finalize_program(struct st_context *st, struct gl_program *prog);