i965/link: Serialize program to nir after linking for shader cache
authorJordan Justen <jordan.l.justen@intel.com>
Fri, 13 Oct 2017 20:07:50 +0000 (13:07 -0700)
committerJordan Justen <jordan.l.justen@intel.com>
Wed, 1 Nov 2017 06:36:54 +0000 (23:36 -0700)
If the shader cache is enabled, after linking the program, we
serialize the program to nir. This will be saved out by the glsl
shader cache support.

Later, if the same program is found in the cache, we can use the nir
for a fallback in the unlikely case that the gen binary program is not
found in the cache.

Signed-off-by: Jordan Justen <jordan.l.justen@intel.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
src/mesa/drivers/dri/i965/brw_link.cpp

index 1a28e63fcae3ea528a31792c24a56860cb959319..988dd3a73d7af9a2530ddbd3d4840846c069f77c 100644 (file)
@@ -27,6 +27,7 @@
 #include "compiler/glsl/ir.h"
 #include "compiler/glsl/ir_optimization.h"
 #include "compiler/glsl/program.h"
+#include "compiler/nir/nir_serialize.h"
 #include "program/program.h"
 #include "main/mtypes.h"
 #include "main/shaderapi.h"
@@ -323,6 +324,15 @@ brw_link_shader(struct gl_context *ctx, struct gl_shader_program *shProg)
       NIR_PASS_V(prog->nir, nir_lower_samplers, shProg);
       NIR_PASS_V(prog->nir, nir_lower_atomics, shProg);
 
+      if (brw->ctx.Cache) {
+         struct blob writer;
+         blob_init(&writer);
+         nir_serialize(&writer, prog->nir);
+         prog->driver_cache_blob = ralloc_size(NULL, writer.size);
+         memcpy(prog->driver_cache_blob, writer.data, writer.size);
+         prog->driver_cache_blob_size = writer.size;
+      }
+
       infos[stage] = &prog->nir->info;
 
       update_xfb_info(prog->sh.LinkedTransformFeedback, infos[stage]);