iris: Serialize the NIR to a blob we can use for shader cache purposes.

We will use a hash of the serialized NIR together with brw_prog_*_key
(for NOS) as the disk cache key, where the disk cache contains actual
assembly shaders.

Reviewed-by: Dylan Baker <dylan@pnwbakers.com>
This commit is contained in:
Kenneth Graunke 2019-05-20 23:25:40 -07:00
parent 4756864cdc
commit dc5dc727d5
2 changed files with 25 additions and 0 deletions

View File

@ -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. */

View File

@ -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;
}