diff options
Diffstat (limited to 'src/gallium/targets/egl-static')
-rw-r--r-- | src/gallium/targets/egl-static/Android.mk | 6 | ||||
-rw-r--r-- | src/gallium/targets/egl-static/Makefile.am | 1 | ||||
-rw-r--r-- | src/gallium/targets/egl-static/SConscript | 1 | ||||
-rw-r--r-- | src/gallium/targets/egl-static/egl.c | 185 |
4 files changed, 13 insertions, 180 deletions
diff --git a/src/gallium/targets/egl-static/Android.mk b/src/gallium/targets/egl-static/Android.mk index 88df6d12205..37244b5443a 100644 --- a/src/gallium/targets/egl-static/Android.mk +++ b/src/gallium/targets/egl-static/Android.mk @@ -45,10 +45,8 @@ LOCAL_C_INCLUDES := \ # swrast LOCAL_CFLAGS += -DGALLIUM_SOFTPIPE -# swrast only -ifeq ($(MESA_GPU_DRIVERS),swrast) -LOCAL_CFLAGS += -D_EGL_NO_DRM -else +# !swrast only +ifneq ($(MESA_GPU_DRIVERS),swrast) LOCAL_C_INCLUDES += \ $(DRM_TOP)/include/drm \ $(DRM_TOP) diff --git a/src/gallium/targets/egl-static/Makefile.am b/src/gallium/targets/egl-static/Makefile.am index ebffd0ecfbb..73bb79569c0 100644 --- a/src/gallium/targets/egl-static/Makefile.am +++ b/src/gallium/targets/egl-static/Makefile.am @@ -61,6 +61,7 @@ egl_gallium_la_LIBADD = \ $(top_builddir)/src/gallium/drivers/rbug/librbug.la \ $(top_builddir)/src/gallium/state_trackers/egl/libegl.la \ $(top_builddir)/src/egl/main/libEGL.la \ + $(top_builddir)/src/loader/libloader.la \ $(CLOCK_LIB) \ $(LIBUDEV_LIBS) \ $(DLOPEN_LIBS) \ diff --git a/src/gallium/targets/egl-static/SConscript b/src/gallium/targets/egl-static/SConscript index 56e12e838f5..83937fe61ad 100644 --- a/src/gallium/targets/egl-static/SConscript +++ b/src/gallium/targets/egl-static/SConscript @@ -31,6 +31,7 @@ env.Prepend(LIBS = [ rbug, trace, galahad, + libloader, gallium, egl, st_egl, diff --git a/src/gallium/targets/egl-static/egl.c b/src/gallium/targets/egl-static/egl.c index 0b59bdb521c..f19f024b93b 100644 --- a/src/gallium/targets/egl-static/egl.c +++ b/src/gallium/targets/egl-static/egl.c @@ -28,14 +28,7 @@ #include "common/egl_g3d_loader.h" #include "egldriver.h" #include "egllog.h" - -#ifdef HAVE_LIBUDEV -#include <stdio.h> /* for sscanf */ -#include <libudev.h> -#endif - -#define DRIVER_MAP_GALLIUM_ONLY -#include "pci_ids/pci_id_driver_map.h" +#include "loader.h" #include "egl_pipe.h" #include "egl_st.h" @@ -60,180 +53,15 @@ get_st_api(enum st_api_type api) return stmod->stapi; } -#ifdef HAVE_LIBUDEV - -static boolean -drm_fd_get_pci_id(int fd, int *vendor_id, int *chip_id) -{ - struct udev *udev = NULL; - struct udev_device *device = NULL, *parent; - struct stat buf; - const char *pci_id; - - *chip_id = -1; - - udev = udev_new(); - if (fstat(fd, &buf) < 0) { - _eglLog(_EGL_WARNING, "failed to stat fd %d", fd); - goto out; - } - - device = udev_device_new_from_devnum(udev, 'c', buf.st_rdev); - if (device == NULL) { - _eglLog(_EGL_WARNING, - "could not create udev device for fd %d", fd); - goto out; - } - - parent = udev_device_get_parent(device); - if (parent == NULL) { - _eglLog(_EGL_WARNING, "could not get parent device"); - goto out; - } - - pci_id = udev_device_get_property_value(parent, "PCI_ID"); - if (pci_id == NULL || - sscanf(pci_id, "%x:%x", vendor_id, chip_id) != 2) { - _eglLog(_EGL_WARNING, "malformed or no PCI ID"); - *chip_id = -1; - goto out; - } - -out: - if (device) - udev_device_unref(device); - if (udev) - udev_unref(udev); - - return (*chip_id >= 0); -} - -#elif defined(PIPE_OS_ANDROID) && !defined(_EGL_NO_DRM) - -#include <xf86drm.h> -/* for i915 */ -#include <i915_drm.h> -/* for radeon */ -#include <radeon_drm.h> -/* for util_strcmp */ -#include "util/u_string.h" - -static boolean -drm_fd_get_pci_id(int fd, int *vendor_id, int *chip_id) -{ - drmVersionPtr version; - - *chip_id = -1; - - version = drmGetVersion(fd); - if (!version) { - _eglLog(_EGL_WARNING, "invalid drm fd"); - return FALSE; - } - if (!version->name) { - _eglLog(_EGL_WARNING, "unable to determine the driver name"); - drmFreeVersion(version); - return FALSE; - } - - if (util_strcmp(version->name, "i915") == 0) { - struct drm_i915_getparam gp; - int ret; - - *vendor_id = 0x8086; - - memset(&gp, 0, sizeof(gp)); - gp.param = I915_PARAM_CHIPSET_ID; - gp.value = chip_id; - ret = drmCommandWriteRead(fd, DRM_I915_GETPARAM, &gp, sizeof(gp)); - if (ret) { - _eglLog(_EGL_WARNING, "failed to get param for i915"); - *chip_id = -1; - } - } - else if (util_strcmp(version->name, "radeon") == 0) { - struct drm_radeon_info info; - int ret; - - *vendor_id = 0x1002; - - memset(&info, 0, sizeof(info)); - info.request = RADEON_INFO_DEVICE_ID; - info.value = (unsigned long) chip_id; - ret = drmCommandWriteRead(fd, DRM_RADEON_INFO, &info, sizeof(info)); - if (ret) { - _eglLog(_EGL_WARNING, "failed to get info for radeon"); - *chip_id = -1; - } - } - else if (util_strcmp(version->name, "nouveau") == 0) { - *vendor_id = 0x10de; - /* not used */ - *chip_id = 0; - } - else if (util_strcmp(version->name, "vmwgfx") == 0) { - *vendor_id = 0x15ad; - /* assume SVGA II */ - *chip_id = 0x0405; - } - - drmFreeVersion(version); - - return (*chip_id >= 0); -} - -#else - -static boolean -drm_fd_get_pci_id(int fd, int *vendor_id, int *chip_id) -{ - return FALSE; -} - -#endif /* HAVE_LIBUDEV */ - -static const char * -drm_fd_get_screen_name(int fd) -{ - int vendor_id, chip_id; - int idx, i; - - if (!drm_fd_get_pci_id(fd, &vendor_id, &chip_id)) { - _eglLog(_EGL_WARNING, "failed to get driver name for fd %d", fd); - return NULL; - } - - for (idx = 0; driver_map[idx].driver; idx++) { - if (vendor_id != driver_map[idx].vendor_id) - continue; - - /* done if no chip id */ - if (driver_map[idx].num_chips_ids == -1) - break; - - for (i = 0; i < driver_map[idx].num_chips_ids; i++) { - if (driver_map[idx].chip_ids[i] == chip_id) - break; - } - /* matched! */ - if (i < driver_map[idx].num_chips_ids) - break; - } - - _eglLog((driver_map[idx].driver) ? _EGL_INFO : _EGL_WARNING, - "pci id for fd %d: %04x:%04x, driver %s", - fd, vendor_id, chip_id, driver_map[idx].driver); - - return driver_map[idx].driver; -} static struct pipe_screen * -create_drm_screen(const char *name, int fd) +create_drm_screen(const char *constname, int fd) { struct pipe_screen *screen; + char *name = (char *)constname; if (!name) { - name = drm_fd_get_screen_name(fd); + name = loader_get_driver_for_fd(fd, _LOADER_GALLIUM); if (!name) return NULL; } @@ -244,6 +72,9 @@ create_drm_screen(const char *name, int fd) else _eglLog(_EGL_WARNING, "failed to create a pipe screen for %s", name); + if (name != constname) + free(name); + return screen; } @@ -265,6 +96,8 @@ loader_init(void) egl_g3d_loader.create_drm_screen = create_drm_screen; egl_g3d_loader.create_sw_screen = create_sw_screen; + loader_set_logger(_eglLog); + return &egl_g3d_loader; } |