mesa: Add gl_shader_program param to ProgramBinarySerializeDriverBlob

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@intel.com>
Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
This commit is contained in:
Jordan Justen 2018-02-28 18:29:54 -08:00
parent 36dd15f8b3
commit 48ce7745dc
No known key found for this signature in database
GPG Key ID: 37F99F68CAF992EB
8 changed files with 45 additions and 4 deletions

View File

@ -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;

View File

@ -1637,6 +1637,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,

View File

@ -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,

View File

@ -1218,6 +1218,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,

View File

@ -174,7 +174,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);

View File

@ -760,12 +760,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;
}

View File

@ -414,6 +414,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,
@ -428,6 +436,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,

View File

@ -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,