egl_xdri: Add support for DRISW.
Try DRISW if both DRI2 and DRI fail. It can also be forced by setting EGL_SOFTWARE. When DRISW is used, single-buffered modes are ignored.
This commit is contained in:
parent
caa75a7ce0
commit
18b63b55d5
|
@ -6,7 +6,7 @@ include $(TOP)/configs/current
|
|||
EGL_DRIVER = egl_xdri.so
|
||||
|
||||
# steal sources from GLX
|
||||
GLX_SOURCES = dri_common.c XF86dri.c dri2.c dri2_glx.c dri_glx.c
|
||||
GLX_SOURCES = dri_common.c XF86dri.c dri2.c dri2_glx.c dri_glx.c drisw_glx.c
|
||||
GLX_SOURCES := $(addprefix ../../../glx/x11/,$(GLX_SOURCES))
|
||||
GLX_INCLUDES = \
|
||||
$(shell pkg-config --cflags-only-I libdrm) \
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
* DRI initialization. The DRI loaders are defined in src/glx/x11/.
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
#include "glxclient.h"
|
||||
|
@ -42,18 +43,26 @@ __glXEnableDirectExtension(__GLXscreenConfigs * psc, const char *name)
|
|||
_X_HIDDEN __GLXDRIdisplay *
|
||||
__driCreateDisplay(__GLXdisplayPrivate *dpyPriv, int *version)
|
||||
{
|
||||
__GLXDRIdisplay *driDisplay;
|
||||
__GLXDRIdisplay *driDisplay = NULL;
|
||||
int ver = 0;
|
||||
char *env;
|
||||
int force_sw;
|
||||
|
||||
env = getenv("EGL_SOFTWARE");
|
||||
force_sw = (env && *env != '0');
|
||||
|
||||
/* try DRI2 first */
|
||||
driDisplay = dri2CreateDisplay(dpyPriv->dpy);
|
||||
if (driDisplay) {
|
||||
/* fill in the required field */
|
||||
dpyPriv->dri2Display = driDisplay;
|
||||
ver = 2;
|
||||
if (!force_sw) {
|
||||
driDisplay = dri2CreateDisplay(dpyPriv->dpy);
|
||||
if (driDisplay) {
|
||||
/* fill in the required field */
|
||||
dpyPriv->dri2Display = driDisplay;
|
||||
ver = 2;
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* try DRI */
|
||||
|
||||
/* and then DRI */
|
||||
if (!force_sw && !driDisplay) {
|
||||
driDisplay = driCreateDisplay(dpyPriv->dpy);
|
||||
if (driDisplay) {
|
||||
dpyPriv->driDisplay = driDisplay;
|
||||
|
@ -61,6 +70,15 @@ __driCreateDisplay(__GLXdisplayPrivate *dpyPriv, int *version)
|
|||
}
|
||||
}
|
||||
|
||||
/* and then DRISW */
|
||||
if (!driDisplay) {
|
||||
driDisplay = driswCreateDisplay(dpyPriv->dpy);
|
||||
if (driDisplay) {
|
||||
dpyPriv->driDisplay = driDisplay;
|
||||
ver = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (version)
|
||||
*version = ver;
|
||||
return driDisplay;
|
||||
|
|
|
@ -72,6 +72,7 @@ struct xdri_egl_display
|
|||
Display *dpy;
|
||||
__GLXdisplayPrivate *dpyPriv;
|
||||
__GLXDRIdisplay *driDisplay;
|
||||
int driVersion;
|
||||
|
||||
__GLXscreenConfigs *psc;
|
||||
EGLint scr;
|
||||
|
@ -212,6 +213,7 @@ convert_config(_EGLConfig *conf, EGLint id, const __GLcontextModes *m)
|
|||
static EGLint
|
||||
create_configs(_EGLDisplay *disp, const __GLcontextModes *m, EGLint first_id)
|
||||
{
|
||||
struct xdri_egl_display *xdri_dpy = lookup_display(disp);
|
||||
int id = first_id;
|
||||
|
||||
for (; m; m = m->next) {
|
||||
|
@ -221,8 +223,15 @@ create_configs(_EGLDisplay *disp, const __GLcontextModes *m, EGLint first_id)
|
|||
|
||||
if (!convert_config(&conf, id, m))
|
||||
continue;
|
||||
|
||||
rb = (m->doubleBufferMode) ? EGL_BACK_BUFFER : EGL_SINGLE_BUFFER;
|
||||
if (m->doubleBufferMode) {
|
||||
rb = EGL_BACK_BUFFER;
|
||||
}
|
||||
else {
|
||||
/* ignore single-buffered mode for DRISW */
|
||||
if (xdri_dpy->driVersion == 0)
|
||||
continue;
|
||||
rb = EGL_SINGLE_BUFFER;
|
||||
}
|
||||
|
||||
xdri_conf = CALLOC_STRUCT(xdri_egl_config);
|
||||
if (xdri_conf) {
|
||||
|
@ -272,7 +281,7 @@ xdri_eglInitialize(_EGLDriver *drv, _EGLDisplay *dpy,
|
|||
return _eglError(EGL_NOT_INITIALIZED, "eglInitialize");
|
||||
}
|
||||
|
||||
driDisplay = __driCreateDisplay(dpyPriv, NULL);
|
||||
driDisplay = __driCreateDisplay(dpyPriv, &xdri_dpy->driVersion);
|
||||
if (!driDisplay) {
|
||||
_eglLog(_EGL_WARNING, "failed to create DRI display");
|
||||
free(xdri_dpy);
|
||||
|
@ -294,13 +303,13 @@ xdri_eglInitialize(_EGLDriver *drv, _EGLDisplay *dpy,
|
|||
return _eglError(EGL_NOT_INITIALIZED, "eglInitialize");
|
||||
}
|
||||
|
||||
dpy->DriverData = xdri_dpy;
|
||||
dpy->ClientAPIsMask = EGL_OPENGL_BIT;
|
||||
|
||||
/* add visuals and fbconfigs */
|
||||
first_id = create_configs(dpy, psc->visuals, first_id);
|
||||
create_configs(dpy, psc->configs, first_id);
|
||||
|
||||
dpy->DriverData = xdri_dpy;
|
||||
dpy->ClientAPIsMask = EGL_OPENGL_BIT;
|
||||
|
||||
/* we're supporting EGL 1.4 */
|
||||
*minor = 1;
|
||||
*major = 4;
|
||||
|
|
Loading…
Reference in New Issue