Mesa (main): vulkan/pipeline_cache: Add helpers for storing NIR in the cache
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Fri Apr 22 20:10:56 UTC 2022
Module: Mesa
Branch: main
Commit: 93d0c66b27f440faa7ce3d2ec2f51135137c07ac
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=93d0c66b27f440faa7ce3d2ec2f51135137c07ac
Author: Jason Ekstrand <jason at jlekstrand.net>
Date: Mon Oct 4 15:14:29 2021 -0500
vulkan/pipeline_cache: Add helpers for storing NIR in the cache
Reviewed-by: Connor Abbott <cwabbott0 at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13184>
---
src/vulkan/runtime/meson.build | 2 +-
src/vulkan/runtime/vk_pipeline_cache.c | 61 ++++++++++++++++++++++++++++++++--
src/vulkan/runtime/vk_pipeline_cache.h | 14 ++++++++
3 files changed, 73 insertions(+), 4 deletions(-)
diff --git a/src/vulkan/runtime/meson.build b/src/vulkan/runtime/meson.build
index 196997490d1..7b01e2ccdef 100644
--- a/src/vulkan/runtime/meson.build
+++ b/src/vulkan/runtime/meson.build
@@ -79,7 +79,7 @@ vulkan_runtime_files = files(
vulkan_runtime_deps = [
vulkan_wsi_deps,
idep_mesautil,
- idep_nir_headers,
+ idep_nir,
idep_vulkan_util,
]
diff --git a/src/vulkan/runtime/vk_pipeline_cache.c b/src/vulkan/runtime/vk_pipeline_cache.c
index 2214b27751c..e7068be26ff 100644
--- a/src/vulkan/runtime/vk_pipeline_cache.c
+++ b/src/vulkan/runtime/vk_pipeline_cache.c
@@ -29,6 +29,8 @@
#include "vk_log.h"
#include "vk_physical_device.h"
+#include "compiler/nir/nir_serialize.h"
+
#include "util/blob.h"
#include "util/debug.h"
#include "util/disk_cache.h"
@@ -327,15 +329,13 @@ vk_pipeline_cache_lookup_object(struct vk_pipeline_cache *cache,
return NULL;
}
- if (object->ops == &raw_data_object_ops) {
+ if (object->ops == &raw_data_object_ops && ops != &raw_data_object_ops) {
/* The object isn't fully formed yet and we need to deserialize it into
* a real object before it can be used.
*/
struct raw_data_object *data_obj =
container_of(object, struct raw_data_object, base);
- assert(ops != &raw_data_object_ops);
-
struct vk_pipeline_cache_object *real_object =
vk_pipeline_cache_object_deserialize(cache,
data_obj->base.key_data,
@@ -412,6 +412,61 @@ vk_pipeline_cache_add_object(struct vk_pipeline_cache *cache,
}
}
+nir_shader *
+vk_pipeline_cache_lookup_nir(struct vk_pipeline_cache *cache,
+ const void *key_data, size_t key_size,
+ const struct nir_shader_compiler_options *nir_options,
+ bool *cache_hit, void *mem_ctx)
+{
+ struct vk_pipeline_cache_object *object =
+ vk_pipeline_cache_lookup_object(cache, key_data, key_size,
+ &raw_data_object_ops, cache_hit);
+ if (object == NULL)
+ return NULL;
+
+ struct raw_data_object *data_obj =
+ container_of(object, struct raw_data_object, base);
+
+ struct blob_reader blob;
+ blob_reader_init(&blob, data_obj->data, data_obj->data_size);
+
+ nir_shader *nir = nir_deserialize(mem_ctx, nir_options, &blob);
+ vk_pipeline_cache_object_unref(object);
+
+ if (blob.overrun) {
+ ralloc_free(nir);
+ return NULL;
+ }
+
+ return nir;
+}
+
+void
+vk_pipeline_cache_add_nir(struct vk_pipeline_cache *cache,
+ const void *key_data, size_t key_size,
+ const nir_shader *nir)
+{
+ struct blob blob;
+ blob_init(&blob);
+
+ nir_serialize(&blob, nir, false);
+ if (blob.out_of_memory) {
+ vk_logw(VK_LOG_OBJS(cache), "Ran out of memory serializing NIR shader");
+ blob_finish(&blob);
+ return;
+ }
+
+ struct raw_data_object *data_obj =
+ raw_data_object_create(cache->base.device,
+ key_data, key_size,
+ blob.data, blob.size);
+ blob_finish(&blob);
+
+ struct vk_pipeline_cache_object *cached =
+ vk_pipeline_cache_add_object(cache, &data_obj->base);
+ vk_pipeline_cache_object_unref(cached);
+}
+
static int32_t
find_type_for_ops(const struct vk_physical_device *pdevice,
const struct vk_pipeline_cache_object_ops *ops)
diff --git a/src/vulkan/runtime/vk_pipeline_cache.h b/src/vulkan/runtime/vk_pipeline_cache.h
index 2340a2c12d1..2d1eeb1d231 100644
--- a/src/vulkan/runtime/vk_pipeline_cache.h
+++ b/src/vulkan/runtime/vk_pipeline_cache.h
@@ -39,6 +39,10 @@ struct blob_reader;
/* #include "util/set.h" */
struct set;
+/* #include "compiler/nir/nir.h" */
+struct nir_shader;
+struct nir_shader_compiler_options;
+
struct vk_pipeline_cache;
struct vk_pipeline_cache_object;
@@ -236,6 +240,16 @@ struct vk_pipeline_cache_object * MUST_CHECK
vk_pipeline_cache_add_object(struct vk_pipeline_cache *cache,
struct vk_pipeline_cache_object *object);
+struct nir_shader *
+vk_pipeline_cache_lookup_nir(struct vk_pipeline_cache *cache,
+ const void *key_data, size_t key_size,
+ const struct nir_shader_compiler_options *nir_options,
+ bool *cache_hit, void *mem_ctx);
+void
+vk_pipeline_cache_add_nir(struct vk_pipeline_cache *cache,
+ const void *key_data, size_t key_size,
+ const struct nir_shader *nir);
+
#ifdef __cplusplus
}
#endif
More information about the mesa-commit
mailing list