.get_dri_drawable = dri2_surface_get_dri_drawable,
};
+static int
+get_fd_render_gpu_drm(struct gbm_dri_device *gbm_dri, int fd_display_gpu)
+{
+ /* This doesn't make sense for the software case. */
+ assert(!gbm_dri->software);
+
+ /* Render-capable device, so just return the same fd. */
+ if (loader_is_device_render_capable(fd_display_gpu))
+ return fd_display_gpu;
+
+ /* Display-only device, so return a compatible render-only device. */
+ return gbm_dri->mesa->queryCompatibleRenderOnlyDeviceFd(fd_display_gpu);
+}
+
EGLBoolean
dri2_initialize_drm(_EGLDisplay *disp)
{
goto cleanup;
}
- dri2_dpy->fd_render_gpu =
+ dri2_dpy->fd_display_gpu =
loader_open_device(drm->nodes[DRM_NODE_PRIMARY]);
} else {
char buf[64];
int n = snprintf(buf, sizeof(buf), DRM_DEV_NAME, DRM_DIR_NAME, 0);
if (n != -1 && n < sizeof(buf))
- dri2_dpy->fd_render_gpu = loader_open_device(buf);
+ dri2_dpy->fd_display_gpu = loader_open_device(buf);
}
- gbm = gbm_create_device(dri2_dpy->fd_render_gpu);
+ gbm = gbm_create_device(dri2_dpy->fd_display_gpu);
if (gbm == NULL) {
err = "DRI2: failed to create gbm device";
goto cleanup;
}
dri2_dpy->own_device = true;
} else {
- dri2_dpy->fd_render_gpu = os_dupfd_cloexec(gbm_device_get_fd(gbm));
- if (dri2_dpy->fd_render_gpu < 0) {
+ dri2_dpy->fd_display_gpu = os_dupfd_cloexec(gbm_device_get_fd(gbm));
+ if (dri2_dpy->fd_display_gpu < 0) {
err = "DRI2: failed to fcntl() existing gbm device";
goto cleanup;
}
}
- dri2_dpy->fd_display_gpu = dri2_dpy->fd_render_gpu;
dri2_dpy->gbm_dri = gbm_dri_device(gbm);
+ if (!dri2_dpy->gbm_dri->software) {
+ dri2_dpy->fd_render_gpu =
+ get_fd_render_gpu_drm(dri2_dpy->gbm_dri, dri2_dpy->fd_display_gpu);
+ if (dri2_dpy->fd_render_gpu < 0) {
+ err = "DRI2: failed to get compatible render device";
+ goto cleanup;
+ }
+ }
if (strcmp(gbm_device_get_backend_name(gbm), "drm") != 0) {
err = "DRI2: gbm device using incorrect/incompatible backend";