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