[Mesa-dev] [PATCH 17/19] mesa: Add gl_shader_program param to ProgramBinarySerializeDriverBlob

Jordan Justen jordan.l.justen at intel.com
Mon May 14 16:52:18 UTC 2018


This might be required because some stages might generate different
programs depending on the other stages in the program. For example,
the i965 driver's tessellation control stage depends on the
tessellation evaluation shader.

Signed-off-by: Jordan Justen <jordan.l.justen at intel.com>
---
 src/mesa/drivers/dri/i965/brw_context.c        |  2 +-
 src/mesa/drivers/dri/i965/brw_context.h        |  3 +++
 src/mesa/drivers/dri/i965/brw_program_binary.c |  8 ++++++++
 src/mesa/main/dd.h                             |  1 +
 src/mesa/main/program_binary.c                 |  3 ++-
 src/mesa/state_tracker/st_context.c            |  6 ++++--
 src/mesa/state_tracker/st_shader_cache.c       | 16 ++++++++++++++++
 src/mesa/state_tracker/st_shader_cache.h       | 10 ++++++++++
 8 files changed, 45 insertions(+), 4 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c
index 0a87cc83e35..258eccbc835 100644
--- a/src/mesa/drivers/dri/i965/brw_context.c
+++ b/src/mesa/drivers/dri/i965/brw_context.c
@@ -340,7 +340,7 @@ brw_init_driver_functions(struct brw_context *brw,
    /* GL_ARB_get_program_binary */
    brw_program_binary_init(brw->screen->deviceID);
    functions->GetProgramBinaryDriverSHA1 = brw_get_program_binary_driver_sha1;
-   functions->ProgramBinarySerializeDriverBlob = brw_program_serialize_nir;
+   functions->ProgramBinarySerializeDriverBlob = brw_serialize_program_binary;
    functions->ProgramBinaryDeserializeDriverBlob =
       brw_deserialize_program_binary;
 
diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h
index 0db98d86d07..c61532899c7 100644
--- a/src/mesa/drivers/dri/i965/brw_context.h
+++ b/src/mesa/drivers/dri/i965/brw_context.h
@@ -1639,6 +1639,9 @@ extern void
 brw_program_binary_init(unsigned device_id);
 extern void
 brw_get_program_binary_driver_sha1(struct gl_context *ctx, uint8_t *sha1);
+void brw_serialize_program_binary(struct gl_context *ctx,
+                                  struct gl_shader_program *sh_prog,
+                                  struct gl_program *prog);
 extern void
 brw_deserialize_program_binary(struct gl_context *ctx,
                                struct gl_shader_program *shProg,
diff --git a/src/mesa/drivers/dri/i965/brw_program_binary.c b/src/mesa/drivers/dri/i965/brw_program_binary.c
index 20d3a3c8ba5..1fe3ffd5bf9 100644
--- a/src/mesa/drivers/dri/i965/brw_program_binary.c
+++ b/src/mesa/drivers/dri/i965/brw_program_binary.c
@@ -237,6 +237,14 @@ brw_deserialize_program_binary(struct gl_context *ctx,
    brw_program_deserialize_driver_blob(ctx, prog, prog->info.stage);
 }
 
+void
+brw_serialize_program_binary(struct gl_context *ctx,
+                             struct gl_shader_program *sh_prog,
+                             struct gl_program *prog)
+{
+   brw_program_serialize_nir(ctx, prog);
+}
+
 void
 brw_write_blob_program_data(struct blob *binary, gl_shader_stage stage,
                             const void *program,
diff --git a/src/mesa/main/dd.h b/src/mesa/main/dd.h
index 7a1e6823ac5..0ab5c621b6b 100644
--- a/src/mesa/main/dd.h
+++ b/src/mesa/main/dd.h
@@ -1210,6 +1210,7 @@ struct dd_function_table {
    void (*GetProgramBinaryDriverSHA1)(struct gl_context *ctx, uint8_t *sha1);
 
    void (*ProgramBinarySerializeDriverBlob)(struct gl_context *ctx,
+                                            struct gl_shader_program *shProg,
                                             struct gl_program *prog);
 
    void (*ProgramBinaryDeserializeDriverBlob)(struct gl_context *ctx,
diff --git a/src/mesa/main/program_binary.c b/src/mesa/main/program_binary.c
index 078d59d13f8..f1bc7bd2cd2 100644
--- a/src/mesa/main/program_binary.c
+++ b/src/mesa/main/program_binary.c
@@ -172,7 +172,8 @@ write_program_payload(struct gl_context *ctx, struct blob *blob,
    for (unsigned stage = 0; stage < MESA_SHADER_STAGES; stage++) {
       struct gl_linked_shader *shader = sh_prog->_LinkedShaders[stage];
       if (shader)
-         ctx->Driver.ProgramBinarySerializeDriverBlob(ctx, shader->Program);
+         ctx->Driver.ProgramBinarySerializeDriverBlob(ctx, sh_prog,
+                                                      shader->Program);
    }
 
    serialize_glsl_program(blob, ctx, sh_prog);
diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c
index 0d0cfc5c63c..18e9799e8b5 100644
--- a/src/mesa/state_tracker/st_context.c
+++ b/src/mesa/state_tracker/st_context.c
@@ -771,12 +771,14 @@ st_init_driver_functions(struct pipe_screen *screen,
                                PIPE_SHADER_CAP_PREFERRED_IR);
    if (preferred_ir == PIPE_SHADER_IR_NIR) {
       functions->ShaderCacheSerializeDriverBlob =  st_serialise_nir_program;
-      functions->ProgramBinarySerializeDriverBlob = st_serialise_nir_program;
+      functions->ProgramBinarySerializeDriverBlob =
+         st_serialise_nir_program_binary;
       functions->ProgramBinaryDeserializeDriverBlob =
          st_deserialise_nir_program;
    } else {
       functions->ShaderCacheSerializeDriverBlob =  st_serialise_tgsi_program;
-      functions->ProgramBinarySerializeDriverBlob = st_serialise_tgsi_program;
+      functions->ProgramBinarySerializeDriverBlob =
+         st_serialise_tgsi_program_binary;
       functions->ProgramBinaryDeserializeDriverBlob =
          st_deserialise_tgsi_program;
    }
diff --git a/src/mesa/state_tracker/st_shader_cache.c b/src/mesa/state_tracker/st_shader_cache.c
index 4801bb1c504..cf5eda07d71 100644
--- a/src/mesa/state_tracker/st_shader_cache.c
+++ b/src/mesa/state_tracker/st_shader_cache.c
@@ -410,6 +410,14 @@ st_serialise_tgsi_program(struct gl_context *ctx, struct gl_program *prog)
    st_serialise_ir_program(ctx, prog, false);
 }
 
+void
+st_serialise_tgsi_program_binary(struct gl_context *ctx,
+                                 struct gl_shader_program *shProg,
+                                 struct gl_program *prog)
+{
+   st_serialise_ir_program(ctx, prog, false);
+}
+
 void
 st_deserialise_tgsi_program(struct gl_context *ctx,
                             struct gl_shader_program *shProg,
@@ -424,6 +432,14 @@ st_serialise_nir_program(struct gl_context *ctx, struct gl_program *prog)
    st_serialise_ir_program(ctx, prog, true);
 }
 
+void
+st_serialise_nir_program_binary(struct gl_context *ctx,
+                                struct gl_shader_program *shProg,
+                                struct gl_program *prog)
+{
+   st_serialise_ir_program(ctx, prog, true);
+}
+
 void
 st_deserialise_nir_program(struct gl_context *ctx,
                            struct gl_shader_program *shProg,
diff --git a/src/mesa/state_tracker/st_shader_cache.h b/src/mesa/state_tracker/st_shader_cache.h
index 132dac00c01..5b0bff7b2f8 100644
--- a/src/mesa/state_tracker/st_shader_cache.h
+++ b/src/mesa/state_tracker/st_shader_cache.h
@@ -38,6 +38,11 @@ st_get_program_binary_driver_sha1(struct gl_context *ctx, uint8_t *sha1);
 void
 st_serialise_tgsi_program(struct gl_context *ctx, struct gl_program *prog);
 
+void
+st_serialise_tgsi_program_binary(struct gl_context *ctx,
+                                 struct gl_shader_program *shProg,
+                                 struct gl_program *prog);
+
 void
 st_deserialise_tgsi_program(struct gl_context *ctx,
                             struct gl_shader_program *shProg,
@@ -46,6 +51,11 @@ st_deserialise_tgsi_program(struct gl_context *ctx,
 void
 st_serialise_nir_program(struct gl_context *ctx, struct gl_program *prog);
 
+void
+st_serialise_nir_program_binary(struct gl_context *ctx,
+                                struct gl_shader_program *shProg,
+                                struct gl_program *prog);
+
 void
 st_deserialise_nir_program(struct gl_context *ctx,
                            struct gl_shader_program *shProg,
-- 
2.16.2



More information about the mesa-dev mailing list