mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-04 14:08:05 +02:00
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:
parent
17a17c3f89
commit
72f2565fc9
3 changed files with 44 additions and 17 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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. */
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue