--- src/mesa/drivers/dri/i965/brw_compiler.h | 4 ++ src/mesa/drivers/dri/i965/brw_shader_cache.c | 66 ++++++++++++++++++++++++++++ src/mesa/drivers/dri/i965/brw_tcs.c | 2 + src/mesa/drivers/dri/i965/brw_tes.c | 2 + 4 files changed, 74 insertions(+)
diff --git a/src/mesa/drivers/dri/i965/brw_compiler.h b/src/mesa/drivers/dri/i965/brw_compiler.h index e67db0c..17c3b13 100644 --- a/src/mesa/drivers/dri/i965/brw_compiler.h +++ b/src/mesa/drivers/dri/i965/brw_compiler.h @@ -656,6 +656,8 @@ struct brw_tcs_prog_data /** Number vertices in output patch */ int instances; + + GLuint program_size; }; @@ -666,6 +668,8 @@ struct brw_tes_prog_data enum brw_tess_partitioning partitioning; enum brw_tess_output_topology output_topology; enum brw_tess_domain domain; + + GLuint program_size; }; struct brw_gs_prog_data diff --git a/src/mesa/drivers/dri/i965/brw_shader_cache.c b/src/mesa/drivers/dri/i965/brw_shader_cache.c index 097e079..00bc1d2 100644 --- a/src/mesa/drivers/dri/i965/brw_shader_cache.c +++ b/src/mesa/drivers/dri/i965/brw_shader_cache.c @@ -761,6 +761,72 @@ write_cached_program(struct brw_context *brw) ralloc_free (binary); } + if (prog->_LinkedShaders[MESA_SHADER_TESS_CTRL]) { + struct brw_tcs_prog_key tcs_key; + unsigned char tcs_sha1[20]; + + binary = blob_create (NULL); + if (binary == NULL) + return; + + blob_write_string(binary, brw->ctx.VersionString); + + gen_tcs_sha1(brw, prog, &tcs_key, tcs_sha1); + + /* Write TCS program to blob. */ + program_size = brw->tcs.prog_data->program_size; + + blob_write_uint32(binary, program_size); + + blob_cursor = blob_reserve_bytes(binary, program_size); + drm_intel_bo_get_subdata(brw->cache.bo, brw->tcs.base.prog_offset, + program_size, blob_cursor); + + /* Write TCS program_data to blob. */ + blob_write_uint32(binary, sizeof *brw->tcs.prog_data); + blob_write_bytes(binary, brw->tcs.prog_data, + sizeof *brw->tcs.prog_data); + + write_program_data(prog, binary, &brw->tcs.prog_data->base.base, + MESA_SHADER_TESS_CTRL); + + cache_binary(brw, binary, cache, tcs_sha1); + ralloc_free(binary); + } + + if (prog->_LinkedShaders[MESA_SHADER_TESS_EVAL]) { + struct brw_tes_prog_key tes_key; + unsigned char tes_sha1[20]; + + binary = blob_create (NULL); + if (binary == NULL) + return; + + blob_write_string(binary, brw->ctx.VersionString); + + gen_tes_sha1(brw, prog, &tes_key, tes_sha1); + + /* Write TES program to blob. */ + program_size = brw->tes.prog_data->program_size; + + blob_write_uint32(binary, program_size); + + blob_cursor = blob_reserve_bytes(binary, program_size); + drm_intel_bo_get_subdata(brw->cache.bo, brw->tes.base.prog_offset, + program_size, blob_cursor); + + /* Write TES program_data to blob. */ + blob_write_uint32(binary, sizeof *brw->tes.prog_data); + blob_write_bytes(binary, brw->tes.prog_data, + sizeof *brw->tes.prog_data); + + write_program_data(prog, binary, &brw->tes.prog_data->base.base, + MESA_SHADER_TESS_EVAL); + + cache_binary(brw, binary, cache, tes_sha1); + ralloc_free(binary); + } + if (prog->_LinkedShaders[MESA_SHADER_GEOMETRY]) { struct brw_gs_prog_key gs_key; unsigned char gs_sha1[20]; diff --git a/src/mesa/drivers/dri/i965/brw_tcs.c b/src/mesa/drivers/dri/i965/brw_tcs.c index 4d6ef29..d5289fb 100644 --- a/src/mesa/drivers/dri/i965/brw_tcs.c +++ b/src/mesa/drivers/dri/i965/brw_tcs.c @@ -309,6 +309,8 @@ brw_codegen_tcs_prog(struct brw_context *brw, if (!tcs) ralloc_free(nir); + brw->tcs.prog_data->program_size = program_size; + return true; } diff --git a/src/mesa/drivers/dri/i965/brw_tes.c b/src/mesa/drivers/dri/i965/brw_tes.c index 8ce77d6..41a6f86 100644 --- a/src/mesa/drivers/dri/i965/brw_tes.c +++ b/src/mesa/drivers/dri/i965/brw_tes.c @@ -226,6 +226,8 @@ brw_codegen_tes_prog(struct brw_context *brw, &stage_state->prog_offset, &brw->tes.prog_data, tep); ralloc_free(mem_ctx); + brw->tes.prog_data->program_size = program_size; + return true; } -- 2.7.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev