[Mesa-dev] [PATCH v2 02/31] i965/blorp: Expose the shader cache through function pointers

Pohjolainen, Topi topi.pohjolainen at gmail.com
Mon Aug 29 05:50:51 UTC 2016


On Fri, Aug 26, 2016 at 06:58:27PM -0700, Jason Ekstrand wrote:
> 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.

Reviewed-by: Topi Pohjolainen <topi.pohjolainen at intel.com>

> 
> Signed-off-by: Jason Ekstrand <jason at jlekstrand.net>
> Cc: Topi Pohjolainen <topi.pohjolainen at intel.com>
> 
> ---
> 
> This replaces patch 2 from the original series.
> 
>  src/mesa/drivers/dri/i965/blorp.h       |  9 +++++++++
>  src/mesa/drivers/dri/i965/blorp_blit.c  | 15 ++++++---------
>  src/mesa/drivers/dri/i965/blorp_clear.c | 15 ++++++---------
>  src/mesa/drivers/dri/i965/brw_blorp.c   | 26 ++++++++++++++++++++++++++
>  4 files changed, 47 insertions(+), 18 deletions(-)
> 
> diff --git a/src/mesa/drivers/dri/i965/blorp.h b/src/mesa/drivers/dri/i965/blorp.h
> index 7dbf022..602d97e 100644
> --- a/src/mesa/drivers/dri/i965/blorp.h
> +++ b/src/mesa/drivers/dri/i965/blorp.h
> @@ -41,6 +41,15 @@ struct blorp_context {
>     void *driver_ctx;
>  
>     const struct isl_device *isl_dev;
> +
> +   bool (*lookup_shader)(struct blorp_context *blorp,
> +                         const void *key, uint32_t key_size,
> +                         uint32_t *kernel_out, void *prog_data_out);
> +   void (*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);
>  };
>  
>  void blorp_init(struct blorp_context *blorp, void *driver_ctx,
> diff --git a/src/mesa/drivers/dri/i965/blorp_blit.c b/src/mesa/drivers/dri/i965/blorp_blit.c
> index a4b3fe0..0291e01 100644
> --- a/src/mesa/drivers/dri/i965/blorp_blit.c
> +++ b/src/mesa/drivers/dri/i965/blorp_blit.c
> @@ -32,7 +32,6 @@
>  
>  #include "blorp_priv.h"
>  #include "brw_context.h"
> -#include "brw_state.h"
>  #include "brw_meta_util.h"
>  
>  #define FILE_DEBUG_FLAG DEBUG_BLORP
> @@ -1196,9 +1195,8 @@ brw_blorp_get_blit_kernel(struct brw_context *brw,
>                            struct brw_blorp_params *params,
>                            const struct brw_blorp_blit_prog_key *prog_key)
>  {
> -   if (brw_search_cache(&brw->cache, BRW_CACHE_BLORP_PROG,
> -                        prog_key, sizeof(*prog_key),
> -                        &params->wm_prog_kernel, &params->wm_prog_data))
> +   if (brw->blorp.lookup_shader(&brw->blorp, prog_key, sizeof(*prog_key),
> +                                &params->wm_prog_kernel, &params->wm_prog_data))
>        return;
>  
>     const unsigned *program;
> @@ -1219,11 +1217,10 @@ brw_blorp_get_blit_kernel(struct brw_context *brw,
>     program = brw_blorp_compile_nir_shader(brw, nir, &wm_key, false,
>                                            &prog_data, &program_size);
>  
> -   brw_upload_cache(&brw->cache, BRW_CACHE_BLORP_PROG,
> -                    prog_key, sizeof(*prog_key),
> -                    program, program_size,
> -                    &prog_data, sizeof(prog_data),
> -                    &params->wm_prog_kernel, &params->wm_prog_data);
> +   brw->blorp.upload_shader(&brw->blorp, prog_key, sizeof(*prog_key),
> +                            program, program_size,
> +                            &prog_data, sizeof(prog_data),
> +                            &params->wm_prog_kernel, &params->wm_prog_data);
>  }
>  
>  static void
> diff --git a/src/mesa/drivers/dri/i965/blorp_clear.c b/src/mesa/drivers/dri/i965/blorp_clear.c
> index 2da08f8..5b8ceec 100644
> --- a/src/mesa/drivers/dri/i965/blorp_clear.c
> +++ b/src/mesa/drivers/dri/i965/blorp_clear.c
> @@ -35,7 +35,6 @@
>  #include "brw_meta_util.h"
>  #include "brw_context.h"
>  #include "brw_eu.h"
> -#include "brw_state.h"
>  
>  #include "nir_builder.h"
>  
> @@ -56,9 +55,8 @@ brw_blorp_params_get_clear_kernel(struct brw_context *brw,
>     memset(&blorp_key, 0, sizeof(blorp_key));
>     blorp_key.use_simd16_replicated_data = use_replicated_data;
>  
> -   if (brw_search_cache(&brw->cache, BRW_CACHE_BLORP_PROG,
> -                        &blorp_key, sizeof(blorp_key),
> -                        &params->wm_prog_kernel, &params->wm_prog_data))
> +   if (brw->blorp.lookup_shader(&brw->blorp, &blorp_key, sizeof(blorp_key),
> +                                &params->wm_prog_kernel, &params->wm_prog_data))
>        return;
>  
>     void *mem_ctx = ralloc_context(NULL);
> @@ -88,11 +86,10 @@ brw_blorp_params_get_clear_kernel(struct brw_context *brw,
>        brw_blorp_compile_nir_shader(brw, b.shader, &wm_key, use_replicated_data,
>                                     &prog_data, &program_size);
>  
> -   brw_upload_cache(&brw->cache, BRW_CACHE_BLORP_PROG,
> -                    &blorp_key, sizeof(blorp_key),
> -                    program, program_size,
> -                    &prog_data, sizeof(prog_data),
> -                    &params->wm_prog_kernel, &params->wm_prog_data);
> +   brw->blorp.upload_shader(&brw->blorp, &blorp_key, sizeof(blorp_key),
> +                            program, program_size,
> +                            &prog_data, sizeof(prog_data),
> +                            &params->wm_prog_kernel, &params->wm_prog_data);
>  
>     ralloc_free(mem_ctx);
>  }
> 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
> -- 
> 2.5.0.400.gff86faf
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list