native_x11.c revision 11f4360f2e915f236558da22efe5bdabd81446f3
149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu/*
249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Mesa 3-D graphics library
349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Version:  7.8
449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu *
549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Copyright (C) 2009-2010 Chia-I Wu <olv@0xlab.org>
649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu *
749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Permission is hereby granted, free of charge, to any person obtaining a
849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * copy of this software and associated documentation files (the "Software"),
949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * to deal in the Software without restriction, including without limitation
1049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * the rights to use, copy, modify, merge, publish, distribute, sublicense,
1149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * and/or sell copies of the Software, and to permit persons to whom the
1249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Software is furnished to do so, subject to the following conditions:
1349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu *
1449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * The above copyright notice and this permission notice shall be included
1549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * in all copies or substantial portions of the Software.
1649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu *
1749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
1849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
2049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
2149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
2249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu */
2449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
2549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include <string.h>
2649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include "util/u_debug.h"
2711f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu#include "util/u_memory.h"
2849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include "state_tracker/drm_api.h"
2949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include "egllog.h"
3049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
3149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include "native_x11.h"
3211f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu#include "x11_screen.h"
3311f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu
3411f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu#define X11_PROBE_MAGIC 0x11980BE /* "X11PROBE" */
3549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
3649381d63e61c724b156b76068058df1c01a906c2Chia-I Wustatic struct drm_api *api;
3749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
3811f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wustatic void
3911f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wux11_probe_destroy(struct native_probe *nprobe)
4011f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu{
4111f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu   if (nprobe->data)
4211f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu      free(nprobe->data);
4311f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu   free(nprobe);
4411f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu}
4511f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu
4611f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wustruct native_probe *
4711f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wunative_create_probe(EGLNativeDisplayType dpy)
4811f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu{
4911f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu   struct native_probe *nprobe;
5011f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu   struct x11_screen *xscr;
5111f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu   int scr;
5211f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu   const char *driver_name = NULL;
5311f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu   Display *xdpy;
5411f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu
5511f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu   nprobe = CALLOC_STRUCT(native_probe);
5611f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu   if (!nprobe)
5711f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu      return NULL;
5811f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu
5911f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu   xdpy = dpy;
6011f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu   if (!xdpy) {
6111f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu      xdpy = XOpenDisplay(NULL);
6211f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu      if (!xdpy) {
6311f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu         free(nprobe);
6411f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu         return NULL;
6511f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu      }
6611f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu   }
6711f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu
6811f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu   scr = DefaultScreen(xdpy);
6911f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu   xscr = x11_screen_create(xdpy, scr);
7011f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu   if (xscr) {
7111f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu      if (x11_screen_support(xscr, X11_SCREEN_EXTENSION_DRI2)) {
7211f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu         driver_name = x11_screen_probe_dri2(xscr);
7311f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu         nprobe->data = strdup(driver_name);
7411f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu      }
7511f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu
7611f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu      x11_screen_destroy(xscr);
7711f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu   }
7811f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu
7911f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu   if (xdpy != dpy)
8011f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu      XCloseDisplay(xdpy);
8111f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu
8211f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu   nprobe->magic = X11_PROBE_MAGIC;
8311f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu   nprobe->display = dpy;
8411f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu
8511f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu   nprobe->destroy = x11_probe_destroy;
8611f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu
8711f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu   return nprobe;
8811f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu}
8911f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu
9011f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wuenum native_probe_result
9111f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wunative_get_probe_result(struct native_probe *nprobe)
9211f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu{
9311f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu   if (!nprobe || nprobe->magic != X11_PROBE_MAGIC)
9411f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu      return NATIVE_PROBE_UNKNOWN;
9511f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu
9611f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu   if (!api)
9711f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu      api = drm_api_create();
9811f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu
9911f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu   /* this is a software driver */
10011f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu   if (!api)
10111f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu      return NATIVE_PROBE_SUPPORTED;
10211f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu
10311f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu   /* the display does not support DRI2 or the driver mismatches */
10411f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu   if (!nprobe->data || strcmp(api->name, (const char *) nprobe->data) != 0)
10511f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu      return NATIVE_PROBE_FALLBACK;
10611f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu
10711f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu   return NATIVE_PROBE_EXACT;
10811f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu}
10911f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu
11049381d63e61c724b156b76068058df1c01a906c2Chia-I Wuconst char *
11149381d63e61c724b156b76068058df1c01a906c2Chia-I Wunative_get_name(void)
11249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu{
11349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   static char x11_name[32];
11449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
11549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   if (!api)
11649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      api = drm_api_create();
11749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
11849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   if (api)
11949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      snprintf(x11_name, sizeof(x11_name), "X11/%s", api->name);
12049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   else
12149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      snprintf(x11_name, sizeof(x11_name), "X11");
12249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
12349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   return x11_name;
12449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu}
12549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
12649381d63e61c724b156b76068058df1c01a906c2Chia-I Wustruct native_display *
12751b00574a2ef81629548b079ef70c016bdd4251dChia-I Wunative_create_display(EGLNativeDisplayType dpy)
12849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu{
12949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   struct native_display *ndpy = NULL;
13049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   boolean force_sw;
13149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
13249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   if (!api)
13349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      api = drm_api_create();
13449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
13549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   force_sw = debug_get_bool_option("EGL_SOFTWARE", FALSE);
13649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   if (api && !force_sw) {
13751b00574a2ef81629548b079ef70c016bdd4251dChia-I Wu      ndpy = x11_create_dri2_display(dpy, api);
13849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   }
13949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
14049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   if (!ndpy) {
14149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      EGLint level = (force_sw) ? _EGL_INFO : _EGL_WARNING;
14249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
14349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      _eglLog(level, "use software fallback");
14451b00574a2ef81629548b079ef70c016bdd4251dChia-I Wu      ndpy = x11_create_ximage_display(dpy, TRUE);
14549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   }
14649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
14749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   return ndpy;
14849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu}
149