Mesa (main): radv: store the shader sha1 to radv_pipeline_stage
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Tue Apr 12 06:30:37 UTC 2022
Module: Mesa
Branch: main
Commit: b48231cb9096f0ded970bfe25aff1912348ab994
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=b48231cb9096f0ded970bfe25aff1912348ab994
Author: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Date: Fri Apr 8 15:55:19 2022 +0200
radv: store the shader sha1 to radv_pipeline_stage
To remove use of shader modules completely in the next commit.
Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Reviewed-by: Timur Kristóf <timur.kristof at gmail.com>
Reviewed-by: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15847>
---
src/amd/vulkan/radv_pipeline.c | 25 ++++++++++++++++++++++++-
src/amd/vulkan/radv_pipeline_cache.c | 20 +++++++-------------
src/amd/vulkan/radv_private.h | 6 ++++--
3 files changed, 35 insertions(+), 16 deletions(-)
diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c
index 9e403a53ec7..473c5887459 100644
--- a/src/amd/vulkan/radv_pipeline.c
+++ b/src/amd/vulkan/radv_pipeline.c
@@ -4086,6 +4086,25 @@ radv_lower_fs_output(nir_shader *nir, const struct radv_pipeline_key *pipeline_k
return progress;
}
+static void
+radv_pipeline_hash_shader(const unsigned char *spirv_sha1, const uint32_t spirv_sha1_size,
+ const char *entrypoint, gl_shader_stage stage,
+ const VkSpecializationInfo *spec_info, unsigned char *sha1_out)
+{
+ struct mesa_sha1 ctx;
+ _mesa_sha1_init(&ctx);
+
+ _mesa_sha1_update(&ctx, spirv_sha1, spirv_sha1_size);
+ _mesa_sha1_update(&ctx, entrypoint, strlen(entrypoint));
+ 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_final(&ctx, sha1_out);
+}
+
VkResult
radv_create_shaders(struct radv_pipeline *pipeline, struct radv_pipeline_layout *pipeline_layout,
struct radv_device *device, struct radv_pipeline_cache *cache,
@@ -4134,6 +4153,10 @@ radv_create_shaders(struct radv_pipeline *pipeline, struct radv_pipeline_layout
stages[stage].module->sha1);
}
+ radv_pipeline_hash_shader(stages[stage].module->sha1, sizeof(stages[stage].module->sha1),
+ stages[stage].entrypoint, stage, stages[stage].spec_info,
+ stages[stage].shader_sha1);
+
pipeline->active_stages |= sinfo->stage;
}
@@ -4161,7 +4184,7 @@ radv_create_shaders(struct radv_pipeline *pipeline, struct radv_pipeline_layout
if (custom_hash)
memcpy(hash, custom_hash, 20);
else {
- radv_hash_shaders(hash, pStages, stageCount, pipeline_layout, pipeline_key,
+ radv_hash_shaders(hash, stages, pipeline_layout, pipeline_key,
radv_get_hash_flags(device, keep_statistic_info));
}
diff --git a/src/amd/vulkan/radv_pipeline_cache.c b/src/amd/vulkan/radv_pipeline_cache.c
index d3ab551f668..238f6a3ea1d 100644
--- a/src/amd/vulkan/radv_pipeline_cache.c
+++ b/src/amd/vulkan/radv_pipeline_cache.c
@@ -118,9 +118,9 @@ entry_size(struct cache_entry *entry)
}
void
-radv_hash_shaders(unsigned char *hash, const VkPipelineShaderStageCreateInfo *stages,
- uint32_t stageCount, const struct radv_pipeline_layout *layout,
- const struct radv_pipeline_key *key, uint32_t flags)
+radv_hash_shaders(unsigned char *hash, const struct radv_pipeline_stage *stages,
+ const struct radv_pipeline_layout *layout, const struct radv_pipeline_key *key,
+ uint32_t flags)
{
struct mesa_sha1 ctx;
@@ -130,17 +130,11 @@ radv_hash_shaders(unsigned char *hash, const VkPipelineShaderStageCreateInfo *st
if (layout)
_mesa_sha1_update(&ctx, layout->sha1, sizeof(layout->sha1));
- for (uint32_t i = 0; i < stageCount; i++) {
- RADV_FROM_HANDLE(vk_shader_module, module, stages[i].module);
- const VkSpecializationInfo *spec_info = stages[i].pSpecializationInfo;
+ for (unsigned s = 0; s < MESA_VULKAN_SHADER_STAGES; s++) {
+ if (!stages[s].entrypoint)
+ continue;
- _mesa_sha1_update(&ctx, module->sha1, sizeof(module->sha1));
- _mesa_sha1_update(&ctx, stages[i].pName, strlen(stages[i].pName));
- if (spec_info && spec_info->mapEntryCount) {
- _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, stages[s].shader_sha1, sizeof(stages[s].shader_sha1));
}
_mesa_sha1_update(&ctx, &flags, 4);
_mesa_sha1_final(&ctx, hash);
diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h
index f774ac951c0..c28aa186847 100644
--- a/src/amd/vulkan/radv_private.h
+++ b/src/amd/vulkan/radv_private.h
@@ -1746,8 +1746,8 @@ struct radv_event {
struct radv_pipeline_key;
-void radv_hash_shaders(unsigned char *hash, const VkPipelineShaderStageCreateInfo *stages,
- uint32_t stageCount, const struct radv_pipeline_layout *layout,
+void radv_hash_shaders(unsigned char *hash, const struct radv_pipeline_stage *stages,
+ const struct radv_pipeline_layout *layout,
const struct radv_pipeline_key *key, uint32_t flags);
void radv_hash_rt_shaders(unsigned char *hash, const VkRayTracingPipelineCreateInfoKHR *pCreateInfo,
@@ -1932,6 +1932,8 @@ struct radv_pipeline_stage {
const char *entrypoint;
const VkSpecializationInfo *spec_info;
+ unsigned char shader_sha1[20];
+
nir_shader *nir;
struct radv_shader_info info;
More information about the mesa-commit
mailing list