[Mesa-dev] [PATCH v2 25/32] i965: add cache fallback support using serialized nir
Timothy Arceri
tarceri at itsqueeze.com
Fri Oct 20 01:48:16 UTC 2017
On 20/10/17 09:13, Timothy Arceri wrote:
> IMO you should just do this in brw_link() when its cheap. You will be
> doing the deserialization at draw time here which is not what we want.
> Can also drop the serialized_nir params if you follow my suggestions in
> patch 14.
I still think you might want to always restore the nir rather than doing
this at draw time, but it's not going to be a huge overhead compared to
the compile so for now.
Acked-by: Timothy Arceri <tarceri at itsqueeze.com>
Something you probably want to do as a follow up is free the serialised
NIR after you load it.
>
> On 19/10/17 16:32, Jordan Justen wrote:
>> If the i965 gen program cannot be loaded from the cache, then we
>> fallback to using a serialized nir program.
>>
>> This is based on "i965: add cache fallback support" by Timothy Arceri
>> <timothy.arceri at collabora.com>. Tim's version was written to fallback
>> to compiling from source, and therefore had to be much more complex.
>> After Connor and Jason implemented nir serialization, I was able to
>> rewrite and greatly simplify this patch.
>>
>> Signed-off-by: Jordan Justen <jordan.l.justen at intel.com>
>> ---
>> src/mesa/drivers/dri/i965/brw_disk_cache.c | 27
>> ++++++++++++++++++++++++++-
>> 1 file changed, 26 insertions(+), 1 deletion(-)
>>
>> diff --git a/src/mesa/drivers/dri/i965/brw_disk_cache.c
>> b/src/mesa/drivers/dri/i965/brw_disk_cache.c
>> index d89df846d5..790fad6925 100644
>> --- a/src/mesa/drivers/dri/i965/brw_disk_cache.c
>> +++ b/src/mesa/drivers/dri/i965/brw_disk_cache.c
>> @@ -24,6 +24,7 @@
>> #include "compiler/blob.h"
>> #include "compiler/glsl/ir_uniform.h"
>> #include "compiler/glsl/shader_cache.h"
>> +#include "compiler/nir/nir_serialize.h"
>> #include "main/mtypes.h"
>> #include "util/disk_cache.h"
>> #include "util/macros.h"
>> @@ -79,6 +80,27 @@ gen_shader_sha1(struct brw_context *brw, struct
>> gl_program *prog,
>> _mesa_sha1_compute(manifest, strlen(manifest), out_sha1);
>> }
>> +static void
>> +fallback_to_full_recompile(struct brw_context *brw, struct gl_program
>> *prog,
>> + gl_shader_stage stage)
>> +{
>> + prog->program_written_to_cache = false;
>> + if (brw->ctx._Shader->Flags & GLSL_CACHE_INFO) {
>> + fprintf(stderr, "falling back to nir %s.\n",
>> + _mesa_shader_stage_to_abbrev(prog->info.stage));
>> + }
>> +
>> + if (!prog->nir) {
>> + assert(prog->serialized_nir && prog->serialized_nir_size > 0);
>> + const struct nir_shader_compiler_options *options =
>> + brw->ctx.Const.ShaderCompilerOptions[stage].NirOptions;
>> + struct blob_reader reader;
>> + blob_reader_init(&reader, prog->serialized_nir,
>> + prog->serialized_nir_size);
>> + prog->nir = nir_deserialize(NULL, options, &reader);
>> + }
>> +}
>> +
>> static void
>> read_program_data(struct gl_program *glprog, struct blob_reader
>> *binary,
>> struct brw_stage_prog_data *prog_data,
>> @@ -298,6 +320,9 @@ brw_disk_cache_upload_program(struct brw_context
>> *brw, gl_shader_stage stage)
>> prog->sh.LinkedTransformFeedback->api_enabled)
>> return false;
>> + if (brw->ctx._Shader->Flags & GLSL_CACHE_FALLBACK)
>> + goto FAIL;
>> +
>> if (prog->sh.data->LinkStatus != linking_skipped)
>> goto FAIL;
>> @@ -311,7 +336,7 @@ brw_disk_cache_upload_program(struct brw_context
>> *brw, gl_shader_stage stage)
>> return true;
>> FAIL:
>> - /*FIXME: Fall back and compile from source here. */
>> + fallback_to_full_recompile(brw, prog, stage);
>> return false;
>> }
>>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list