vulkan: Migrate shader module hash to BLAKE3.
Shaders are the largest thing we hash now, so they benefit from a faster hash. Change the field name from `sha1` to `hash` to avoid tying the definition to a particular algorithm. This doubles down as a precaution against callers still assuming a 20-byte hash (in which case the compilation will error out). Reviewed-by: Daniel Schürmann <daniel@schuermann.dev> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22571>
This commit is contained in:

committed by
Marge Bot

parent
e5173e62d7
commit
b69a1b4153
@@ -1099,7 +1099,7 @@ radv_copy_shader_stage_create_info(struct radv_device *device, uint32_t stageCou
|
|||||||
vk_object_base_init(&device->vk, &new_module->base, VK_OBJECT_TYPE_SHADER_MODULE);
|
vk_object_base_init(&device->vk, &new_module->base, VK_OBJECT_TYPE_SHADER_MODULE);
|
||||||
|
|
||||||
new_module->nir = NULL;
|
new_module->nir = NULL;
|
||||||
memcpy(new_module->sha1, module->sha1, sizeof(module->sha1));
|
memcpy(new_module->hash, module->hash, sizeof(module->hash));
|
||||||
new_module->size = module->size;
|
new_module->size = module->size;
|
||||||
memcpy(new_module->data, module->data, module->size);
|
memcpy(new_module->data, module->data, module->size);
|
||||||
|
|
||||||
|
@@ -32,6 +32,7 @@
|
|||||||
#include "nir_serialize.h"
|
#include "nir_serialize.h"
|
||||||
|
|
||||||
#include "util/mesa-sha1.h"
|
#include "util/mesa-sha1.h"
|
||||||
|
#include "util/mesa-blake3.h"
|
||||||
|
|
||||||
bool
|
bool
|
||||||
vk_pipeline_shader_stage_is_null(const VkPipelineShaderStageCreateInfo *info)
|
vk_pipeline_shader_stage_is_null(const VkPipelineShaderStageCreateInfo *info)
|
||||||
@@ -176,12 +177,12 @@ vk_pipeline_hash_shader_stage(const VkPipelineShaderStageCreateInfo *info,
|
|||||||
_mesa_sha1_update(&ctx, &info->stage, sizeof(info->stage));
|
_mesa_sha1_update(&ctx, &info->stage, sizeof(info->stage));
|
||||||
|
|
||||||
if (module) {
|
if (module) {
|
||||||
_mesa_sha1_update(&ctx, module->sha1, sizeof(module->sha1));
|
_mesa_sha1_update(&ctx, module->hash, sizeof(module->hash));
|
||||||
} else if (minfo) {
|
} else if (minfo) {
|
||||||
unsigned char spirv_sha1[SHA1_DIGEST_LENGTH];
|
blake3_hash spirv_hash;
|
||||||
|
|
||||||
_mesa_sha1_compute(minfo->pCode, minfo->codeSize, spirv_sha1);
|
_mesa_blake3_compute(minfo->pCode, minfo->codeSize, spirv_hash);
|
||||||
_mesa_sha1_update(&ctx, spirv_sha1, sizeof(spirv_sha1));
|
_mesa_sha1_update(&ctx, spirv_hash, sizeof(spirv_hash));
|
||||||
} else {
|
} else {
|
||||||
/* It is legal to pass in arbitrary identifiers as long as they don't exceed
|
/* It is legal to pass in arbitrary identifiers as long as they don't exceed
|
||||||
* the limit. Shaders with bogus identifiers are more or less guaranteed to fail. */
|
* the limit. Shaders with bogus identifiers are more or less guaranteed to fail. */
|
||||||
|
@@ -23,7 +23,6 @@
|
|||||||
|
|
||||||
#include "vk_shader_module.h"
|
#include "vk_shader_module.h"
|
||||||
|
|
||||||
#include "util/mesa-sha1.h"
|
|
||||||
#include "vk_alloc.h"
|
#include "vk_alloc.h"
|
||||||
#include "vk_common_entrypoints.h"
|
#include "vk_common_entrypoints.h"
|
||||||
#include "vk_device.h"
|
#include "vk_device.h"
|
||||||
@@ -43,7 +42,7 @@ void vk_shader_module_init(struct vk_device *device,
|
|||||||
module->size = create_info->codeSize;
|
module->size = create_info->codeSize;
|
||||||
memcpy(module->data, create_info->pCode, module->size);
|
memcpy(module->data, create_info->pCode, module->size);
|
||||||
|
|
||||||
_mesa_sha1_compute(module->data, module->size, module->sha1);
|
_mesa_blake3_compute(module->data, module->size, module->hash);
|
||||||
}
|
}
|
||||||
|
|
||||||
VKAPI_ATTR VkResult VKAPI_CALL
|
VKAPI_ATTR VkResult VKAPI_CALL
|
||||||
@@ -71,7 +70,7 @@ vk_common_CreateShaderModule(VkDevice _device,
|
|||||||
return VK_SUCCESS;
|
return VK_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
const uint8_t vk_shaderModuleIdentifierAlgorithmUUID[VK_UUID_SIZE] = "MESA-SHA1";
|
const uint8_t vk_shaderModuleIdentifierAlgorithmUUID[VK_UUID_SIZE] = "MESA-BLAKE3";
|
||||||
|
|
||||||
VKAPI_ATTR void VKAPI_CALL
|
VKAPI_ATTR void VKAPI_CALL
|
||||||
vk_common_GetShaderModuleIdentifierEXT(VkDevice _device,
|
vk_common_GetShaderModuleIdentifierEXT(VkDevice _device,
|
||||||
@@ -79,8 +78,8 @@ vk_common_GetShaderModuleIdentifierEXT(VkDevice _device,
|
|||||||
VkShaderModuleIdentifierEXT *pIdentifier)
|
VkShaderModuleIdentifierEXT *pIdentifier)
|
||||||
{
|
{
|
||||||
VK_FROM_HANDLE(vk_shader_module, module, _module);
|
VK_FROM_HANDLE(vk_shader_module, module, _module);
|
||||||
memcpy(pIdentifier->identifier, module->sha1, sizeof(module->sha1));
|
memcpy(pIdentifier->identifier, module->hash, sizeof(module->hash));
|
||||||
pIdentifier->identifierSize = sizeof(module->sha1);
|
pIdentifier->identifierSize = sizeof(module->hash);
|
||||||
}
|
}
|
||||||
|
|
||||||
VKAPI_ATTR void VKAPI_CALL
|
VKAPI_ATTR void VKAPI_CALL
|
||||||
@@ -88,9 +87,9 @@ vk_common_GetShaderModuleCreateInfoIdentifierEXT(VkDevice _device,
|
|||||||
const VkShaderModuleCreateInfo *pCreateInfo,
|
const VkShaderModuleCreateInfo *pCreateInfo,
|
||||||
VkShaderModuleIdentifierEXT *pIdentifier)
|
VkShaderModuleIdentifierEXT *pIdentifier)
|
||||||
{
|
{
|
||||||
_mesa_sha1_compute(pCreateInfo->pCode, pCreateInfo->codeSize,
|
_mesa_blake3_compute(pCreateInfo->pCode, pCreateInfo->codeSize,
|
||||||
pIdentifier->identifier);
|
pIdentifier->identifier);
|
||||||
pIdentifier->identifierSize = SHA1_DIGEST_LENGTH;
|
pIdentifier->identifierSize = sizeof(blake3_hash);
|
||||||
}
|
}
|
||||||
|
|
||||||
VKAPI_ATTR void VKAPI_CALL
|
VKAPI_ATTR void VKAPI_CALL
|
||||||
|
@@ -26,6 +26,7 @@
|
|||||||
|
|
||||||
#include <vulkan/vulkan_core.h>
|
#include <vulkan/vulkan_core.h>
|
||||||
|
|
||||||
|
#include "util/mesa-blake3.h"
|
||||||
#include "compiler/shader_enums.h"
|
#include "compiler/shader_enums.h"
|
||||||
#include "vk_object.h"
|
#include "vk_object.h"
|
||||||
|
|
||||||
@@ -40,7 +41,7 @@ struct spirv_to_nir_options;
|
|||||||
struct vk_shader_module {
|
struct vk_shader_module {
|
||||||
struct vk_object_base base;
|
struct vk_object_base base;
|
||||||
struct nir_shader *nir;
|
struct nir_shader *nir;
|
||||||
unsigned char sha1[20];
|
blake3_hash hash;
|
||||||
uint32_t size;
|
uint32_t size;
|
||||||
char data[0];
|
char data[0];
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user