The new version does a SHA1 sum of the timestamp together with the device PCI ID. This fixes a theoretical bug where, if you moved a drive between machines, you could end up trying to use a pipeline cache from one platform with a different platform. Now we'll reject any cache that is targeted at different hardware.
Cc: "13.0 17.0" <[email protected]> --- src/intel/vulkan/anv_device.c | 36 +++++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c index 82c2d6f..4e06670 100644 --- a/src/intel/vulkan/anv_device.c +++ b/src/intel/vulkan/anv_device.c @@ -31,6 +31,7 @@ #include <fcntl.h> #include "anv_private.h" +#include "util/mesa-sha1.h" #include "util/strtod.h" #include "util/debug.h" @@ -69,17 +70,30 @@ anv_get_function_timestamp(void *ptr, uint32_t* timestamp) return true; } -static bool -anv_device_get_cache_uuid(void *uuid) +static VkResult +anv_physical_device_init_uuid(struct anv_physical_device *device) { uint32_t timestamp; + if (!anv_get_function_timestamp(anv_physical_device_init_uuid, ×tamp)) { + return vk_errorf(VK_ERROR_INITIALIZATION_FAILED, + "cannot generate UUID"); + } - memset(uuid, 0, VK_UUID_SIZE); - if (!anv_get_function_timestamp(anv_device_get_cache_uuid, ×tamp)) - return false; + unsigned char sha1[20]; + struct mesa_sha1 *sha1_ctx = _mesa_sha1_init(); + if (sha1_ctx == NULL) { + return vk_errorf(VK_ERROR_INITIALIZATION_FAILED, + "cannot generate UUID"); + } - snprintf(uuid, VK_UUID_SIZE, "anv-%d", timestamp); - return true; + _mesa_sha1_update(sha1_ctx, ×tamp, sizeof(timestamp)); + _mesa_sha1_update(sha1_ctx, &device->chipset_id, sizeof(device->chipset_id)); + + _mesa_sha1_final(sha1_ctx, sha1); + + memcpy(device->uuid, sha1, VK_UUID_SIZE); + + return VK_SUCCESS; } static VkResult @@ -163,11 +177,11 @@ anv_physical_device_init(struct anv_physical_device *device, goto fail; } - if (!anv_device_get_cache_uuid(device->uuid)) { - result = vk_errorf(VK_ERROR_INITIALIZATION_FAILED, - "cannot generate UUID"); + /* Initialize the physical device UUID */ + result = anv_physical_device_init_uuid(device); + if (result != VK_SUCCESS) goto fail; - } + bool swizzled = anv_gem_get_bit6_swizzle(fd, I915_TILING_X); /* GENs prior to 8 do not support EU/Subslice info */ -- 2.5.0.400.gff86faf _______________________________________________ mesa-dev mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-dev
