Module: Mesa
Branch: main
Commit: 603f039708360236e040cffb87bcd5e17cf78475
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=603f039708360236e040cffb87bcd5e17cf78475

Author: Lionel Landwerlin <[email protected]>
Date:   Thu Oct 19 16:04:50 2023 +0300

nir: make printf_info (de)serializer available

Signed-off-by: Lionel Landwerlin <[email protected]>
Reviewed-by: Karol Herbst <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26505>

---

 src/compiler/nir/nir_serialize.c | 74 +++++++++++++++++++++++++---------------
 src/compiler/nir/nir_serialize.h |  8 +++++
 2 files changed, 54 insertions(+), 28 deletions(-)

diff --git a/src/compiler/nir/nir_serialize.c b/src/compiler/nir/nir_serialize.c
index 96c2ce49e1f..cf53cd894e2 100644
--- a/src/compiler/nir/nir_serialize.c
+++ b/src/compiler/nir/nir_serialize.c
@@ -2024,20 +2024,8 @@ nir_serialize(struct blob *blob, const nir_shader *nir, 
bool strip)
 
    write_xfb_info(&ctx, nir->xfb_info);
 
-   if (nir->info.stage == MESA_SHADER_KERNEL) {
-      blob_write_uint32(blob, nir->printf_info_count);
-      for (int i = 0; i < nir->printf_info_count; i++) {
-         u_printf_info *info = &nir->printf_info[i];
-         blob_write_uint32(blob, info->num_args);
-         blob_write_uint32(blob, info->string_size);
-         blob_write_bytes(blob, info->arg_sizes,
-                          info->num_args * sizeof(*info->arg_sizes));
-         /* we can't use blob_write_string, because it contains multiple NULL
-          * terminated strings */
-         blob_write_bytes(blob, info->strings,
-                          info->string_size * sizeof(*info->strings));
-      }
-   }
+   if (nir->info.stage == MESA_SHADER_KERNEL)
+      nir_serialize_printf_info(blob, nir->printf_info, 
nir->printf_info_count);
 
    blob_overwrite_uint32(blob, idx_size_offset, ctx.next_idx);
 
@@ -2097,21 +2085,9 @@ nir_deserialize(void *mem_ctx,
    ctx.nir->xfb_info = read_xfb_info(&ctx);
 
    if (ctx.nir->info.stage == MESA_SHADER_KERNEL) {
-      ctx.nir->printf_info_count = blob_read_uint32(blob);
       ctx.nir->printf_info =
-         ralloc_array(ctx.nir, u_printf_info, ctx.nir->printf_info_count);
-
-      for (int i = 0; i < ctx.nir->printf_info_count; i++) {
-         u_printf_info *info = &ctx.nir->printf_info[i];
-         info->num_args = blob_read_uint32(blob);
-         info->string_size = blob_read_uint32(blob);
-         info->arg_sizes = ralloc_array(ctx.nir, unsigned, info->num_args);
-         blob_copy_bytes(blob, info->arg_sizes,
-                         info->num_args * sizeof(*info->arg_sizes));
-         info->strings = ralloc_array(ctx.nir, char, info->string_size);
-         blob_copy_bytes(blob, info->strings,
-                         info->string_size * sizeof(*info->strings));
-      }
+         nir_deserialize_printf_info(ctx.nir, blob,
+                                     &ctx.nir->printf_info_count);
    }
 
    free(ctx.idx_table);
@@ -2146,3 +2122,45 @@ nir_shader_serialize_deserialize(nir_shader *shader)
    nir_shader_replace(shader, copy);
    ralloc_free(dead_ctx);
 }
+
+void
+nir_serialize_printf_info(struct blob *blob,
+                          const u_printf_info *printf_info,
+                          unsigned printf_info_count)
+{
+   blob_write_uint32(blob, printf_info_count);
+   for (int i = 0; i < printf_info_count; i++) {
+      const u_printf_info *info = &printf_info[i];
+      blob_write_uint32(blob, info->num_args);
+      blob_write_uint32(blob, info->string_size);
+      blob_write_bytes(blob, info->arg_sizes,
+                       info->num_args * sizeof(info->arg_sizes[0]));
+      /* we can't use blob_write_string, because it contains multiple NULL
+       * terminated strings */
+      blob_write_bytes(blob, info->strings, info->string_size);
+   }
+}
+
+u_printf_info *
+nir_deserialize_printf_info(void *mem_ctx,
+                            struct blob_reader *blob,
+                            unsigned *printf_info_count)
+{
+   *printf_info_count = blob_read_uint32(blob);
+
+   u_printf_info *printf_info =
+      ralloc_array(mem_ctx, u_printf_info, *printf_info_count);
+
+   for (int i = 0; i < *printf_info_count; i++) {
+      u_printf_info *info = &printf_info[i];
+      info->num_args = blob_read_uint32(blob);
+      info->string_size = blob_read_uint32(blob);
+      info->arg_sizes = ralloc_array(mem_ctx, unsigned, info->num_args);
+      blob_copy_bytes(blob, info->arg_sizes,
+                      info->num_args * sizeof(info->arg_sizes[0]));
+      info->strings = ralloc_array(mem_ctx, char, info->string_size);
+      blob_copy_bytes(blob, info->strings, info->string_size);
+   }
+
+   return printf_info;
+}
diff --git a/src/compiler/nir/nir_serialize.h b/src/compiler/nir/nir_serialize.h
index d20c6df3b36..6a9ba820286 100644
--- a/src/compiler/nir/nir_serialize.h
+++ b/src/compiler/nir/nir_serialize.h
@@ -31,6 +31,14 @@
 extern "C" {
 #endif
 
+void nir_serialize_printf_info(struct blob *blob,
+                               const u_printf_info *info,
+                               unsigned printf_info_count);
+
+u_printf_info *nir_deserialize_printf_info(void *mem_ctx,
+                                           struct blob_reader *blob,
+                                           unsigned *printf_info_count);
+
 void nir_serialize(struct blob *blob, const nir_shader *nir, bool strip);
 nir_shader *nir_deserialize(void *mem_ctx,
                             const struct nir_shader_compiler_options *options,

Reply via email to