On Thu, 2017-04-27 at 09:31 -0700, Jason Ekstrand wrote: > Shader hashing is very closely related to shader > compilation. Putting > them right next to each other in anv_pipeline makes it easier to > verify > that we're actually hashing everything we need to be hashing.
Maybe add that this version also hashes the shader stage. > --- > src/intel/vulkan/anv_pipeline.c | 59 > ++++++++++++++++++++++++++++------- > src/intel/vulkan/anv_pipeline_cache.c | 27 ---------------- > src/intel/vulkan/anv_private.h | 6 ---- > 3 files changed, 47 insertions(+), 45 deletions(-) > > diff --git a/src/intel/vulkan/anv_pipeline.c > b/src/intel/vulkan/anv_pipeline.c > index 9d0dc69..0685d0a 100644 > --- a/src/intel/vulkan/anv_pipeline.c > +++ b/src/intel/vulkan/anv_pipeline.c > @@ -331,6 +331,35 @@ populate_cs_prog_key(const struct > gen_device_info *devinfo, > populate_sampler_prog_key(devinfo, &key->tex); > } > > +static void > +anv_pipeline_hash_shader(struct anv_pipeline *pipeline, > + struct anv_shader_module *module, > + const char *entrypoint, > + gl_shader_stage stage, > + const VkSpecializationInfo *spec_info, > + const void *key, size_t key_size, > + unsigned char *sha1_out) > +{ > + struct mesa_sha1 ctx; > + > + _mesa_sha1_init(&ctx); > + if (pipeline->layout) { > + _mesa_sha1_update(&ctx, pipeline->layout->sha1, > + sizeof(pipeline->layout->sha1)); > + } > + _mesa_sha1_update(&ctx, module->sha1, sizeof(module->sha1)); > + _mesa_sha1_update(&ctx, entrypoint, strlen(entrypoint)); > + _mesa_sha1_update(&ctx, &stage, sizeof(stage)); > + /* hash in shader stage, pipeline layout? */ This comment above seems outdated. Reviewed-by: Iago Toral Quiroga <ito...@igalia.com> > + if (spec_info) { > + _mesa_sha1_update(&ctx, spec_info->pMapEntries, > + spec_info->mapEntryCount * > sizeof(*spec_info->pMapEntries)); > + _mesa_sha1_update(&ctx, spec_info->pData, spec_info- > >dataSize); > + } > + _mesa_sha1_update(&ctx, key, key_size); > + _mesa_sha1_final(&ctx, sha1_out); > +} > + > static nir_shader * > anv_pipeline_compile(struct anv_pipeline *pipeline, > struct anv_shader_module *module, > @@ -463,8 +492,9 @@ anv_pipeline_compile_vs(struct anv_pipeline > *pipeline, > populate_vs_prog_key(&pipeline->device->info, &key); > > if (cache) { > - anv_hash_shader(sha1, &key, sizeof(key), module, entrypoint, > - pipeline->layout, spec_info); > + anv_pipeline_hash_shader(pipeline, module, entrypoint, > + MESA_SHADER_VERTEX, spec_info, > + &key, sizeof(key), sha1); > bin = anv_pipeline_cache_search(cache, sha1, 20); > } > > @@ -587,10 +617,12 @@ anv_pipeline_compile_tcs_tes(struct > anv_pipeline *pipeline, > tcs_key.input_vertices = info->pTessellationState- > >patchControlPoints; > > if (cache) { > - anv_hash_shader(tcs_sha1, &tcs_key, sizeof(tcs_key), > tcs_module, > - tcs_entrypoint, pipeline->layout, > tcs_spec_info); > - anv_hash_shader(tes_sha1, &tes_key, sizeof(tes_key), > tes_module, > - tes_entrypoint, pipeline->layout, > tes_spec_info); > + anv_pipeline_hash_shader(pipeline, tcs_module, tcs_entrypoint, > + MESA_SHADER_TESS_CTRL, tcs_spec_info, > + &tcs_key, sizeof(tcs_key), tcs_sha1); > + anv_pipeline_hash_shader(pipeline, tes_module, tes_entrypoint, > + MESA_SHADER_TESS_EVAL, tes_spec_info, > + &tes_key, sizeof(tes_key), tes_sha1); > memcpy(&tcs_sha1[20], tes_sha1, 20); > memcpy(&tes_sha1[20], tcs_sha1, 20); > tcs_bin = anv_pipeline_cache_search(cache, tcs_sha1, > sizeof(tcs_sha1)); > @@ -724,8 +756,9 @@ anv_pipeline_compile_gs(struct anv_pipeline > *pipeline, > populate_gs_prog_key(&pipeline->device->info, &key); > > if (cache) { > - anv_hash_shader(sha1, &key, sizeof(key), module, entrypoint, > - pipeline->layout, spec_info); > + anv_pipeline_hash_shader(pipeline, module, entrypoint, > + MESA_SHADER_GEOMETRY, spec_info, > + &key, sizeof(key), sha1); > bin = anv_pipeline_cache_search(cache, sha1, 20); > } > > @@ -801,8 +834,9 @@ anv_pipeline_compile_fs(struct anv_pipeline > *pipeline, > populate_wm_prog_key(pipeline, info, &key); > > if (cache) { > - anv_hash_shader(sha1, &key, sizeof(key), module, entrypoint, > - pipeline->layout, spec_info); > + anv_pipeline_hash_shader(pipeline, module, entrypoint, > + MESA_SHADER_FRAGMENT, spec_info, > + &key, sizeof(key), sha1); > bin = anv_pipeline_cache_search(cache, sha1, 20); > } > > @@ -923,8 +957,9 @@ anv_pipeline_compile_cs(struct anv_pipeline > *pipeline, > populate_cs_prog_key(&pipeline->device->info, &key); > > if (cache) { > - anv_hash_shader(sha1, &key, sizeof(key), module, entrypoint, > - pipeline->layout, spec_info); > + anv_pipeline_hash_shader(pipeline, module, entrypoint, > + MESA_SHADER_COMPUTE, spec_info, > + &key, sizeof(key), sha1); > bin = anv_pipeline_cache_search(cache, sha1, 20); > } > > diff --git a/src/intel/vulkan/anv_pipeline_cache.c > b/src/intel/vulkan/anv_pipeline_cache.c > index cdd8215..cbca14a 100644 > --- a/src/intel/vulkan/anv_pipeline_cache.c > +++ b/src/intel/vulkan/anv_pipeline_cache.c > @@ -21,7 +21,6 @@ > * IN THE SOFTWARE. > */ > > -#include "util/mesa-sha1.h" > #include "util/hash_table.h" > #include "util/debug.h" > #include "anv_private.h" > @@ -198,32 +197,6 @@ anv_pipeline_cache_finish(struct > anv_pipeline_cache *cache) > } > } > > -void > -anv_hash_shader(unsigned char *hash, const void *key, size_t > key_size, > - struct anv_shader_module *module, > - const char *entrypoint, > - const struct anv_pipeline_layout *pipeline_layout, > - const VkSpecializationInfo *spec_info) > -{ > - struct mesa_sha1 ctx; > - > - _mesa_sha1_init(&ctx); > - _mesa_sha1_update(&ctx, key, key_size); > - _mesa_sha1_update(&ctx, module->sha1, sizeof(module->sha1)); > - _mesa_sha1_update(&ctx, entrypoint, strlen(entrypoint)); > - if (pipeline_layout) { > - _mesa_sha1_update(&ctx, pipeline_layout->sha1, > - sizeof(pipeline_layout->sha1)); > - } > - /* hash in shader stage, pipeline layout? */ > - if (spec_info) { > - _mesa_sha1_update(&ctx, spec_info->pMapEntries, > - spec_info->mapEntryCount * sizeof spec_info- > >pMapEntries[0]); > - _mesa_sha1_update(&ctx, spec_info->pData, spec_info- > >dataSize); > - } > - _mesa_sha1_final(&ctx, hash); > -} > - > static struct anv_shader_bin * > anv_pipeline_cache_search_locked(struct anv_pipeline_cache *cache, > const void *key_data, uint32_t > key_size) > diff --git a/src/intel/vulkan/anv_private.h > b/src/intel/vulkan/anv_private.h > index 47d8cd2..b7a9bbf 100644 > --- a/src/intel/vulkan/anv_private.h > +++ b/src/intel/vulkan/anv_private.h > @@ -1686,12 +1686,6 @@ struct anv_shader_module { > char data[0]; > }; > > -void anv_hash_shader(unsigned char *hash, const void *key, size_t > key_size, > - struct anv_shader_module *module, > - const char *entrypoint, > - const struct anv_pipeline_layout > *pipeline_layout, > - const VkSpecializationInfo *spec_info); > - > static inline gl_shader_stage > vk_to_mesa_shader_stage(VkShaderStageFlagBits vk_stage) > { _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev