#include <stdio.h>
#include <string.h>
#include "util/u_debug.h"
#include "util/u_memory.h"
#include "state_tracker/drm_api.h"
#include "egllog.h"
#include "native_x11.h"
#include "x11_screen.h"
#define X11_PROBE_MAGIC 0x11980BE
static struct drm_api *api;
static void
x11_probe_destroy(struct native_probe *nprobe)
{
if (nprobe->data)
free(nprobe->data);
free(nprobe);
}
struct native_probe *
native_create_probe(EGLNativeDisplayType dpy)
{
struct native_probe *nprobe;
struct x11_screen *xscr;
int scr;
const char *driver_name = NULL;
Display *xdpy;
nprobe = CALLOC_STRUCT(native_probe);
if (!nprobe)
return NULL;
xdpy = dpy;
if (!xdpy) {
xdpy = XOpenDisplay(NULL);
if (!xdpy) {
free(nprobe);
return NULL;
}
}
scr = DefaultScreen(xdpy);
xscr = x11_screen_create(xdpy, scr);
if (xscr) {
if (x11_screen_support(xscr, X11_SCREEN_EXTENSION_DRI2)) {
driver_name = x11_screen_probe_dri2(xscr, NULL, NULL);
if (driver_name)
nprobe->data = strdup(driver_name);
}
x11_screen_destroy(xscr);
}
if (xdpy != dpy)
XCloseDisplay(xdpy);
nprobe->magic = X11_PROBE_MAGIC;
nprobe->display = dpy;
nprobe->destroy = x11_probe_destroy;
return nprobe;
}
enum native_probe_result
native_get_probe_result(struct native_probe *nprobe)
{
if (!nprobe || nprobe->magic != X11_PROBE_MAGIC)
return NATIVE_PROBE_UNKNOWN;
if (!api)
api = drm_api_create();
if (!api)
return NATIVE_PROBE_SUPPORTED;
if (!nprobe->data || strcmp(api->name, (const char *) nprobe->data) != 0)
return NATIVE_PROBE_FALLBACK;
return NATIVE_PROBE_EXACT;
}
const char *
native_get_name(void)
{
static char x11_name[32];
if (!api)
api = drm_api_create();
if (api)
snprintf(x11_name, sizeof(x11_name), "X11/%s", api->name);
else
snprintf(x11_name, sizeof(x11_name), "X11");
return x11_name;
}
struct native_display *
native_create_display(EGLNativeDisplayType dpy,
struct native_event_handler *event_handler)
{
struct native_display *ndpy = NULL;
boolean force_sw;
if (!api)
api = drm_api_create();
force_sw = debug_get_bool_option("EGL_SOFTWARE", FALSE);
if (api && !force_sw) {
ndpy = x11_create_dri2_display(dpy, event_handler, api);
}
if (!ndpy) {
EGLint level = (force_sw) ? _EGL_INFO : _EGL_WARNING;
boolean use_shm;
use_shm = FALSE;
_eglLog(level, "use software%s fallback", (use_shm) ? " (SHM)" : "");
ndpy = x11_create_ximage_display(dpy, event_handler, use_shm);
}
return ndpy;
}