summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/compiler/nir/nir.h5
-rw-r--r--src/compiler/nir/nir_serialize.c21
2 files changed, 16 insertions, 10 deletions
diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h
index 12be397ff19..7930e164acb 100644
--- a/src/compiler/nir/nir.h
+++ b/src/compiler/nir/nir.h
@@ -2920,7 +2920,7 @@ nir_variable *nir_variable_clone(const nir_variable *c, nir_shader *shader);
void nir_shader_replace(nir_shader *dest, nir_shader *src);
-nir_shader *nir_shader_serialize_deserialize(void *mem_ctx, nir_shader *s);
+void nir_shader_serialize_deserialize(nir_shader *s);
#ifndef NDEBUG
void nir_validate_shader(nir_shader *shader, const char *when);
@@ -2995,8 +2995,7 @@ static inline bool should_print_nir(void) { return false; }
nir_shader_replace(nir, clone); \
} \
if (should_serialize_deserialize_nir()) { \
- void *mem_ctx = ralloc_parent(nir); \
- nir = nir_shader_serialize_deserialize(mem_ctx, nir); \
+ nir_shader_serialize_deserialize(nir); \
} \
} while (0)
diff --git a/src/compiler/nir/nir_serialize.c b/src/compiler/nir/nir_serialize.c
index e9e84bf8aaa..43a39ac1a5a 100644
--- a/src/compiler/nir/nir_serialize.c
+++ b/src/compiler/nir/nir_serialize.c
@@ -1202,21 +1202,28 @@ nir_deserialize(void *mem_ctx,
return ctx.nir;
}
-nir_shader *
-nir_shader_serialize_deserialize(void *mem_ctx, nir_shader *s)
+void
+nir_shader_serialize_deserialize(nir_shader *shader)
{
- const struct nir_shader_compiler_options *options = s->options;
+ const struct nir_shader_compiler_options *options = shader->options;
struct blob writer;
blob_init(&writer);
- nir_serialize(&writer, s);
- ralloc_free(s);
+ nir_serialize(&writer, shader);
+
+ /* Delete all of dest's ralloc children but leave dest alone */
+ void *dead_ctx = ralloc_context(NULL);
+ ralloc_adopt(dead_ctx, shader);
+ ralloc_free(dead_ctx);
+
+ dead_ctx = ralloc_context(NULL);
struct blob_reader reader;
blob_reader_init(&reader, writer.data, writer.size);
- nir_shader *ns = nir_deserialize(mem_ctx, options, &reader);
+ nir_shader *copy = nir_deserialize(dead_ctx, options, &reader);
blob_finish(&writer);
- return ns;
+ nir_shader_replace(shader, copy);
+ ralloc_free(dead_ctx);
}