st/mesa: call nir_serialize only once per shader
[mesa.git] / src / mesa / state_tracker / st_program.c
index 5b0cc4a6a36b80fafbe42a62b0ed76c5876b5cf0..f842b6b5d444fe04018017b7e9fac67c6a601bfa 100644 (file)
@@ -2068,6 +2068,20 @@ 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)
 {
@@ -2092,14 +2106,7 @@ st_finalize_program(struct st_context *st, struct gl_program *prog)
     * to save memory.
     */
    if (prog->nir) {
-      /* 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);
+      st_serialize_nir(stp);
 
       /* Free NIR. */
       assert(stp->state.ir.nir == prog->nir);