v3dv/device: proper pipeline cache uuid
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6766>
This commit is contained in:
parent
8f46750f46
commit
fd70e8e0b0
|
@ -86,6 +86,7 @@ if dep_v3dv3.found()
|
||||||
endif
|
endif
|
||||||
|
|
||||||
v3dv_deps = [
|
v3dv_deps = [
|
||||||
|
dep_dl,
|
||||||
dep_libdrm,
|
dep_libdrm,
|
||||||
dep_valgrind,
|
dep_valgrind,
|
||||||
dep_v3dv3,
|
dep_v3dv3,
|
||||||
|
|
|
@ -44,6 +44,8 @@
|
||||||
#include "u_atomic.h"
|
#include "u_atomic.h"
|
||||||
#include "vk_util.h"
|
#include "vk_util.h"
|
||||||
|
|
||||||
|
#include "util/build_id.h"
|
||||||
|
|
||||||
#ifdef VK_USE_PLATFORM_XCB_KHR
|
#ifdef VK_USE_PLATFORM_XCB_KHR
|
||||||
#include <xcb/xcb.h>
|
#include <xcb/xcb.h>
|
||||||
#include <xcb/dri3.h>
|
#include <xcb/dri3.h>
|
||||||
|
@ -346,6 +348,43 @@ device_has_expected_features(struct v3dv_physical_device *device)
|
||||||
v3d_has_feature(device, DRM_V3D_PARAM_SUPPORTS_CACHE_FLUSH);
|
v3d_has_feature(device, DRM_V3D_PARAM_SUPPORTS_CACHE_FLUSH);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static VkResult
|
||||||
|
init_uuids(struct v3dv_physical_device *device)
|
||||||
|
{
|
||||||
|
const struct build_id_note *note =
|
||||||
|
build_id_find_nhdr_for_addr(init_uuids);
|
||||||
|
if (!note) {
|
||||||
|
return vk_errorf(device->instance,
|
||||||
|
VK_ERROR_INITIALIZATION_FAILED,
|
||||||
|
"Failed to find build-id");
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned build_id_len = build_id_length(note);
|
||||||
|
if (build_id_len < 20) {
|
||||||
|
return vk_errorf(device->instance,
|
||||||
|
VK_ERROR_INITIALIZATION_FAILED,
|
||||||
|
"build-id too short. It needs to be a SHA");
|
||||||
|
}
|
||||||
|
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
_mesa_sha1_init(&sha1_ctx);
|
||||||
|
_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);
|
||||||
|
|
||||||
|
return VK_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
static VkResult
|
static VkResult
|
||||||
physical_device_init(struct v3dv_physical_device *device,
|
physical_device_init(struct v3dv_physical_device *device,
|
||||||
struct v3dv_instance *instance,
|
struct v3dv_instance *instance,
|
||||||
|
@ -379,8 +418,9 @@ physical_device_init(struct v3dv_physical_device *device,
|
||||||
device->render_fd = render_fd; /* The v3d render node */
|
device->render_fd = render_fd; /* The v3d render node */
|
||||||
device->display_fd = display_fd; /* The vc4 primary node */
|
device->display_fd = display_fd; /* The vc4 primary node */
|
||||||
|
|
||||||
uint8_t zeroes[VK_UUID_SIZE] = { 0 };
|
result = init_uuids(device);
|
||||||
memcpy(device->pipeline_cache_uuid, zeroes, VK_UUID_SIZE);
|
if (result != VK_SUCCESS)
|
||||||
|
goto fail;
|
||||||
|
|
||||||
#if using_v3d_simulator
|
#if using_v3d_simulator
|
||||||
device->sim_file = v3d_simulator_init(device->render_fd);
|
device->sim_file = v3d_simulator_init(device->render_fd);
|
||||||
|
|
Loading…
Reference in New Issue