From: Thierry Reding <tred...@nvidia.com> --- configure.ac | 5 +++-- src/gallium/drivers/tegra/Makefile.am | 9 +------- src/gallium/drivers/tegra/Makefile.sources | 5 ++++- src/gallium/drivers/tegra/tegra_context.c | 8 +++---- src/gallium/drivers/tegra/tegra_context.h | 2 +- src/gallium/drivers/tegra/tegra_resource.h | 2 +- src/gallium/drivers/tegra/tegra_screen.c | 30 ++++++++++++++++++++----- src/gallium/drivers/tegra/tegra_screen.h | 2 +- src/gallium/winsys/tegra/drm/Makefile.am | 3 +-- src/gallium/winsys/tegra/drm/tegra_drm_public.h | 2 +- src/gallium/winsys/tegra/drm/tegra_drm_winsys.c | 20 +++++++++++++++-- 11 files changed, 59 insertions(+), 29 deletions(-)
diff --git a/configure.ac b/configure.ac index 7f83fb9ee17e..60a671046016 100644 --- a/configure.ac +++ b/configure.ac @@ -80,7 +80,6 @@ LIBDRM_NVVIEUX_REQUIRED=2.4.66 LIBDRM_NOUVEAU_REQUIRED=2.4.66 LIBDRM_FREEDRENO_REQUIRED=2.4.89 LIBDRM_ETNAVIV_REQUIRED=2.4.82 -LIBDRM_TEGRA_REQUIRED=2.4.58 dnl Versions for external dependencies DRI2PROTO_REQUIRED=2.8 @@ -2598,7 +2597,6 @@ if test -n "$with_gallium_drivers"; then ;; xtegra) HAVE_GALLIUM_TEGRA=yes - PKG_CHECK_MODULES([TEGRA], [libdrm_tegra >= $LIBDRM_TEGRA_REQUIRED]) require_libdrm "tegra" ;; xswrast) @@ -2725,6 +2723,9 @@ if test "x$HAVE_GALLIUM_VC4" != xyes -a "x$HAVE_GALLIUM_PL111" = xyes ; then AC_MSG_ERROR([Building with pl111 requires vc4]) fi +if test "x$HAVE_GALLIUM_NOUVEAU" != xyes -a "x$HAVE_GALLIUM_TEGRA" = xyes; then + AC_MSG_ERROR([Building with tegra requires nouveau]) +fi detect_old_buggy_llvm() { dnl llvm-config may not give the right answer when llvm is a built as a diff --git a/src/gallium/drivers/tegra/Makefile.am b/src/gallium/drivers/tegra/Makefile.am index 1375ee97814f..7e87ea048733 100644 --- a/src/gallium/drivers/tegra/Makefile.am +++ b/src/gallium/drivers/tegra/Makefile.am @@ -1,18 +1,11 @@ -AUTOMAKE_OPTIONS = subdir-objects - include Makefile.sources include $(top_srcdir)/src/gallium/Automake.inc AM_CFLAGS = \ -I$(top_srcdir)/include/drm-uapi \ - $(GALLIUM_DRIVER_CFLAGS) \ - $(LIBUDEV_CFLAGS) \ - $(TEGRA_CFLAGS) + $(GALLIUM_DRIVER_CFLAGS) noinst_LTLIBRARIES = libtegra.la libtegra_la_SOURCES = \ $(C_SOURCES) - -libtegra_la_LIBADD = \ - $(LIBUDEV_LIBS) diff --git a/src/gallium/drivers/tegra/Makefile.sources b/src/gallium/drivers/tegra/Makefile.sources index 655c60ab6853..af4ff838c7ca 100644 --- a/src/gallium/drivers/tegra/Makefile.sources +++ b/src/gallium/drivers/tegra/Makefile.sources @@ -1,3 +1,6 @@ C_SOURCES := \ tegra_context.c \ - tegra_screen.c + tegra_context.h \ + tegra_resource.h \ + tegra_screen.c \ + tegra_screen.h diff --git a/src/gallium/drivers/tegra/tegra_context.c b/src/gallium/drivers/tegra/tegra_context.c index feaa5138c95d..38e6e59b31ff 100644 --- a/src/gallium/drivers/tegra/tegra_context.c +++ b/src/gallium/drivers/tegra/tegra_context.c @@ -1,5 +1,5 @@ /* - * Copyright © 2014-2016 NVIDIA Corporation + * Copyright © 2014-2018 NVIDIA Corporation * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -27,9 +27,9 @@ #include "util/u_debug.h" #include "util/u_inlines.h" -#include "tegra/tegra_context.h" -#include "tegra/tegra_resource.h" -#include "tegra/tegra_screen.h" +#include "tegra_context.h" +#include "tegra_resource.h" +#include "tegra_screen.h" static void tegra_destroy(struct pipe_context *pcontext) diff --git a/src/gallium/drivers/tegra/tegra_context.h b/src/gallium/drivers/tegra/tegra_context.h index 669ae1c0c4ab..4869b0913a6f 100644 --- a/src/gallium/drivers/tegra/tegra_context.h +++ b/src/gallium/drivers/tegra/tegra_context.h @@ -1,5 +1,5 @@ /* - * Copyright © 2014-2016 NVIDIA Corporation + * Copyright © 2014-2018 NVIDIA Corporation * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), diff --git a/src/gallium/drivers/tegra/tegra_resource.h b/src/gallium/drivers/tegra/tegra_resource.h index 43265211be1e..67507d64590d 100644 --- a/src/gallium/drivers/tegra/tegra_resource.h +++ b/src/gallium/drivers/tegra/tegra_resource.h @@ -1,5 +1,5 @@ /* - * Copyright © 2014-2016 NVIDIA Corporation + * Copyright © 2014-2018 NVIDIA Corporation * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), diff --git a/src/gallium/drivers/tegra/tegra_screen.c b/src/gallium/drivers/tegra/tegra_screen.c index 2bb6014238af..5ff79a5a7d66 100644 --- a/src/gallium/drivers/tegra/tegra_screen.c +++ b/src/gallium/drivers/tegra/tegra_screen.c @@ -1,5 +1,5 @@ /* - * Copyright © 2014-2016 NVIDIA Corporation + * Copyright © 2014-2018 NVIDIA Corporation * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -40,9 +40,9 @@ #include "nouveau/drm/nouveau_drm_public.h" -#include "tegra/tegra_context.h" -#include "tegra/tegra_resource.h" -#include "tegra/tegra_screen.h" +#include "tegra_context.h" +#include "tegra_resource.h" +#include "tegra_screen.h" static void tegra_screen_destroy(struct pipe_screen *pscreen) { @@ -164,8 +164,8 @@ tegra_screen_can_create_resource(struct pipe_screen *pscreen, static int tegra_open_render_node(void) { drmDevicePtr *devices, device; - int err, fd = -ENODEV; unsigned int num, i; + int err, fd; err = drmGetDevices2(0, NULL, 0); if (err < 0) @@ -185,10 +185,28 @@ static int tegra_open_render_node(void) for (i = 0; i < num; i++) { device = devices[i]; + fd = -ENODEV; if ((device->available_nodes & (1 << DRM_NODE_RENDER)) && (device->bustype == DRM_BUS_PLATFORM)) { - fd = open(device->nodes[DRM_NODE_RENDER], O_RDWR); + drmVersionPtr version; + + fd = open(device->nodes[DRM_NODE_RENDER], O_RDWR | O_CLOEXEC); + if (fd < 0) + continue; + + version = drmGetVersion(fd); + if (!version) { + close(fd); + continue; + } + + if (strcmp(version->name, "nouveau") != 0) { + close(fd); + continue; + } + + drmFreeVersion(version); break; } } diff --git a/src/gallium/drivers/tegra/tegra_screen.h b/src/gallium/drivers/tegra/tegra_screen.h index fe249aca4215..558d22f2f993 100644 --- a/src/gallium/drivers/tegra/tegra_screen.h +++ b/src/gallium/drivers/tegra/tegra_screen.h @@ -1,5 +1,5 @@ /* - * Copyright © 2014-2016 NVIDIA Corporation + * Copyright © 2014-2018 NVIDIA Corporation * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), diff --git a/src/gallium/winsys/tegra/drm/Makefile.am b/src/gallium/winsys/tegra/drm/Makefile.am index 8af32530479a..8518dedf3fb1 100644 --- a/src/gallium/winsys/tegra/drm/Makefile.am +++ b/src/gallium/winsys/tegra/drm/Makefile.am @@ -3,8 +3,7 @@ include $(top_srcdir)/src/gallium/Automake.inc AM_CFLAGS = \ -I$(top_srcdir)/src/gallium/drivers \ - $(GALLIUM_WINSYS_CFLAGS) \ - $(TEGRA_CFLAGS) + $(GALLIUM_WINSYS_CFLAGS) noinst_LTLIBRARIES = libtegradrm.la diff --git a/src/gallium/winsys/tegra/drm/tegra_drm_public.h b/src/gallium/winsys/tegra/drm/tegra_drm_public.h index 44e7eaaab931..8105180003f0 100644 --- a/src/gallium/winsys/tegra/drm/tegra_drm_public.h +++ b/src/gallium/winsys/tegra/drm/tegra_drm_public.h @@ -1,5 +1,5 @@ /* - * Copyright © 2014-2016 NVIDIA Corporation + * Copyright © 2014-2018 NVIDIA Corporation * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), diff --git a/src/gallium/winsys/tegra/drm/tegra_drm_winsys.c b/src/gallium/winsys/tegra/drm/tegra_drm_winsys.c index c320f008b82e..e2a8efb0f63f 100644 --- a/src/gallium/winsys/tegra/drm/tegra_drm_winsys.c +++ b/src/gallium/winsys/tegra/drm/tegra_drm_winsys.c @@ -1,5 +1,5 @@ /* - * Copyright © 2014-2016 NVIDIA Corporation + * Copyright © 2014-2018 NVIDIA Corporation * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -21,6 +21,8 @@ * IN THE SOFTWARE. */ +#include <fcntl.h> + #include "util/u_debug.h" #include "tegra/tegra_screen.h" @@ -29,5 +31,19 @@ struct pipe_screen *tegra_drm_screen_create(int fd); struct pipe_screen *tegra_drm_screen_create(int fd) { - return tegra_screen_create(fd); + struct pipe_screen *screen; + + /* + * NOTE: There are reportedly issues with reusing the file descriptor + * as-is related to Xinerama. Duplicate it to side-step any issues. + */ + fd = fcntl(fd, F_DUPFD_CLOEXEC, 0); + if (fd < 0) + return NULL; + + screen = tegra_screen_create(fd); + if (!screen) + close(fd); + + return screen; } -- 2.16.2 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev