From 54f691311c1f56c6aed693c21e820e4dd52b7f20 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Thu, 14 Sep 2017 16:49:53 -0700 Subject: [PATCH] nir: Add hooks for testing serialization Reviewed-by: Timothy Arceri Reviewed-by: Jordan Justen --- src/compiler/nir/nir.h | 17 +++++++++++++++++ src/compiler/nir/nir_serialize.c | 19 +++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index dd833cf..87c7256 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -2312,6 +2312,8 @@ nir_variable *nir_variable_clone(const nir_variable *c, nir_shader *shader); nir_deref *nir_deref_clone(const nir_deref *deref, void *mem_ctx); nir_deref_var *nir_deref_var_clone(const nir_deref_var *deref, void *mem_ctx); +nir_shader *nir_shader_serialize_deserialize(void *mem_ctx, nir_shader *s); + #ifdef DEBUG void nir_validate_shader(nir_shader *shader); void nir_metadata_set_validation_flag(nir_shader *shader); @@ -2328,6 +2330,16 @@ should_clone_nir(void) } static inline bool +should_serialize_deserialize_nir(void) +{ + static int test_serialize = -1; + if (test_serialize < 0) + test_serialize = env_var_as_boolean("NIR_TEST_SERIALIZE", false); + + return test_serialize; +} + +static inline bool should_print_nir(void) { static int should_print = -1; @@ -2341,6 +2353,7 @@ static inline void nir_validate_shader(nir_shader *shader) { (void) shader; } static inline void nir_metadata_set_validation_flag(nir_shader *shader) { (void) shader; } static inline void nir_metadata_check_validation_flag(nir_shader *shader) { (void) shader; } static inline bool should_clone_nir(void) { return false; } +static inline bool should_serialize_deserialize_nir(void) { return false; } static inline bool should_print_nir(void) { return false; } #endif /* DEBUG */ @@ -2352,6 +2365,10 @@ static inline bool should_print_nir(void) { return false; } ralloc_free(nir); \ nir = clone; \ } \ + if (should_serialize_deserialize_nir()) { \ + void *mem_ctx = ralloc_parent(nir); \ + nir = nir_shader_serialize_deserialize(mem_ctx, nir); \ + } \ } while (0) #define NIR_PASS(progress, nir, pass, ...) _PASS(nir, \ diff --git a/src/compiler/nir/nir_serialize.c b/src/compiler/nir/nir_serialize.c index bb6a5d8..7951258 100644 --- a/src/compiler/nir/nir_serialize.c +++ b/src/compiler/nir/nir_serialize.c @@ -1199,3 +1199,22 @@ nir_deserialize(void *mem_ctx, return ctx.nir; } + +nir_shader * +nir_shader_serialize_deserialize(void *mem_ctx, nir_shader *s) +{ + const struct nir_shader_compiler_options *options = s->options; + + struct blob writer; + blob_init(&writer); + nir_serialize(&writer, s); + ralloc_free(s); + + struct blob_reader reader; + blob_reader_init(&reader, writer.data, writer.size); + nir_shader *ns = nir_deserialize(mem_ctx, options, &reader); + + blob_finish(&writer); + + return ns; +} -- 2.7.4