From 43063d8de8f81bb55eb60a1208ede04810b98f22 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga Date: Mon, 5 Oct 2020 10:44:59 +0200 Subject: [PATCH] v3dv: generate proper UUIDs for device and driver Part-of: --- src/broadcom/vulkan/v3dv_device.c | 51 ++++++++++++++++++------------ src/broadcom/vulkan/v3dv_private.h | 3 ++ 2 files changed, 34 insertions(+), 20 deletions(-) diff --git a/src/broadcom/vulkan/v3dv_device.c b/src/broadcom/vulkan/v3dv_device.c index 5a5f27ad2ec..cb246d5ada2 100644 --- a/src/broadcom/vulkan/v3dv_device.c +++ b/src/broadcom/vulkan/v3dv_device.c @@ -407,10 +407,12 @@ init_uuids(struct v3dv_physical_device *device) "build-id too short. It needs to be a SHA"); } + uint32_t vendor_id = v3dv_physical_device_vendor_id(device); + uint32_t device_id = v3dv_physical_device_device_id(device); + struct mesa_sha1 sha1_ctx; uint8_t sha1[20]; STATIC_ASSERT(VK_UUID_SIZE <= sizeof(sha1)); - uint32_t device_id = v3dv_physical_device_device_id(device); /* The pipeline cache UUID is used for determining when a pipeline cache is * invalid. It needs both a driver build and the PCI ID of the device. @@ -419,9 +421,25 @@ init_uuids(struct v3dv_physical_device *device) _mesa_sha1_update(&sha1_ctx, build_id_data(note), build_id_len); _mesa_sha1_update(&sha1_ctx, &device_id, sizeof(device_id)); _mesa_sha1_final(&sha1_ctx, sha1); - memcpy(device->pipeline_cache_uuid, sha1, VK_UUID_SIZE); + /* The driver UUID is used for determining sharability of images and memory + * between two Vulkan instances in separate processes. People who want to + * share memory need to also check the device UUID (below) so all this + * needs to be is the build-id. + */ + memcpy(device->driver_uuid, build_id_data(note), VK_UUID_SIZE); + + /* The device UUID uniquely identifies the given device within the machine. + * Since we never have more than one device, this doesn't need to be a real + * UUID. + */ + _mesa_sha1_init(&sha1_ctx); + _mesa_sha1_update(&sha1_ctx, &vendor_id, sizeof(vendor_id)); + _mesa_sha1_update(&sha1_ctx, &device_id, sizeof(device_id)); + _mesa_sha1_final(&sha1_ctx, sha1); + memcpy(device->device_uuid, sha1, VK_UUID_SIZE); + return VK_SUCCESS; } @@ -458,10 +476,6 @@ physical_device_init(struct v3dv_physical_device *device, device->render_fd = render_fd; /* The v3d render node */ device->display_fd = display_fd; /* The vc4 primary node */ - result = init_uuids(device); - if (result != VK_SUCCESS) - goto fail; - #if using_v3d_simulator device->sim_file = v3d_simulator_init(device->render_fd); #endif @@ -481,6 +495,10 @@ physical_device_init(struct v3dv_physical_device *device, goto fail; } + result = init_uuids(device); + if (result != VK_SUCCESS) + goto fail; + device->compiler = v3d_compiler_init(&device->devinfo); device->next_program_id = 0; @@ -726,7 +744,7 @@ v3dv_GetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice, uint32_t v3dv_physical_device_vendor_id(struct v3dv_physical_device *dev) { - return 0x14E4; + return 0x14E4; /* Broadcom */ } @@ -750,13 +768,6 @@ get_i915_param(int fd, uint32_t param, int *value) } #endif -/* FIXME: - * Getting deviceID and UUID will probably require to use the kernel pci - * interface. See this: - * https://www.kernel.org/doc/html/latest/PCI/pci.html#how-to-find-pci-devices-manually - * And check the getparam ioctl in the i915 kernel with CHIPSET_ID for - * example. - */ uint32_t v3dv_physical_device_device_id(struct v3dv_physical_device *dev) { @@ -764,12 +775,11 @@ v3dv_physical_device_device_id(struct v3dv_physical_device *dev) int devid = 0; if (!get_i915_param(dev->render_fd, I915_PARAM_CHIPSET_ID, &devid)) - fprintf(stderr, "Error getting for device_id\n"); + fprintf(stderr, "Error getting device_id\n"); return devid; #else - /* FIXME */ - return 0; + return dev->devinfo.ver; #endif } @@ -951,6 +961,8 @@ void v3dv_GetPhysicalDeviceProperties2(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties2 *pProperties) { + V3DV_FROM_HANDLE(v3dv_physical_device, pdevice, physicalDevice); + v3dv_GetPhysicalDeviceProperties(physicalDevice, &pProperties->properties); vk_foreach_struct(ext, pProperties->pNext) { @@ -958,9 +970,8 @@ v3dv_GetPhysicalDeviceProperties2(VkPhysicalDevice physicalDevice, case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES: { VkPhysicalDeviceIDProperties *id_props = (VkPhysicalDeviceIDProperties *)ext; - /* FIXME */ - memset(id_props->deviceUUID, 0, VK_UUID_SIZE); - memset(id_props->driverUUID, 0, VK_UUID_SIZE); + memcpy(id_props->deviceUUID, pdevice->device_uuid, VK_UUID_SIZE); + memcpy(id_props->driverUUID, pdevice->driver_uuid, VK_UUID_SIZE); /* The LUID is for Windows. */ id_props->deviceLUIDValid = false; break; diff --git a/src/broadcom/vulkan/v3dv_private.h b/src/broadcom/vulkan/v3dv_private.h index 1961bb77dfb..0528111148b 100644 --- a/src/broadcom/vulkan/v3dv_private.h +++ b/src/broadcom/vulkan/v3dv_private.h @@ -138,7 +138,10 @@ struct v3dv_physical_device { char *name; int32_t render_fd; int32_t display_fd; + uint8_t pipeline_cache_uuid[VK_UUID_SIZE]; + uint8_t device_uuid[VK_UUID_SIZE]; + uint8_t driver_uuid[VK_UUID_SIZE]; struct wsi_device wsi_device;