summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/drivers')
-rw-r--r--src/gallium/drivers/iris/iris_context.h4
-rw-r--r--src/gallium/drivers/iris/iris_program.c21
2 files changed, 25 insertions, 0 deletions
diff --git a/src/gallium/drivers/iris/iris_context.h b/src/gallium/drivers/iris/iris_context.h
index 294f325d19d..a3e4da792e9 100644
--- a/src/gallium/drivers/iris/iris_context.h
+++ b/src/gallium/drivers/iris/iris_context.h
@@ -260,6 +260,10 @@ struct iris_uncompiled_shader {
struct pipe_stream_output_info stream_output;
+ /* The serialized NIR (for the disk cache) and size in bytes. */
+ void *ir_cache_binary;
+ uint32_t ir_cache_binary_size;
+
unsigned program_id;
/** Bitfield of (1 << IRIS_NOS_*) flags. */
diff --git a/src/gallium/drivers/iris/iris_program.c b/src/gallium/drivers/iris/iris_program.c
index 834a3661355..5c1af3c8a4b 100644
--- a/src/gallium/drivers/iris/iris_program.c
+++ b/src/gallium/drivers/iris/iris_program.c
@@ -38,6 +38,7 @@
#include "util/u_atomic.h"
#include "compiler/nir/nir.h"
#include "compiler/nir/nir_builder.h"
+#include "compiler/nir/nir_serialize.h"
#include "intel/compiler/brw_compiler.h"
#include "intel/compiler/brw_nir.h"
#include "iris_context.h"
@@ -1458,6 +1459,26 @@ iris_create_uncompiled_shader(struct pipe_context *ctx,
update_so_info(&ish->stream_output, nir->info.outputs_written);
}
+ if (screen->disk_cache) {
+ /* Serialize the NIR to a binary blob that we can hash for the disk
+ * cache. First, drop unnecessary information (like variable names)
+ * so the serialized NIR is smaller, and also to let us detect more
+ * isomorphic shaders when hashing, increasing cache hits.
+ *
+ * We skip this step when not using the disk cache, as variable names
+ * are useful for inspecting and debugging shaders.
+ */
+ nir_strip(nir);
+
+ struct blob blob;
+ blob_init(&blob);
+ nir_serialize(&blob, ish->nir);
+ ish->ir_cache_binary = malloc(blob.size);
+ ish->ir_cache_binary_size = blob.size;
+ memcpy(ish->ir_cache_binary, blob.data, blob.size);
+ blob_finish(&blob);
+ }
+
return ish;
}