#include <unistd.h>
#include "egl_dri2.h"
-#include "egl_dri2_fallbacks.h"
#include "loader.h"
+#include "util/debug.h"
static __DRIimage*
device_alloc_image(struct dri2_egl_display *dri2_dpy,
}
static _EGLSurface *
-dri2_device_create_surface(_EGLDriver *drv, _EGLDisplay *disp, EGLint type,
- _EGLConfig *conf, const EGLint *attrib_list)
+dri2_device_create_surface(_EGLDisplay *disp, EGLint type, _EGLConfig *conf,
+ const EGLint *attrib_list)
{
struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
struct dri2_egl_config *dri2_conf = dri2_egl_config(conf);
}
static EGLBoolean
-device_destroy_surface(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf)
+device_destroy_surface(_EGLDisplay *disp, _EGLSurface *surf)
{
struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surf);
}
static _EGLSurface *
-dri2_device_create_pbuffer_surface(_EGLDriver *drv, _EGLDisplay *disp,
- _EGLConfig *conf, const EGLint *attrib_list)
+dri2_device_create_pbuffer_surface(_EGLDisplay *disp, _EGLConfig *conf,
+ const EGLint *attrib_list)
{
- return dri2_device_create_surface(drv, disp, EGL_PBUFFER_BIT, conf,
- attrib_list);
+ return dri2_device_create_surface(disp, EGL_PBUFFER_BIT, conf, attrib_list);
}
static const struct dri2_egl_display_vtbl dri2_device_display_vtbl = {
.create_pbuffer_surface = dri2_device_create_pbuffer_surface,
.destroy_surface = device_destroy_surface,
.create_image = dri2_create_image_khr,
- .get_sync_values = dri2_fallback_get_sync_values,
.get_dri_drawable = dri2_surface_get_dri_drawable,
};
static bool
device_probe_device(_EGLDisplay *disp)
{
- struct dri2_egl_display *dri2_dpy = disp->DriverData;
+ struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
+ bool request_software = env_var_as_boolean("LIBGL_ALWAYS_SOFTWARE", false);
- if (disp->Options.ForceSoftware)
+ if (request_software)
_eglLog(_EGL_WARNING, "Not allowed to force software rendering when "
"API explicitly selects a hardware device.");
dri2_dpy->fd = device_get_fd(disp, disp->Device);
if (!dri2_dpy->driver_name)
goto err_name;
+ /* When doing software rendering, some times user still want to explicitly
+ * choose the render node device since cross node import doesn't work between
+ * vgem/virtio_gpu yet. It would be nice to have a new EXTENSION for this.
+ * For now, just fallback to kms_swrast. */
+ if (disp->Options.ForceSoftware && !request_software &&
+ (strcmp(dri2_dpy->driver_name, "vgem") == 0 ||
+ strcmp(dri2_dpy->driver_name, "virtio_gpu") == 0)) {
+ free(dri2_dpy->driver_name);
+ _eglLog(_EGL_WARNING, "NEEDS EXTENSION: falling back to kms_swrast");
+ dri2_dpy->driver_name = strdup("kms_swrast");
+ }
+
if (!dri2_load_driver_dri3(disp))
goto err_load;
static bool
device_probe_device_sw(_EGLDisplay *disp)
{
- struct dri2_egl_display *dri2_dpy = disp->DriverData;
+ struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
dri2_dpy->fd = -1;
dri2_dpy->driver_name = strdup("swrast");
}
EGLBoolean
-dri2_initialize_device(_EGLDriver *drv, _EGLDisplay *disp)
+dri2_initialize_device(_EGLDisplay *disp)
{
_EGLDevice *dev;
struct dri2_egl_display *dri2_dpy;
dri2_setup_screen(disp);
- if (!dri2_add_pbuffer_configs_for_visuals(drv, disp)) {
+ if (!dri2_add_pbuffer_configs_for_visuals(disp)) {
err = "DRI2: failed to add configs";
goto cleanup;
}