diff options
author | Jason Ekstrand <jason.ekstrand@intel.com> | 2016-08-26 10:07:40 -0700 |
---|---|---|
committer | Jason Ekstrand <jason.ekstrand@intel.com> | 2016-08-29 12:17:34 -0700 |
commit | 600446ccc7a95d589e92d0f574eed823b678377c (patch) | |
tree | ba4c7a5f3a73e4be2f97a3c28beb19dde94a6cb3 /src/mesa/drivers/dri/i965/brw_blorp.c | |
parent | a14d1b63ce74773bec34d0c2b24b7d6fc36d0330 (diff) | |
download | external_mesa3d-600446ccc7a95d589e92d0f574eed823b678377c.zip external_mesa3d-600446ccc7a95d589e92d0f574eed823b678377c.tar.gz external_mesa3d-600446ccc7a95d589e92d0f574eed823b678377c.tar.bz2 |
i965/blorp: Expose the shader cache through function pointers
This sanitizes blorp's access to the i965 driver's shader cache by patching
it through the blorp_context. When we start using blorp in Vulkan, we will
simply have to implement such a caching interface in the Vulkan driver.
Note: In my first attempt at this, I simplified it down to a single
upload_shader entrypoint and implemented the caching inside of blorp. This
doesn't work, however, because the i965 driver will, on occation, dump its
entire cache and start over. When this happens, blorp needs to be able to
recompile its shaders and re-upload them. It's easiest to just expose the
caching interface.
Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
Diffstat (limited to 'src/mesa/drivers/dri/i965/brw_blorp.c')
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_blorp.c | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_blorp.c b/src/mesa/drivers/dri/i965/brw_blorp.c index 727be63..3dcec1d 100644 --- a/src/mesa/drivers/dri/i965/brw_blorp.c +++ b/src/mesa/drivers/dri/i965/brw_blorp.c @@ -37,10 +37,36 @@ #define FILE_DEBUG_FLAG DEBUG_BLORP +static bool +brw_blorp_lookup_shader(struct blorp_context *blorp, + const void *key, uint32_t key_size, + uint32_t *kernel_out, void *prog_data_out) +{ + struct brw_context *brw = blorp->driver_ctx; + return brw_search_cache(&brw->cache, BRW_CACHE_BLORP_PROG, + key, key_size, kernel_out, prog_data_out); +} + +static void +brw_blorp_upload_shader(struct blorp_context *blorp, + const void *key, uint32_t key_size, + const void *kernel, uint32_t kernel_size, + const void *prog_data, uint32_t prog_data_size, + uint32_t *kernel_out, void *prog_data_out) +{ + struct brw_context *brw = blorp->driver_ctx; + brw_upload_cache(&brw->cache, BRW_CACHE_BLORP_PROG, key, key_size, + kernel, kernel_size, prog_data, prog_data_size, + kernel_out, prog_data_out); +} + void brw_blorp_init(struct brw_context *brw) { blorp_init(&brw->blorp, brw, &brw->isl_dev); + + brw->blorp.lookup_shader = brw_blorp_lookup_shader; + brw->blorp.upload_shader = brw_blorp_upload_shader; } static void |