[Mesa-dev] [PATCH v2 25/32] i965: add cache fallback support using serialized nir
Jordan Justen
jordan.l.justen at intel.com
Thu Oct 19 05:32:13 UTC 2017
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;
}
--
2.15.0.rc0
More information about the mesa-dev
mailing list