diff options
Diffstat (limited to 'src/amd')
-rw-r--r-- | src/amd/vulkan/radv_pipeline_cache.c | 33 | ||||
-rw-r--r-- | src/amd/vulkan/radv_private.h | 7 |
2 files changed, 40 insertions, 0 deletions
diff --git a/src/amd/vulkan/radv_pipeline_cache.c b/src/amd/vulkan/radv_pipeline_cache.c index d721f8b9f9e..7924be0c909 100644 --- a/src/amd/vulkan/radv_pipeline_cache.c +++ b/src/amd/vulkan/radv_pipeline_cache.c @@ -122,6 +122,39 @@ radv_hash_shader(unsigned char *hash, struct radv_shader_module *module, _mesa_sha1_final(&ctx, hash); } +void +radv_hash_shaders(unsigned char *hash, + const VkPipelineShaderStageCreateInfo **stages, + const struct radv_pipeline_layout *layout, + const struct ac_shader_variant_key *keys, + uint32_t flags) +{ + struct mesa_sha1 ctx; + + _mesa_sha1_init(&ctx); + if (keys) + _mesa_sha1_update(&ctx, keys, sizeof(*keys) * MESA_SHADER_STAGES); + if (layout) + _mesa_sha1_update(&ctx, layout->sha1, sizeof(layout->sha1)); + + for (int i = 0; i < MESA_SHADER_STAGES; ++i) { + if (stages[i]) { + RADV_FROM_HANDLE(radv_shader_module, module, stages[i]->module); + const VkSpecializationInfo *spec_info = stages[i]->pSpecializationInfo; + + _mesa_sha1_update(&ctx, module->sha1, sizeof(module->sha1)); + _mesa_sha1_update(&ctx, stages[i]->pName, strlen(stages[i]->pName)); + 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_update(&ctx, &flags, 4); + _mesa_sha1_final(&ctx, hash); +} + static struct cache_entry * radv_pipeline_cache_search_unlocked(struct radv_pipeline_cache *cache, diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h index 5be07063407..3fb182b4e3b 100644 --- a/src/amd/vulkan/radv_private.h +++ b/src/amd/vulkan/radv_private.h @@ -986,6 +986,13 @@ radv_hash_shader(unsigned char *hash, struct radv_shader_module *module, const struct ac_shader_variant_key *key, uint32_t flags); +void +radv_hash_shaders(unsigned char *hash, + const VkPipelineShaderStageCreateInfo **stages, + const struct radv_pipeline_layout *layout, + const struct ac_shader_variant_key *keys, + uint32_t flags); + static inline gl_shader_stage vk_to_mesa_shader_stage(VkShaderStageFlagBits vk_stage) { |