diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c index 86536b7132a..1d5b7eb866f 100644 --- a/src/egl/drivers/dri2/egl_dri2.c +++ b/src/egl/drivers/dri2/egl_dri2.c @@ -604,7 +604,6 @@ static const struct dri_extension_match dri2_core_extensions[] = { }; static const struct dri_extension_match swrast_driver_extensions[] = { - {__DRI_SWRAST, 5, offsetof(struct dri2_egl_display, swrast), false}, {__DRI_CONFIG_OPTIONS, 2, offsetof(struct dri2_egl_display, configOptions), true}, }; @@ -659,6 +658,8 @@ dri2_load_driver_common(_EGLDisplay *disp, } dri2_dpy->driver_extensions = extensions; dri2_dpy->kopper = disp->Options.Zink && !debug_get_bool_option("LIBGL_KOPPER_DISABLE", false); + dri2_dpy->swrast = (disp->Options.ForceSoftware && !dri2_dpy->kopper) || + !dri2_dpy->driver_name || strstr(dri2_dpy->driver_name, "swrast"); return EGL_TRUE; } @@ -742,7 +743,7 @@ dri2_setup_screen(_EGLDisplay *disp) if ((api_mask & (1 << __DRI_API_GLES3)) && _eglIsApiValid(EGL_OPENGL_ES_API)) disp->ClientAPIs |= EGL_OPENGL_ES3_BIT_KHR; - assert(dri2_dpy->image_driver || dri2_dpy->dri2 || dri2_dpy->swrast); + assert(dri2_dpy->image_driver || dri2_dpy->dri2 || dri2_dpy->kopper || dri2_dpy->swrast); disp->Extensions.KHR_create_context = EGL_TRUE; disp->Extensions.KHR_create_context_no_error = EGL_TRUE; disp->Extensions.KHR_no_config_context = EGL_TRUE; @@ -907,7 +908,7 @@ dri2_create_screen(_EGLDisplay *disp) } } - int screen_fd = dri2_dpy->swrast ? -1 : dri2_dpy->fd_render_gpu; + int screen_fd = dri2_dpy->swrast || dri2_dpy->kopper ? -1 : dri2_dpy->fd_render_gpu; dri2_dpy->dri_screen_render_gpu = driCreateNewScreen3( 0, screen_fd, dri2_dpy->loader_extensions, dri2_dpy->driver_extensions, &dri2_dpy->driver_configs, false, disp); diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h index 6202c55bdc6..92503662bca 100644 --- a/src/egl/drivers/dri2/egl_dri2.h +++ b/src/egl/drivers/dri2/egl_dri2.h @@ -244,7 +244,6 @@ struct dri2_egl_display { const __DRIconfig **driver_configs; const __DRIimageDriverExtension *image_driver; const __DRIdri2Extension *dri2; - const __DRIswrastExtension *swrast; const __DRI2flushExtension *flush; const __DRI2flushControlExtension *flush_control; const __DRItexBufferExtension *tex_buffer; @@ -271,6 +270,7 @@ struct dri2_egl_display { bool own_device; bool invalidate_available; bool kopper; + bool swrast; int min_swap_interval; int max_swap_interval; int default_swap_interval; diff --git a/src/egl/drivers/dri2/platform_drm.c b/src/egl/drivers/dri2/platform_drm.c index 8995876ecea..298f32473d1 100644 --- a/src/egl/drivers/dri2/platform_drm.c +++ b/src/egl/drivers/dri2/platform_drm.c @@ -646,7 +646,6 @@ dri2_initialize_drm(_EGLDisplay *disp) dri2_dpy->dri_screen_render_gpu = dri2_dpy->gbm_dri->screen; dri2_dpy->image_driver = dri2_dpy->gbm_dri->image_driver; - dri2_dpy->swrast = dri2_dpy->gbm_dri->swrast; dri2_dpy->driver_configs = dri2_dpy->gbm_dri->driver_configs; dri2_dpy->gbm_dri->validate_image = dri2_validate_egl_image; diff --git a/src/egl/drivers/dri2/platform_x11.c b/src/egl/drivers/dri2/platform_x11.c index 33768ac637b..e5b0d5c7ef3 100644 --- a/src/egl/drivers/dri2/platform_x11.c +++ b/src/egl/drivers/dri2/platform_x11.c @@ -579,7 +579,6 @@ dri2_x11_destroy_surface(_EGLDisplay *disp, _EGLSurface *surf) xcb_dri2_destroy_drawable(dri2_dpy->conn, dri2_surf->drawable); #endif } else { - assert(dri2_dpy->swrast); swrastDestroyDrawable(dri2_dpy, dri2_surf); } diff --git a/src/gbm/backends/dri/gbm_dri.c b/src/gbm/backends/dri/gbm_dri.c index 754264f6aa4..6ecfcdacbd2 100644 --- a/src/gbm/backends/dri/gbm_dri.c +++ b/src/gbm/backends/dri/gbm_dri.c @@ -240,10 +240,6 @@ static struct dri_extension_match gbm_dri_device_extensions[] = { { __DRI_IMAGE_DRIVER, 2, offsetof(struct gbm_dri_device, image_driver), false }, }; -static struct dri_extension_match gbm_swrast_device_extensions[] = { - { __DRI_SWRAST, 5, offsetof(struct gbm_dri_device, swrast), false }, -}; - const __DRIextension ** dri_loader_get_extensions(const char *driver_name); @@ -281,11 +277,11 @@ dri_screen_create_for_driver(struct gbm_dri_device *dri, char *driver_name, bool ARRAY_SIZE(gbm_dri_device_extensions), extensions); } else { - bind_ok = loader_bind_extensions(dri, gbm_swrast_device_extensions, - ARRAY_SIZE(gbm_swrast_device_extensions), - extensions); + bind_ok = true; } + dri->swrast = swrast; + if (!bind_ok) { fprintf(stderr, "failed to bind extensions\n"); goto fail; diff --git a/src/gbm/backends/dri/gbm_driint.h b/src/gbm/backends/dri/gbm_driint.h index fadfeafce89..422f6db0855 100644 --- a/src/gbm/backends/dri/gbm_driint.h +++ b/src/gbm/backends/dri/gbm_driint.h @@ -51,6 +51,7 @@ struct gbm_dri_device { char *driver_name; /* Name of the DRI module, without the _dri suffix */ bool software; /* A software driver was loaded */ + bool swrast; /* this is swrast */ __DRIscreen *screen; __DRIcontext *context; @@ -58,7 +59,6 @@ struct gbm_dri_device { const __DRIimageExtension *image; const __DRIimageDriverExtension *image_driver; - const __DRIswrastExtension *swrast; const __DRI2flushExtension *flush; const __DRIconfig **driver_configs;