egl: allocate device info lazily only when queried

Cc: mesa-stable
Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/13746
Signed-off-by: Tapani Pälli <tapani.palli@intel.com>
Acked-by: Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/36998>
This commit is contained in:
Tapani Pälli 2025-08-25 14:32:31 +03:00 committed by Marge Bot
parent 17a17c3f89
commit 72f2565fc9
3 changed files with 44 additions and 17 deletions

View file

@ -574,6 +574,11 @@ dri2_query_device_info(const void* driver_device_identifier,
struct egl_device_info *device_info)
{
const char* drm_device_name = (const char*)driver_device_identifier;
/* We have information cached already. */
if (device_info->vendor_name)
return true;
return dri_get_drm_device_info(
drm_device_name, device_info->device_uuid, device_info->driver_uuid,
&device_info->vendor_name, &device_info->renderer_name, &device_info->driver_name);

View file

@ -153,11 +153,12 @@ _eglAddDRMDevice(drmDevicePtr device)
dev = dev->Next;
const char *node = device->nodes[DRM_NODE_RENDER];
bool supportsDrmDeviceQuery = false;
if (_eglDriver.QueryDeviceInfo)
supportsDrmDeviceQuery = _eglDriver.QueryDeviceInfo(node, &dev->device_info);
if (supportsDrmDeviceQuery)
/* Need to have render node for query to work. */
bool supports_info_query =
device->available_nodes & (1 << DRM_NODE_RENDER) &&
_eglDriver.QueryDeviceInfo;
if (supports_info_query)
dev->extensions =
"EGL_EXT_device_drm EGL_EXT_device_drm_render_node "
"EGL_EXT_device_query_name EGL_EXT_device_persistent_id";
@ -165,7 +166,7 @@ _eglAddDRMDevice(drmDevicePtr device)
dev->extensions = "EGL_EXT_device_drm EGL_EXT_device_drm_render_node";
dev->EXT_device_drm = EGL_TRUE;
dev->EXT_device_drm_render_node = EGL_TRUE;
if (supportsDrmDeviceQuery) {
if (supports_info_query) {
dev->EXT_device_query_name = EGL_TRUE;
dev->EXT_device_persistent_id = EGL_TRUE;
}
@ -315,6 +316,14 @@ _eglQueryDeviceBinaryEXT(_EGLDevice *dev, EGLint name, EGLint max_size,
const char *
_eglQueryDeviceStringEXT(_EGLDevice *dev, EGLint name)
{
#ifdef HAVE_LIBDRM
drmDevicePtr device = _eglDeviceDrm(dev);
/* Software device does not have render node. */
const char *render_node =
_eglDeviceSupports(dev, _EGL_DEVICE_SOFTWARE) ?
"" : device->nodes[DRM_NODE_RENDER];
#endif
switch (name) {
case EGL_EXTENSIONS:
return dev->extensions;
@ -351,6 +360,10 @@ _eglQueryDeviceStringEXT(_EGLDevice *dev, EGLint name)
if (!_eglDeviceSupports(dev, _EGL_DEVICE_QUERY_NAME))
break;
#ifdef HAVE_LIBDRM
if (!_eglDriver.QueryDeviceInfo(render_node, &dev->device_info)) {
_eglError(EGL_BAD_DEVICE_EXT, "_eglQueryDeviceStringEXT");
return NULL;
}
return dev->device_info.vendor_name;
#else
/* Physical devices are only exposed when libdrm is available. */
@ -361,6 +374,10 @@ _eglQueryDeviceStringEXT(_EGLDevice *dev, EGLint name)
if (!_eglDeviceSupports(dev, _EGL_DEVICE_QUERY_NAME))
break;
#ifdef HAVE_LIBDRM
if (!_eglDriver.QueryDeviceInfo(render_node, &dev->device_info)) {
_eglError(EGL_BAD_DEVICE_EXT, "_eglQueryDeviceStringEXT");
return NULL;
}
return dev->device_info.renderer_name;
#else
/* Physical devices are only exposed when libdrm is available. */
@ -372,6 +389,10 @@ _eglQueryDeviceStringEXT(_EGLDevice *dev, EGLint name)
if (!_eglDeviceSupports(dev, _EGL_DEVICE_PERSISTENT_ID))
break;
#ifdef HAVE_LIBDRM
if (!_eglDriver.QueryDeviceInfo(render_node, &dev->device_info)) {
_eglError(EGL_BAD_DEVICE_EXT, "_eglQueryDeviceStringEXT");
return NULL;
}
return dev->device_info.driver_name;
#else
/* Physical devices are only exposed when libdrm is available. */

View file

@ -1078,18 +1078,19 @@ dri_get_drm_device_info(const char *device_name, uint8_t *device_uuid, uint8_t *
close(fd);
return false;
}
if (!pscreen->get_device_uuid || !pscreen->get_driver_uuid ||
!pscreen->get_device_vendor || !pscreen->get_name) {
pscreen->destroy(pscreen);
pipe_loader_release(&pldev, 1);
close(fd);
return false;
}
pscreen->get_device_uuid(pscreen, (char *)device_uuid);
pscreen->get_driver_uuid(pscreen, (char *)driver_uuid);
*vendor_name = strdup(pscreen->get_device_vendor(pscreen));
*renderer_name = strdup(pscreen->get_name(pscreen));
if (pscreen->get_device_uuid)
pscreen->get_device_uuid(pscreen, (char *)device_uuid);
if (pscreen->get_driver_uuid)
pscreen->get_driver_uuid(pscreen, (char *)driver_uuid);
if (pscreen->get_device_vendor)
*vendor_name = strdup(pscreen->get_device_vendor(pscreen));
if (pscreen->get_name)
*renderer_name = strdup(pscreen->get_name(pscreen));
*driver_name = loader_get_driver_for_fd(fd);
pscreen->destroy(pscreen);