From 04d7a945dcf462e3b6826a75b78b2df5bfef4f20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tapani=20P=C3=A4lli?= Date: Mon, 25 Aug 2025 14:32:31 +0300 Subject: [PATCH] egl: allocate device info lazily only when queried MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: mesa-stable Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/13746 Signed-off-by: Tapani Pälli Acked-by: Mike Blumenkrantz Reviewed-by: Marek Olšák Part-of: (cherry picked from commit 72f2565fc99ea80b7f7ddc4392ef2313edf96692) --- .pick_status.json | 2 +- src/egl/drivers/dri2/egl_dri2.c | 5 +++++ src/egl/main/egldevice.c | 33 +++++++++++++++++++++++----- src/gallium/frontends/dri/dri_util.c | 23 +++++++++---------- 4 files changed, 45 insertions(+), 18 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index afdfd3a2f27..464fec27fd9 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -3444,7 +3444,7 @@ "description": "egl: allocate device info lazily only when queried", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null, "notes": null diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c index 32944890495..4e277eb6f2a 100644 --- a/src/egl/drivers/dri2/egl_dri2.c +++ b/src/egl/drivers/dri2/egl_dri2.c @@ -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); diff --git a/src/egl/main/egldevice.c b/src/egl/main/egldevice.c index 4b3e6fe193b..96e483da79a 100644 --- a/src/egl/main/egldevice.c +++ b/src/egl/main/egldevice.c @@ -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. */ diff --git a/src/gallium/frontends/dri/dri_util.c b/src/gallium/frontends/dri/dri_util.c index 417b68682e8..310e9c196b6 100644 --- a/src/gallium/frontends/dri/dri_util.c +++ b/src/gallium/frontends/dri/dri_util.c @@ -1077,18 +1077,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);