Revert "st/mesa: call nir_serialize only once per shader"
authorMark Janes <markjanes@swizzler.org>
Wed, 20 Nov 2019 22:05:41 +0000 (14:05 -0800)
committerMark Janes <markjanes@swizzler.org>
Wed, 20 Nov 2019 23:22:32 +0000 (15:22 -0800)
This reverts commit 3a8d6868897c7dfe72bac09c1eddd551144ca751.

Acked-by: Marek Olšák <maraeo@gmail.com>
src/mesa/state_tracker/st_program.c
src/mesa/state_tracker/st_program.h
src/mesa/state_tracker/st_shader_cache.c

index f842b6b5d444fe04018017b7e9fac67c6a601bfa..5b0cc4a6a36b80fafbe42a62b0ed76c5876b5cf0 100644 (file)
@@ -2068,20 +2068,6 @@ st_precompile_shader_variant(struct st_context *st,
    }
 }
 
-void
-st_serialize_nir(struct st_program *stp)
-{
-   if (!stp->nir_binary) {
-      struct blob blob;
-      size_t size;
-
-      blob_init(&blob);
-      nir_serialize(&blob, stp->Base.nir, false);
-      blob_finish_get_buffer(&blob, &stp->nir_binary, &size);
-      stp->nir_size = size;
-   }
-}
-
 void
 st_finalize_program(struct st_context *st, struct gl_program *prog)
 {
@@ -2106,7 +2092,14 @@ st_finalize_program(struct st_context *st, struct gl_program *prog)
     * to save memory.
     */
    if (prog->nir) {
-      st_serialize_nir(stp);
+      /* Serialize NIR. */
+      struct blob blob;
+      blob_init(&blob);
+      nir_serialize(&blob, prog->nir, false);
+      stp->nir_binary = malloc(blob.size);
+      memcpy(stp->nir_binary, blob.data, blob.size);
+      stp->nir_size = blob.size;
+      blob_finish(&blob);
 
       /* Free NIR. */
       assert(stp->state.ir.nir == prog->nir);
index eb6eff464719da930002f55c9260543e8022fc64..cb085d18bd7e5a6a394462963eb5525f66dfbd2c 100644 (file)
@@ -352,9 +352,6 @@ extern bool
 st_translate_common_program(struct st_context *st,
                             struct st_program *stp);
 
-extern void
-st_serialize_nir(struct st_program *stp);
-
 extern void
 st_finalize_program(struct st_context *st, struct gl_program *prog);
 
index 2d630c65aea696d63ac62ec9919f187faa4bde28..474ab4e1a0e08c952a13c397c039a02d115d70d1 100644 (file)
@@ -70,13 +70,20 @@ write_tgsi_to_cache(struct blob *blob, const struct tgsi_token *tokens,
 static void
 write_nir_to_cache(struct blob *blob, struct gl_program *prog)
 {
-   struct st_program *stp = (struct st_program *)prog;
-
-   st_serialize_nir(stp);
-
-   blob_write_intptr(blob, stp->nir_size);
-   blob_write_bytes(blob, stp->nir_binary, stp->nir_size);
-
+   if (prog->nir) {
+      /* Reserve intptr_t to store the size. intptr_t is also the alignment
+       * of NIR in the blob, so the NIR size computation will be trivial.
+       */
+      size_t offset = blob_reserve_intptr(blob);
+      nir_serialize(blob, prog->nir, false);
+
+      unsigned nir_size = blob->size - offset - sizeof(intptr_t);
+      *(uintptr_t *)(blob->data + offset) = nir_size;
+   } else {
+      struct st_program *stp = (struct st_program *)prog;
+      blob_write_intptr(blob, stp->nir_size);
+      blob_write_bytes(blob, stp->nir_binary, stp->nir_size);
+   }
    copy_blob_to_driver_cache_blob(blob, prog);
 }