[Mesa-dev] [PATCH] anv/pipeline: Add support for caching the push constant map

Kristian Høgsberg krh at bitplanet.net
Mon Jun 6 00:44:26 UTC 2016


On Sat, Jun 4, 2016 at 3:39 PM, Jason Ekstrand <jason at jlekstrand.net> wrote:
> Signed-off-by: Jason Ekstrand <jason at jlekstrand.net>
> Cc: Kristian Høgsberg Kristensen <krh at bitplanet.net>

Thanks for adding this, looks good to me. The copying of prog_data in
anv_pipeline_cache_load() is a little fiddly, but I got nothing
better...

Reviewed-by: Kristian Høgsberg <krh at bitplanet.net>

> ---
>  src/intel/vulkan/anv_pipeline_cache.c | 33 +++++++++++++++++++++++++++++----
>  1 file changed, 29 insertions(+), 4 deletions(-)
>
> diff --git a/src/intel/vulkan/anv_pipeline_cache.c b/src/intel/vulkan/anv_pipeline_cache.c
> index 62dbe3e..f75c423 100644
> --- a/src/intel/vulkan/anv_pipeline_cache.c
> +++ b/src/intel/vulkan/anv_pipeline_cache.c
> @@ -89,11 +89,15 @@ entry_size(struct cache_entry *entry)
>      * doesn't include the alignment padding bytes.
>      */
>
> +   struct brw_stage_prog_data *prog_data = (void *)entry->prog_data;
> +   const uint32_t param_size =
> +      prog_data->nr_params * sizeof(*prog_data->param);
> +
>     const uint32_t map_size =
>        entry->surface_count * sizeof(struct anv_pipeline_binding) +
>        entry->sampler_count * sizeof(struct anv_pipeline_binding);
>
> -   return sizeof(*entry) + entry->prog_data_size + map_size;
> +   return sizeof(*entry) + entry->prog_data_size + param_size + map_size;
>  }
>
>  void
> @@ -141,6 +145,7 @@ anv_pipeline_cache_search_unlocked(struct anv_pipeline_cache *cache,
>              void *p = entry->prog_data;
>              *prog_data = p;
>              p += entry->prog_data_size;
> +            p += (*prog_data)->nr_params * sizeof(*(*prog_data)->param);
>              map->surface_count = entry->surface_count;
>              map->sampler_count = entry->sampler_count;
>              map->image_count = entry->image_count;
> @@ -267,12 +272,18 @@ anv_pipeline_cache_upload_kernel(struct anv_pipeline_cache *cache,
>
>     struct cache_entry *entry;
>
> +   assert((*prog_data)->nr_pull_params == 0);
> +   assert((*prog_data)->nr_image_params == 0);
> +
> +   const uint32_t param_size =
> +      (*prog_data)->nr_params * sizeof(*(*prog_data)->param);
> +
>     const uint32_t map_size =
>        map->surface_count * sizeof(struct anv_pipeline_binding) +
>        map->sampler_count * sizeof(struct anv_pipeline_binding);
>
>     const uint32_t preamble_size =
> -      align_u32(sizeof(*entry) + prog_data_size + map_size, 64);
> +      align_u32(sizeof(*entry) + prog_data_size + param_size + map_size, 64);
>
>     const uint32_t size = preamble_size + kernel_size;
>
> @@ -291,6 +302,10 @@ anv_pipeline_cache_upload_kernel(struct anv_pipeline_cache *cache,
>     memcpy(p, *prog_data, prog_data_size);
>     p += prog_data_size;
>
> +   memcpy(p, (*prog_data)->param, param_size);
> +   ((struct brw_stage_prog_data *)entry->prog_data)->param = p;
> +   p += param_size;
> +
>     memcpy(p, map->surface_to_descriptor,
>            map->surface_count * sizeof(struct anv_pipeline_binding));
>     map->surface_to_descriptor = p;
> @@ -358,9 +373,17 @@ anv_pipeline_cache_load(struct anv_pipeline_cache *cache,
>        struct cache_entry *entry = p;
>
>        void *data = entry->prog_data;
> -      const struct brw_stage_prog_data *prog_data = data;
> +
> +      /* Make a copy of prog_data so that it's mutable */
> +      uint8_t prog_data_tmp[512];
> +      assert(entry->prog_data_size <= sizeof(prog_data_tmp));
> +      memcpy(prog_data_tmp, data, entry->prog_data_size);
> +      struct brw_stage_prog_data *prog_data = (void *)prog_data_tmp;
>        data += entry->prog_data_size;
>
> +      prog_data->param = data;
> +      data += prog_data->nr_params * sizeof(*prog_data->param);
> +
>        struct anv_pipeline_binding *surface_to_descriptor = data;
>        data += entry->surface_count * sizeof(struct anv_pipeline_binding);
>        struct anv_pipeline_binding *sampler_to_descriptor = data;
> @@ -375,9 +398,11 @@ anv_pipeline_cache_load(struct anv_pipeline_cache *cache,
>           .sampler_to_descriptor = sampler_to_descriptor
>        };
>
> +      const struct brw_stage_prog_data *const_prog_data = prog_data;
> +
>        anv_pipeline_cache_upload_kernel(cache, entry->sha1,
>                                         kernel, entry->kernel_size,
> -                                       &prog_data,
> +                                       &const_prog_data,
>                                         entry->prog_data_size, &map);
>        p = kernel + entry->kernel_size;
>     }
> --
> 2.5.0.400.gff86faf
>


More information about the mesa-dev mailing list