diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c b/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c index ada39e7f278..223c86473fa 100644 --- a/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c +++ b/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c @@ -397,7 +397,7 @@ amdgpu_winsys_create(int fd, const struct pipe_screen_config *config, { struct amdgpu_screen_winsys *sws; struct amdgpu_winsys *aws; - ac_drm_device *dev; + ac_drm_device *dev = NULL; uint32_t drm_major, drm_minor; int r; @@ -415,10 +415,31 @@ amdgpu_winsys_create(int fd, const struct pipe_screen_config *config, /* Initialize the amdgpu device. This should always return the same pointer * for the same fd. */ - r = ac_drm_device_initialize(fd, is_virtio, &drm_major, &drm_minor, &dev); - if (r) { - mesa_loge("amdgpu: amd%s_device_initialize failed.\n", is_virtio ? "vgpu" : "gpu"); - goto fail; + if (drmGetNodeTypeFromFd(fd) != DRM_NODE_RENDER) { + char *render_device = drmGetRenderDeviceNameFromFd(fd); + + if (render_device) { + int render_fd = open(render_device, O_RDWR | O_CLOEXEC); + + if (render_fd >= 0) { + r = ac_drm_device_initialize(render_fd, is_virtio, &drm_major, &drm_minor, &dev); + close(render_fd); + if (r) { + mesa_logd("amdgpu: amd%s_device_initialize failed for %s\n", + is_virtio ? "vgpu" : "gpu", render_device); + } + } + + free(render_device); + } + } + + if (!dev) { + r = ac_drm_device_initialize(fd, is_virtio, &drm_major, &drm_minor, &dev); + if (r) { + mesa_loge("amdgpu: amd%s_device_initialize failed.\n", is_virtio ? "vgpu" : "gpu"); + goto fail; + } } /* Lookup a winsys if we have already created one for this device. */