X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fintel%2Fvulkan%2Fanv_pipeline_cache.c;h=e1d48b879b07effede1be87a0355a76b0e36a120;hb=f118ca20758c85da1aaf1792e61aadb298b32a47;hp=911427b7bf811318a7459fc37881715adef22d99;hpb=39925d60ecfb3d41c65b37d2d72710aff4aa83d1;p=mesa.git diff --git a/src/intel/vulkan/anv_pipeline_cache.c b/src/intel/vulkan/anv_pipeline_cache.c index 911427b7bf8..e1d48b879b0 100644 --- a/src/intel/vulkan/anv_pipeline_cache.c +++ b/src/intel/vulkan/anv_pipeline_cache.c @@ -21,7 +21,7 @@ * IN THE SOFTWARE. */ -#include "compiler/blob.h" +#include "util/blob.h" #include "util/hash_table.h" #include "util/debug.h" #include "util/disk_cache.h" @@ -37,6 +37,7 @@ anv_shader_bin_create(struct anv_device *device, const void *constant_data, uint32_t constant_data_size, const struct brw_stage_prog_data *prog_data_in, uint32_t prog_data_size, const void *prog_data_param_in, + const struct brw_compile_stats *stats, uint32_t num_stats, const nir_xfb_info *xfb_info_in, const struct anv_pipeline_bind_map *bind_map) { @@ -93,6 +94,10 @@ anv_shader_bin_create(struct anv_device *device, shader->prog_data = prog_data; shader->prog_data_size = prog_data_size; + assert(num_stats <= ARRAY_SIZE(shader->stats)); + typed_memcpy(shader->stats, stats, num_stats); + shader->num_stats = num_stats; + if (xfb_info_in) { *xfb_info = *xfb_info_in; typed_memcpy(xfb_info->outputs, xfb_info_in->outputs, @@ -127,44 +132,45 @@ static bool anv_shader_bin_write_to_blob(const struct anv_shader_bin *shader, struct blob *blob) { - bool ok; + blob_write_uint32(blob, shader->key->size); + blob_write_bytes(blob, shader->key->data, shader->key->size); - ok = blob_write_uint32(blob, shader->key->size); - ok = blob_write_bytes(blob, shader->key->data, shader->key->size); + blob_write_uint32(blob, shader->kernel_size); + blob_write_bytes(blob, shader->kernel.map, shader->kernel_size); - ok = blob_write_uint32(blob, shader->kernel_size); - ok = blob_write_bytes(blob, shader->kernel.map, shader->kernel_size); + blob_write_uint32(blob, shader->constant_data_size); + blob_write_bytes(blob, shader->constant_data.map, + shader->constant_data_size); - ok = blob_write_uint32(blob, shader->constant_data_size); - ok = blob_write_bytes(blob, shader->constant_data.map, - shader->constant_data_size); + blob_write_uint32(blob, shader->prog_data_size); + blob_write_bytes(blob, shader->prog_data, shader->prog_data_size); + blob_write_bytes(blob, shader->prog_data->param, + shader->prog_data->nr_params * + sizeof(*shader->prog_data->param)); - ok = blob_write_uint32(blob, shader->prog_data_size); - ok = blob_write_bytes(blob, shader->prog_data, shader->prog_data_size); - ok = blob_write_bytes(blob, shader->prog_data->param, - shader->prog_data->nr_params * - sizeof(*shader->prog_data->param)); + blob_write_uint32(blob, shader->num_stats); + blob_write_bytes(blob, shader->stats, + shader->num_stats * sizeof(shader->stats[0])); if (shader->xfb_info) { uint32_t xfb_info_size = nir_xfb_info_size(shader->xfb_info->output_count); - ok = blob_write_uint32(blob, xfb_info_size); - ok = blob_write_bytes(blob, shader->xfb_info, xfb_info_size); + blob_write_uint32(blob, xfb_info_size); + blob_write_bytes(blob, shader->xfb_info, xfb_info_size); } else { - ok = blob_write_uint32(blob, 0); + blob_write_uint32(blob, 0); } - ok = blob_write_uint32(blob, shader->bind_map.surface_count); - ok = blob_write_uint32(blob, shader->bind_map.sampler_count); - ok = blob_write_uint32(blob, shader->bind_map.image_count); - ok = blob_write_bytes(blob, shader->bind_map.surface_to_descriptor, - shader->bind_map.surface_count * - sizeof(*shader->bind_map.surface_to_descriptor)); - ok = blob_write_bytes(blob, shader->bind_map.sampler_to_descriptor, - shader->bind_map.sampler_count * - sizeof(*shader->bind_map.sampler_to_descriptor)); - - return ok; + blob_write_uint32(blob, shader->bind_map.surface_count); + blob_write_uint32(blob, shader->bind_map.sampler_count); + blob_write_bytes(blob, shader->bind_map.surface_to_descriptor, + shader->bind_map.surface_count * + sizeof(*shader->bind_map.surface_to_descriptor)); + blob_write_bytes(blob, shader->bind_map.sampler_to_descriptor, + shader->bind_map.sampler_count * + sizeof(*shader->bind_map.sampler_to_descriptor)); + + return !blob->out_of_memory; } static struct anv_shader_bin * @@ -188,6 +194,10 @@ anv_shader_bin_create_from_blob(struct anv_device *device, const void *prog_data_param = blob_read_bytes(blob, prog_data->nr_params * sizeof(*prog_data->param)); + uint32_t num_stats = blob_read_uint32(blob); + const struct brw_compile_stats *stats = + blob_read_bytes(blob, num_stats * sizeof(stats[0])); + const nir_xfb_info *xfb_info = NULL; uint32_t xfb_size = blob_read_uint32(blob); if (xfb_size) @@ -196,7 +206,6 @@ anv_shader_bin_create_from_blob(struct anv_device *device, struct anv_pipeline_bind_map bind_map; bind_map.surface_count = blob_read_uint32(blob); bind_map.sampler_count = blob_read_uint32(blob); - bind_map.image_count = blob_read_uint32(blob); bind_map.surface_to_descriptor = (void *) blob_read_bytes(blob, bind_map.surface_count * sizeof(*bind_map.surface_to_descriptor)); @@ -212,7 +221,7 @@ anv_shader_bin_create_from_blob(struct anv_device *device, kernel_data, kernel_size, constant_data, constant_data_size, prog_data, prog_data_size, prog_data_param, - xfb_info, &bind_map); + stats, num_stats, xfb_info, &bind_map); } /* Remaining work: @@ -363,6 +372,8 @@ anv_pipeline_cache_add_shader_locked(struct anv_pipeline_cache *cache, const struct brw_stage_prog_data *prog_data, uint32_t prog_data_size, const void *prog_data_param, + const struct brw_compile_stats *stats, + uint32_t num_stats, const nir_xfb_info *xfb_info, const struct anv_pipeline_bind_map *bind_map) { @@ -376,7 +387,7 @@ anv_pipeline_cache_add_shader_locked(struct anv_pipeline_cache *cache, kernel_data, kernel_size, constant_data, constant_data_size, prog_data, prog_data_size, prog_data_param, - xfb_info, bind_map); + stats, num_stats, xfb_info, bind_map); if (!bin) return NULL; @@ -393,6 +404,8 @@ anv_pipeline_cache_upload_kernel(struct anv_pipeline_cache *cache, uint32_t constant_data_size, const struct brw_stage_prog_data *prog_data, uint32_t prog_data_size, + const struct brw_compile_stats *stats, + uint32_t num_stats, const nir_xfb_info *xfb_info, const struct anv_pipeline_bind_map *bind_map) { @@ -405,6 +418,7 @@ anv_pipeline_cache_upload_kernel(struct anv_pipeline_cache *cache, constant_data, constant_data_size, prog_data, prog_data_size, prog_data->param, + stats, num_stats, xfb_info, bind_map); pthread_mutex_unlock(&cache->mutex); @@ -421,6 +435,7 @@ anv_pipeline_cache_upload_kernel(struct anv_pipeline_cache *cache, constant_data, constant_data_size, prog_data, prog_data_size, prog_data->param, + stats, num_stats, xfb_info, bind_map); } } @@ -613,14 +628,19 @@ VkResult anv_MergePipelineCaches( struct anv_shader_bin * anv_device_search_for_kernel(struct anv_device *device, struct anv_pipeline_cache *cache, - const void *key_data, uint32_t key_size) + const void *key_data, uint32_t key_size, + bool *user_cache_hit) { struct anv_shader_bin *bin; + *user_cache_hit = false; + if (cache) { bin = anv_pipeline_cache_search(cache, key_data, key_size); - if (bin) + if (bin) { + *user_cache_hit = cache != &device->default_pipeline_cache; return bin; + } } #ifdef ENABLE_SHADER_CACHE @@ -658,6 +678,8 @@ anv_device_upload_kernel(struct anv_device *device, uint32_t constant_data_size, const struct brw_stage_prog_data *prog_data, uint32_t prog_data_size, + const struct brw_compile_stats *stats, + uint32_t num_stats, const nir_xfb_info *xfb_info, const struct anv_pipeline_bind_map *bind_map) { @@ -667,6 +689,7 @@ anv_device_upload_kernel(struct anv_device *device, kernel_data, kernel_size, constant_data, constant_data_size, prog_data, prog_data_size, + stats, num_stats, xfb_info, bind_map); } else { bin = anv_shader_bin_create(device, key_data, key_size, @@ -674,6 +697,7 @@ anv_device_upload_kernel(struct anv_device *device, constant_data, constant_data_size, prog_data, prog_data_size, prog_data->param, + stats, num_stats, xfb_info, bind_map); } @@ -685,9 +709,7 @@ anv_device_upload_kernel(struct anv_device *device, if (disk_cache) { struct blob binary; blob_init(&binary); - anv_shader_bin_write_to_blob(bin, &binary); - - if (!binary.out_of_memory) { + if (anv_shader_bin_write_to_blob(bin, &binary)) { cache_key cache_key; disk_cache_compute_key(disk_cache, key_data, key_size, cache_key); @@ -757,7 +779,7 @@ anv_device_upload_nir(struct anv_device *device, struct blob blob; blob_init(&blob); - nir_serialize(&blob, nir); + nir_serialize(&blob, nir, false); if (blob.out_of_memory) { blob_finish(&blob); return; @@ -770,6 +792,7 @@ anv_device_upload_nir(struct anv_device *device, */ entry = _mesa_hash_table_search(cache->nir_cache, sha1_key); if (entry) { + blob_finish(&blob); pthread_mutex_unlock(&cache->mutex); return; } @@ -780,6 +803,8 @@ anv_device_upload_nir(struct anv_device *device, snir->size = blob.size; memcpy(snir->data, blob.data, blob.size); + blob_finish(&blob); + _mesa_hash_table_insert(cache->nir_cache, snir->sha1_key, snir); pthread_mutex_unlock(&cache->mutex);