X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fstate_tracker%2Fst_shader_cache.c;h=344bd93d6671c5357a0f60b16e27c13861bcf926;hb=33de483d55757024baafca9a69c2159a0a61481f;hp=62d62f761177294d5d661ec052f80c06d44915e0;hpb=9eebc55cc206d7400cc33e5faa52b51a1b4b5b8b;p=mesa.git diff --git a/src/mesa/state_tracker/st_shader_cache.c b/src/mesa/state_tracker/st_shader_cache.c index 62d62f76117..344bd93d667 100644 --- a/src/mesa/state_tracker/st_shader_cache.c +++ b/src/mesa/state_tracker/st_shader_cache.c @@ -25,11 +25,20 @@ #include "st_debug.h" #include "st_program.h" #include "st_shader_cache.h" +#include "st_util.h" #include "compiler/glsl/program.h" +#include "compiler/nir/nir.h" +#include "compiler/nir/nir_serialize.h" #include "pipe/p_shader_tokens.h" #include "program/ir_to_mesa.h" #include "util/u_memory.h" +void +st_get_program_binary_driver_sha1(struct gl_context *ctx, uint8_t *sha1) +{ + disk_cache_compute_key(ctx->Cache, NULL, 0, sha1); +} + static void write_stream_out_to_cache(struct blob *blob, struct pipe_shader_state *tgsi) @@ -38,21 +47,37 @@ write_stream_out_to_cache(struct blob *blob, sizeof(tgsi->stream_output)); } +static void +copy_blob_to_driver_cache_blob(struct blob *blob, struct gl_program *prog) +{ + prog->driver_cache_blob = ralloc_size(NULL, blob->size); + memcpy(prog->driver_cache_blob, blob->data, blob->size); + prog->driver_cache_blob_size = blob->size; +} + static void write_tgsi_to_cache(struct blob *blob, const struct tgsi_token *tokens, struct gl_program *prog, unsigned num_tokens) { blob_write_uint32(blob, num_tokens); blob_write_bytes(blob, tokens, num_tokens * sizeof(struct tgsi_token)); + copy_blob_to_driver_cache_blob(blob, prog); +} - prog->driver_cache_blob = ralloc_size(NULL, blob->size); - memcpy(prog->driver_cache_blob, blob->data, blob->size); - prog->driver_cache_blob_size = blob->size; +static void +write_nir_to_cache(struct blob *blob, struct gl_program *prog) +{ + nir_serialize(blob, prog->nir, false); + copy_blob_to_driver_cache_blob(blob, prog); } -void -st_serialise_tgsi_program(struct gl_context *ctx, struct gl_program *prog) +static void +st_serialise_ir_program(struct gl_context *ctx, struct gl_program *prog, + bool nir) { + if (prog->driver_cache_blob) + return; + struct blob blob; blob_init(&blob); @@ -63,12 +88,18 @@ st_serialise_tgsi_program(struct gl_context *ctx, struct gl_program *prog) blob_write_uint32(&blob, stvp->num_inputs); blob_write_bytes(&blob, stvp->index_to_input, sizeof(stvp->index_to_input)); + blob_write_bytes(&blob, stvp->input_to_index, + sizeof(stvp->input_to_index)); blob_write_bytes(&blob, stvp->result_to_output, sizeof(stvp->result_to_output)); write_stream_out_to_cache(&blob, &stvp->tgsi); - write_tgsi_to_cache(&blob, stvp->tgsi.tokens, prog, - stvp->num_tgsi_tokens); + + if (nir) + write_nir_to_cache(&blob, prog); + else + write_tgsi_to_cache(&blob, stvp->tgsi.tokens, prog, + stvp->num_tgsi_tokens); break; } case MESA_SHADER_TESS_CTRL: @@ -77,22 +108,32 @@ st_serialise_tgsi_program(struct gl_context *ctx, struct gl_program *prog) struct st_common_program *stcp = (struct st_common_program *) prog; write_stream_out_to_cache(&blob, &stcp->tgsi); - write_tgsi_to_cache(&blob, stcp->tgsi.tokens, prog, - stcp->num_tgsi_tokens); + + if (nir) + write_nir_to_cache(&blob, prog); + else + write_tgsi_to_cache(&blob, stcp->tgsi.tokens, prog, + stcp->num_tgsi_tokens); break; } case MESA_SHADER_FRAGMENT: { struct st_fragment_program *stfp = (struct st_fragment_program *) prog; - write_tgsi_to_cache(&blob, stfp->tgsi.tokens, prog, - stfp->num_tgsi_tokens); + if (nir) + write_nir_to_cache(&blob, prog); + else + write_tgsi_to_cache(&blob, stfp->tgsi.tokens, prog, + stfp->num_tgsi_tokens); break; } case MESA_SHADER_COMPUTE: { struct st_compute_program *stcp = (struct st_compute_program *) prog; - write_tgsi_to_cache(&blob, stcp->tgsi.prog, prog, - stcp->num_tgsi_tokens); + if (nir) + write_nir_to_cache(&blob, prog); + else + write_tgsi_to_cache(&blob, stcp->tgsi.prog, prog, + stcp->num_tgsi_tokens); break; } default: @@ -106,7 +147,8 @@ st_serialise_tgsi_program(struct gl_context *ctx, struct gl_program *prog) * Store tgsi and any other required state in on-disk shader cache. */ void -st_store_tgsi_in_disk_cache(struct st_context *st, struct gl_program *prog) +st_store_ir_in_disk_cache(struct st_context *st, struct gl_program *prog, + bool nir) { if (!st->ctx->Cache) return; @@ -118,10 +160,10 @@ st_store_tgsi_in_disk_cache(struct st_context *st, struct gl_program *prog) if (memcmp(prog->sh.data->sha1, zero, sizeof(prog->sh.data->sha1)) == 0) return; - st_serialise_tgsi_program(st->ctx, prog); + st_serialise_ir_program(st->ctx, prog, nir); if (st->ctx->_Shader->Flags & GLSL_CACHE_INFO) { - fprintf(stderr, "putting %s tgsi_tokens in cache\n", + fprintf(stderr, "putting %s state tracker IR in cache\n", _mesa_shader_stage_to_string(prog->info.stage)); } } @@ -136,22 +178,27 @@ read_stream_out_from_cache(struct blob_reader *blob_reader, static void read_tgsi_from_cache(struct blob_reader *blob_reader, - const struct tgsi_token **tokens) + const struct tgsi_token **tokens, + unsigned *num_tokens) { - uint32_t num_tokens = blob_read_uint32(blob_reader); - unsigned tokens_size = num_tokens * sizeof(struct tgsi_token); + *num_tokens = blob_read_uint32(blob_reader); + unsigned tokens_size = *num_tokens * sizeof(struct tgsi_token); *tokens = (const struct tgsi_token*) MALLOC(tokens_size); blob_copy_bytes(blob_reader, (uint8_t *) *tokens, tokens_size); } -void -st_deserialise_tgsi_program(struct gl_context *ctx, - struct gl_shader_program *shProg, - struct gl_program *prog) +static void +st_deserialise_ir_program(struct gl_context *ctx, + struct gl_shader_program *shProg, + struct gl_program *prog, bool nir) { struct st_context *st = st_context(ctx); size_t size = prog->driver_cache_blob_size; uint8_t *buffer = (uint8_t *) prog->driver_cache_blob; + const struct nir_shader_compiler_options *options = + ctx->Const.ShaderCompilerOptions[prog->info.stage].NirOptions; + + assert(prog->driver_cache_blob && prog->driver_cache_blob_size > 0); struct blob_reader blob_reader; blob_reader_init(&blob_reader, buffer, size); @@ -165,11 +212,22 @@ st_deserialise_tgsi_program(struct gl_context *ctx, stvp->num_inputs = blob_read_uint32(&blob_reader); blob_copy_bytes(&blob_reader, (uint8_t *) stvp->index_to_input, sizeof(stvp->index_to_input)); + blob_copy_bytes(&blob_reader, (uint8_t *) stvp->input_to_index, + sizeof(stvp->input_to_index)); blob_copy_bytes(&blob_reader, (uint8_t *) stvp->result_to_output, sizeof(stvp->result_to_output)); read_stream_out_from_cache(&blob_reader, &stvp->tgsi); - read_tgsi_from_cache(&blob_reader, &stvp->tgsi.tokens); + + if (nir) { + stvp->tgsi.type = PIPE_SHADER_IR_NIR; + stvp->shader_program = shProg; + stvp->tgsi.ir.nir = nir_deserialize(NULL, options, &blob_reader); + prog->nir = stvp->tgsi.ir.nir; + } else { + read_tgsi_from_cache(&blob_reader, &stvp->tgsi.tokens, + &stvp->num_tgsi_tokens); + } if (st->vp == stvp) st->dirty |= ST_NEW_VERTEX_PROGRAM(st, stvp); @@ -179,11 +237,18 @@ st_deserialise_tgsi_program(struct gl_context *ctx, case MESA_SHADER_TESS_CTRL: { struct st_common_program *sttcp = st_common_program(prog); - st_release_basic_variants(st, sttcp->Base.Target, - &sttcp->variants, &sttcp->tgsi); - + st_release_basic_variants(st, sttcp); read_stream_out_from_cache(&blob_reader, &sttcp->tgsi); - read_tgsi_from_cache(&blob_reader, &sttcp->tgsi.tokens); + + if (nir) { + sttcp->tgsi.type = PIPE_SHADER_IR_NIR; + sttcp->shader_program = shProg; + sttcp->tgsi.ir.nir = nir_deserialize(NULL, options, &blob_reader); + prog->nir = sttcp->tgsi.ir.nir; + } else { + read_tgsi_from_cache(&blob_reader, &sttcp->tgsi.tokens, + &sttcp->num_tgsi_tokens); + } if (st->tcp == sttcp) st->dirty |= sttcp->affected_states; @@ -193,11 +258,18 @@ st_deserialise_tgsi_program(struct gl_context *ctx, case MESA_SHADER_TESS_EVAL: { struct st_common_program *sttep = st_common_program(prog); - st_release_basic_variants(st, sttep->Base.Target, - &sttep->variants, &sttep->tgsi); - + st_release_basic_variants(st, sttep); read_stream_out_from_cache(&blob_reader, &sttep->tgsi); - read_tgsi_from_cache(&blob_reader, &sttep->tgsi.tokens); + + if (nir) { + sttep->tgsi.type = PIPE_SHADER_IR_NIR; + sttep->shader_program = shProg; + sttep->tgsi.ir.nir = nir_deserialize(NULL, options, &blob_reader); + prog->nir = sttep->tgsi.ir.nir; + } else { + read_tgsi_from_cache(&blob_reader, &sttep->tgsi.tokens, + &sttep->num_tgsi_tokens); + } if (st->tep == sttep) st->dirty |= sttep->affected_states; @@ -207,11 +279,18 @@ st_deserialise_tgsi_program(struct gl_context *ctx, case MESA_SHADER_GEOMETRY: { struct st_common_program *stgp = st_common_program(prog); - st_release_basic_variants(st, stgp->Base.Target, &stgp->variants, - &stgp->tgsi); - + st_release_basic_variants(st, stgp); read_stream_out_from_cache(&blob_reader, &stgp->tgsi); - read_tgsi_from_cache(&blob_reader, &stgp->tgsi.tokens); + + if (nir) { + stgp->tgsi.type = PIPE_SHADER_IR_NIR; + stgp->shader_program = shProg; + stgp->tgsi.ir.nir = nir_deserialize(NULL, options, &blob_reader); + prog->nir = stgp->tgsi.ir.nir; + } else { + read_tgsi_from_cache(&blob_reader, &stgp->tgsi.tokens, + &stgp->num_tgsi_tokens); + } if (st->gp == stgp) st->dirty |= stgp->affected_states; @@ -223,7 +302,15 @@ st_deserialise_tgsi_program(struct gl_context *ctx, st_release_fp_variants(st, stfp); - read_tgsi_from_cache(&blob_reader, &stfp->tgsi.tokens); + if (nir) { + stfp->tgsi.type = PIPE_SHADER_IR_NIR; + stfp->shader_program = shProg; + stfp->tgsi.ir.nir = nir_deserialize(NULL, options, &blob_reader); + prog->nir = stfp->tgsi.ir.nir; + } else { + read_tgsi_from_cache(&blob_reader, &stfp->tgsi.tokens, + &stfp->num_tgsi_tokens); + } if (st->fp == stfp) st->dirty |= stfp->affected_states; @@ -235,8 +322,16 @@ st_deserialise_tgsi_program(struct gl_context *ctx, st_release_cp_variants(st, stcp); - read_tgsi_from_cache(&blob_reader, - (const struct tgsi_token**) &stcp->tgsi.prog); + if (nir) { + stcp->tgsi.ir_type = PIPE_SHADER_IR_NIR; + stcp->shader_program = shProg; + stcp->tgsi.prog = nir_deserialize(NULL, options, &blob_reader); + prog->nir = (nir_shader *) stcp->tgsi.prog; + } else { + read_tgsi_from_cache(&blob_reader, + (const struct tgsi_token**) &stcp->tgsi.prog, + &stcp->num_tgsi_tokens); + } stcp->tgsi.req_local_mem = stcp->Base.info.cs.shared_size; stcp->tgsi.req_private_mem = 0; @@ -265,7 +360,7 @@ st_deserialise_tgsi_program(struct gl_context *ctx, } st_set_prog_affected_state_flags(prog); - _mesa_associate_uniform_storage(ctx, shProg, prog, false); + _mesa_associate_uniform_storage(ctx, shProg, prog); /* Create Gallium shaders now instead of on demand. */ if (ST_DEBUG & DEBUG_PRECOMPILE || @@ -274,8 +369,9 @@ st_deserialise_tgsi_program(struct gl_context *ctx, } bool -st_load_tgsi_from_disk_cache(struct gl_context *ctx, - struct gl_shader_program *prog) +st_load_ir_from_disk_cache(struct gl_context *ctx, + struct gl_shader_program *prog, + bool nir) { if (!ctx->Cache) return false; @@ -283,7 +379,7 @@ st_load_tgsi_from_disk_cache(struct gl_context *ctx, /* If we didn't load the GLSL metadata from cache then we could not have * loaded the tgsi either. */ - if (prog->data->LinkStatus != linking_skipped) + if (prog->data->LinkStatus != LINKING_SKIPPED) return false; for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) { @@ -291,7 +387,7 @@ st_load_tgsi_from_disk_cache(struct gl_context *ctx, continue; struct gl_program *glprog = prog->_LinkedShaders[i]->Program; - st_deserialise_tgsi_program(ctx, prog, glprog); + st_deserialise_ir_program(ctx, prog, glprog, nir); /* We don't need the cached blob anymore so free it */ ralloc_free(glprog->driver_cache_blob); @@ -299,10 +395,54 @@ st_load_tgsi_from_disk_cache(struct gl_context *ctx, glprog->driver_cache_blob_size = 0; if (ctx->_Shader->Flags & GLSL_CACHE_INFO) { - fprintf(stderr, "%s tgsi_tokens retrieved from cache\n", + fprintf(stderr, "%s state tracker IR retrieved from cache\n", _mesa_shader_stage_to_string(i)); } } return true; } + +void +st_serialise_tgsi_program(struct gl_context *ctx, struct gl_program *prog) +{ + st_serialise_ir_program(ctx, prog, false); +} + +void +st_serialise_tgsi_program_binary(struct gl_context *ctx, + struct gl_shader_program *shProg, + struct gl_program *prog) +{ + st_serialise_ir_program(ctx, prog, false); +} + +void +st_deserialise_tgsi_program(struct gl_context *ctx, + struct gl_shader_program *shProg, + struct gl_program *prog) +{ + st_deserialise_ir_program(ctx, shProg, prog, false); +} + +void +st_serialise_nir_program(struct gl_context *ctx, struct gl_program *prog) +{ + st_serialise_ir_program(ctx, prog, true); +} + +void +st_serialise_nir_program_binary(struct gl_context *ctx, + struct gl_shader_program *shProg, + struct gl_program *prog) +{ + st_serialise_ir_program(ctx, prog, true); +} + +void +st_deserialise_nir_program(struct gl_context *ctx, + struct gl_shader_program *shProg, + struct gl_program *prog) +{ + st_deserialise_ir_program(ctx, shProg, prog, true); +}