i965: add cache fallback support using serialized nir

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@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@intel.com>
Acked-by: Timothy Arceri <tarceri@itsqueeze.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
Jordan Justen 2017-10-18 19:25:48 -07:00
parent a4078b819f
commit c3a8ae105c
1 changed files with 26 additions and 1 deletions

View File

@ -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"
@ -58,6 +59,27 @@ gen_shader_sha1(struct brw_context *brw, struct gl_program *prog,
_mesa_sha1_compute(manifest, strlen(manifest), out_sha1);
}
static void
restore_serialized_nir_shader(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->driver_cache_blob && prog->driver_cache_blob_size > 0);
const struct nir_shader_compiler_options *options =
brw->ctx.Const.ShaderCompilerOptions[stage].NirOptions;
struct blob_reader reader;
blob_reader_init(&reader, prog->driver_cache_blob,
prog->driver_cache_blob_size);
prog->nir = nir_deserialize(NULL, options, &reader);
}
}
static void
write_blob_program_data(struct blob *binary, gl_shader_stage stage,
const void *program,
@ -258,6 +280,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;
@ -271,7 +296,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. */
restore_serialized_nir_shader(brw, prog, stage);
return false;
}