X-Git-Url: https://git.libre-soc.org/?p=mesa.git;a=blobdiff_plain;f=src%2Fegl%2Fdrivers%2Fdri2%2Fplatform_device.c;h=8aee12553b9b29dca5465a15649097352c6f4bb6;hp=fdb5652e3068163f77f579cfce4d800bf9430889;hb=0dc0a79a581b91aec301991706242f11aeb1473b;hpb=2e3eb0c90b7c70a28a50e424648b00e300940b53 diff --git a/src/egl/drivers/dri2/platform_device.c b/src/egl/drivers/dri2/platform_device.c index fdb5652e306..8aee12553b9 100644 --- a/src/egl/drivers/dri2/platform_device.c +++ b/src/egl/drivers/dri2/platform_device.c @@ -40,8 +40,8 @@ #include #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, @@ -115,8 +115,8 @@ device_image_get_buffers(__DRIdrawable *driDrawable, } 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); @@ -160,7 +160,7 @@ dri2_device_create_surface(_EGLDriver *drv, _EGLDisplay *disp, EGLint type, } 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); @@ -175,18 +175,16 @@ device_destroy_surface(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *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, }; @@ -253,9 +251,10 @@ device_get_fd(_EGLDisplay *disp, _EGLDevice *dev) 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); @@ -266,6 +265,18 @@ device_probe_device(_EGLDisplay *disp) 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; @@ -286,7 +297,7 @@ err_name: 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"); @@ -305,7 +316,7 @@ device_probe_device_sw(_EGLDisplay *disp) } EGLBoolean -dri2_initialize_device(_EGLDriver *drv, _EGLDisplay *disp) +dri2_initialize_device(_EGLDisplay *disp) { _EGLDevice *dev; struct dri2_egl_display *dri2_dpy; @@ -345,7 +356,7 @@ dri2_initialize_device(_EGLDriver *drv, _EGLDisplay *disp) 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; }