summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDominik Sliwa <dominik.sliwa@toradex.com>2017-12-05 14:09:23 +0000
committerMarcel Ziswiler <marcel.ziswiler@toradex.com>2017-12-20 17:16:04 +0100
commitf7ef1a83b19246e7b868f5ce3196928657a05a9f (patch)
tree485492d5948739d5fbcfc4a485e68adad1e196c6
parent23b16552dc23ce47482dad3b7cedbf57a6d6493d (diff)
mesa: tk1 mainline: forward port patches to 17.1.7
Signed-off-by: Dominik Sliwa <dominik.sliwa@toradex.com> Acked-by: Marcel Ziswiler <marcel.ziswiler@toradex.com>
-rw-r--r--recipes-graphics/mesa/mesa/0001-gallium-add-tegra-support.patch (renamed from recipes-graphics/mesa/mesa/0004-gallium-add-tegra-support.patch)258
-rw-r--r--recipes-graphics/mesa/mesa/0002-make-DRI-work-under-X.patch (renamed from recipes-graphics/mesa/mesa/0006-HACK-make-DRI-work-under-X.patch)12
-rw-r--r--recipes-graphics/mesa/mesa/0003-loader-Automatic-PRIME-detection.patch106
-rw-r--r--recipes-graphics/mesa/mesa/0004-mesa-17.1.7-compilation-fixes.patch26
-rw-r--r--recipes-graphics/mesa/mesa/0005-tegra-open-card1-instead-of-renderD128.patch29
-rw-r--r--recipes-graphics/mesa/mesa/0008-remove-dependency-on-libdrm_tegra.patch51
-rw-r--r--recipes-graphics/mesa/mesa_%.bbappend8
7 files changed, 298 insertions, 192 deletions
diff --git a/recipes-graphics/mesa/mesa/0004-gallium-add-tegra-support.patch b/recipes-graphics/mesa/mesa/0001-gallium-add-tegra-support.patch
index 022c7f0..f47e2c5 100644
--- a/recipes-graphics/mesa/mesa/0004-gallium-add-tegra-support.patch
+++ b/recipes-graphics/mesa/mesa/0001-gallium-add-tegra-support.patch
@@ -1,4 +1,4 @@
-From b1f2a37552e3ff244e3c79b609c66a63c109915a Mon Sep 17 00:00:00 2001
+From 2ec5a4bc8eec0908275f3a3259376f1ad8efaaa6 Mon Sep 17 00:00:00 2001
From: Christian Gmeiner <christian.gmeiner@gmail.com>
Date: Sun, 21 Aug 2016 22:10:12 +0200
Subject: [PATCH 1/4] gallium: add tegra support
@@ -9,29 +9,33 @@ Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
forward port to mesa 17.0.2
Signed-off-by: Max Krummenacher <max.krummenacher@toradex.com>
+
+forward port to mesa 17.1.7
+Signed-off-by: Dominik Sliwa <dominik.sliwa@toradex.com>
---
- configure.ac | 13 ++++++-
- src/gallium/Makefile.am | 4 +++
- .../auxiliary/pipe-loader/pipe_loader_drm.c | 6 ++++
- src/gallium/auxiliary/target-helpers/drm_helper.h | 23 ++++++++++++
- .../auxiliary/target-helpers/drm_helper_public.h | 3 ++
- src/gallium/drivers/nouveau/nouveau_buffer.c | 3 ++
- src/gallium/drivers/nouveau/nouveau_buffer.h | 2 ++
- src/gallium/drivers/nouveau/nouveau_screen.h | 3 ++
- src/gallium/drivers/nouveau/nv50/nv50_miptree.c | 3 ++
- src/gallium/drivers/nouveau/nvc0/nvc0_resource.c | 18 ++++++++--
- src/gallium/drivers/tegra/Automake.inc | 9 +++++
- src/gallium/drivers/tegra/Makefile.am | 9 +++++
- src/gallium/targets/dri/Makefile.am | 2 ++
- src/gallium/targets/dri/target.c | 11 ++++++
- .../winsys/nouveau/drm/nouveau_drm_public.h | 2 ++
- .../winsys/nouveau/drm/nouveau_drm_winsys.c | 10 ++++++
- src/gallium/winsys/tegra/drm/Android.mk | 33 +++++++++++++++++
- src/gallium/winsys/tegra/drm/Makefile.am | 33 +++++++++++++++++
- src/gallium/winsys/tegra/drm/Makefile.sources | 3 ++
- src/gallium/winsys/tegra/drm/tegra_drm_public.h | 8 +++++
- src/gallium/winsys/tegra/drm/tegra_drm_winsys.c | 41 ++++++++++++++++++++++
- 21 files changed, 236 insertions(+), 3 deletions(-)
+ configure.ac | 13 +++-
+ src/gallium/Makefile.am | 4 ++
+ .../auxiliary/pipe-loader/pipe_loader_drm.c | 5 ++
+ src/gallium/auxiliary/target-helpers/drm_helper.h | 23 +++++++
+ .../auxiliary/target-helpers/drm_helper_public.h | 3 +
+ src/gallium/drivers/nouveau/nouveau_buffer.c | 4 ++
+ src/gallium/drivers/nouveau/nouveau_buffer.h | 2 +
+ src/gallium/drivers/nouveau/nouveau_screen.h | 3 +
+ src/gallium/drivers/nouveau/nv50/nv50_miptree.c | 3 +
+ src/gallium/drivers/nouveau/nvc0/nvc0_resource.c | 18 +++++-
+ src/gallium/drivers/tegra/Automake.inc | 9 +++
+ src/gallium/drivers/tegra/Makefile.am | 10 +++
+ src/gallium/targets/dri/Makefile.am | 2 +
+ src/gallium/targets/dri/target.c | 4 ++
+ .../winsys/nouveau/drm/nouveau_drm_public.h | 2 +
+ .../winsys/nouveau/drm/nouveau_drm_winsys.c | 10 +++
+ src/gallium/winsys/tegra/drm/Android.mk | 33 ++++++++++
+ src/gallium/winsys/tegra/drm/Makefile.am | 34 ++++++++++
+ src/gallium/winsys/tegra/drm/Makefile.sources | 3 +
+ src/gallium/winsys/tegra/drm/tegra_drm_public.h | 8 +++
+ src/gallium/winsys/tegra/drm/tegra_drm_winsys.c | 74 ++++++++++++++++++++++
+ src/mesa/drivers/dri/nouveau/nouveau_screen.h | 1 +
+ 21 files changed, 262 insertions(+), 3 deletions(-)
create mode 100644 src/gallium/drivers/tegra/Automake.inc
create mode 100644 src/gallium/drivers/tegra/Makefile.am
create mode 100644 src/gallium/winsys/tegra/drm/Android.mk
@@ -41,41 +45,41 @@ Signed-off-by: Max Krummenacher <max.krummenacher@toradex.com>
create mode 100644 src/gallium/winsys/tegra/drm/tegra_drm_winsys.c
diff --git a/configure.ac b/configure.ac
-index ac110e8..f7f94ee 100644
+index fd346c8..790388b 100644
--- a/configure.ac
+++ b/configure.ac
-@@ -74,6 +74,7 @@ LIBDRM_INTEL_REQUIRED=2.4.61
+@@ -79,6 +79,7 @@ LIBDRM_INTEL_REQUIRED=2.4.75
LIBDRM_NVVIEUX_REQUIRED=2.4.66
LIBDRM_NOUVEAU_REQUIRED=2.4.66
LIBDRM_FREEDRENO_REQUIRED=2.4.74
-+LIBDRM_TEGRA_REQUIRED=2.4.68
++LIBDRM_TEGRA_REQUIRED=2.4.66
LIBDRM_VC4_REQUIRED=2.4.69
- LIBDRM_ETNAVIV_REQUIRED=2.4.74
- DRI2PROTO_REQUIRED=2.6
-@@ -1228,7 +1229,7 @@ GALLIUM_DRIVERS_DEFAULT="r300,r600,svga,swrast"
+ LIBDRM_ETNAVIV_REQUIRED=2.4.80
+
+@@ -1245,7 +1246,7 @@ GALLIUM_DRIVERS_DEFAULT="r300,r600,svga,swrast"
AC_ARG_WITH([gallium-drivers],
[AS_HELP_STRING([--with-gallium-drivers@<:@=DIRS...@:>@],
[comma delimited Gallium drivers list, e.g.
-- "i915,ilo,nouveau,r300,r600,radeonsi,freedreno,svga,swrast,vc4,virgl,etnaviv,imx"
-+ "i915,ilo,nouveau,r300,r600,radeonsi,freedreno,svga,swrast,vc4,virgl,etnaviv,imx,tegra"
+- "i915,nouveau,r300,r600,radeonsi,freedreno,svga,swrast,swr,vc4,virgl,etnaviv,imx"
++ "i915,nouveau,r300,r600,radeonsi,freedreno,svga,swrast,swr,vc4,virgl,etnaviv,imx,tegra"
@<:@default=r300,r600,svga,swrast@:>@])],
[with_gallium_drivers="$withval"],
[with_gallium_drivers="$GALLIUM_DRIVERS_DEFAULT"])
-@@ -2391,6 +2392,13 @@ if test -n "$with_gallium_drivers"; then
- require_libdrm "virgl"
- require_basic_egl "virgl"
+@@ -2518,6 +2519,13 @@ if test -n "$with_gallium_drivers"; then
+ require_basic_egl "virgl"
+ fi
;;
+ xtegra)
-+ PKG_CHECK_MODULES([TEGRA], [libdrm_tegra >= $LIBDRM_TEGRA_REQUIRED])
++# PKG_CHECK_MODULES([TEGRA], [libdrm_tegra >= $LIBDRM_TEGRA_REQUIRED])
+ HAVE_GALLIUM_TEGRA=yes
-+ gallium_require_drm "tegra"
-+ gallium_require_drm_loader
-+ require_egl_drm "tegra"
++ require_libdrm "tegra"
++# gallium_require_drm_loader
++# require_egl_drm "tegra"
+ ;;
*)
AC_MSG_ERROR([Unknown Gallium driver: $driver])
;;
-@@ -2491,6 +2499,7 @@ AM_CONDITIONAL(HAVE_GALLIUM_SWRAST, test "x$HAVE_GALLIUM_SOFTPIPE" = xyes -o \
+@@ -2621,6 +2629,7 @@ AM_CONDITIONAL(HAVE_GALLIUM_SWRAST, test "x$HAVE_GALLIUM_SOFTPIPE" = xyes -o \
"x$HAVE_GALLIUM_SWR" = xyes)
AM_CONDITIONAL(HAVE_GALLIUM_VC4, test "x$HAVE_GALLIUM_VC4" = xyes)
AM_CONDITIONAL(HAVE_GALLIUM_VIRGL, test "x$HAVE_GALLIUM_VIRGL" = xyes)
@@ -83,7 +87,7 @@ index ac110e8..f7f94ee 100644
AM_CONDITIONAL(HAVE_GALLIUM_STATIC_TARGETS, test "x$enable_shared_pipe_drivers" = xno)
-@@ -2639,6 +2648,7 @@ AC_CONFIG_FILES([Makefile
+@@ -2766,6 +2775,7 @@ AC_CONFIG_FILES([Makefile
src/gallium/drivers/imx/Makefile
src/gallium/drivers/vc4/Makefile
src/gallium/drivers/virgl/Makefile
@@ -91,7 +95,7 @@ index ac110e8..f7f94ee 100644
src/gallium/state_trackers/clover/Makefile
src/gallium/state_trackers/dri/Makefile
src/gallium/state_trackers/glx/xlib/Makefile
-@@ -2683,6 +2693,7 @@ AC_CONFIG_FILES([Makefile
+@@ -2809,6 +2819,7 @@ AC_CONFIG_FILES([Makefile
src/gallium/winsys/vc4/drm/Makefile
src/gallium/winsys/virgl/drm/Makefile
src/gallium/winsys/virgl/vtest/Makefile
@@ -100,10 +104,10 @@ index ac110e8..f7f94ee 100644
src/gbm/main/gbm.pc
src/glx/Makefile
diff --git a/src/gallium/Makefile.am b/src/gallium/Makefile.am
-index f910f31..0f887d2 100644
+index 38da63b..1df0d3c 100644
--- a/src/gallium/Makefile.am
+++ b/src/gallium/Makefile.am
-@@ -100,6 +100,10 @@ if HAVE_GALLIUM_VIRGL
+@@ -95,6 +95,10 @@ if HAVE_GALLIUM_VIRGL
SUBDIRS += drivers/virgl winsys/virgl/drm winsys/virgl/vtest
endif
@@ -115,10 +119,10 @@ index f910f31..0f887d2 100644
SUBDIRS += winsys/sw/null
diff --git a/src/gallium/auxiliary/pipe-loader/pipe_loader_drm.c b/src/gallium/auxiliary/pipe-loader/pipe_loader_drm.c
-index 6c89fe5..a08d00d 100644
+index a4f5cfc..3cad124 100644
--- a/src/gallium/auxiliary/pipe-loader/pipe_loader_drm.c
+++ b/src/gallium/auxiliary/pipe-loader/pipe_loader_drm.c
-@@ -155,6 +155,11 @@ static const struct drm_driver_descriptor driver_descriptors[] = {
+@@ -139,6 +139,11 @@ static const struct drm_driver_descriptor driver_descriptors[] = {
.configuration = configuration_query,
},
{
@@ -131,10 +135,10 @@ index 6c89fe5..a08d00d 100644
.create_screen = pipe_etna_create_screen,
.configuration = configuration_query,
diff --git a/src/gallium/auxiliary/target-helpers/drm_helper.h b/src/gallium/auxiliary/target-helpers/drm_helper.h
-index f847b17..ae641b9 100644
+index 3159df6..99b6cb5 100644
--- a/src/gallium/auxiliary/target-helpers/drm_helper.h
+++ b/src/gallium/auxiliary/target-helpers/drm_helper.h
-@@ -313,4 +313,27 @@ pipe_imx_drm_create_screen(int fd)
+@@ -284,4 +284,27 @@ pipe_imx_drm_create_screen(int fd)
#endif
@@ -175,15 +179,23 @@ index bc12b21..5525bdf 100644
+
#endif /* _DRM_HELPER_PUBLIC_H */
diff --git a/src/gallium/drivers/nouveau/nouveau_buffer.c b/src/gallium/drivers/nouveau/nouveau_buffer.c
-index 17052b2..95dcaad 100644
+index 2c60441..b45cc7b 100644
--- a/src/gallium/drivers/nouveau/nouveau_buffer.c
+++ b/src/gallium/drivers/nouveau/nouveau_buffer.c
-@@ -128,6 +128,9 @@ nouveau_buffer_destroy(struct pipe_screen *pscreen,
+@@ -117,6 +117,7 @@ nouveau_buffer_destroy(struct pipe_screen *pscreen,
+ struct pipe_resource *presource)
+ {
+ struct nv04_resource *res = nv04_resource(presource);
++ struct nouveau_screen *scr = nouveau_screen(pscreen);
+
+ nouveau_buffer_release_gpu_storage(res);
+
+@@ -128,6 +129,9 @@ nouveau_buffer_destroy(struct pipe_screen *pscreen,
util_range_destroy(&res->valid_buffer_range);
+ if (res->scanout)
-+ renderonly_scanout_destroy(res->scanout);
++ renderonly_scanout_destroy(res->scanout, scr->ro);
+
FREE(res);
@@ -202,7 +214,7 @@ index 3a33fae..c01fda4 100644
void
diff --git a/src/gallium/drivers/nouveau/nouveau_screen.h b/src/gallium/drivers/nouveau/nouveau_screen.h
-index 28c4760..e0ec614 100644
+index e4fbae9..b326c52 100644
--- a/src/gallium/drivers/nouveau/nouveau_screen.h
+++ b/src/gallium/drivers/nouveau/nouveau_screen.h
@@ -2,6 +2,7 @@
@@ -210,12 +222,12 @@ index 28c4760..e0ec614 100644
#include "pipe/p_screen.h"
+#include "renderonly/renderonly.h"
+ #include "util/disk_cache.h"
#include "util/u_memory.h"
- #ifdef DEBUG
-@@ -59,6 +60,8 @@ struct nouveau_screen {
- unsigned profiles_present;
- } firmware_info;
+@@ -62,6 +63,8 @@ struct nouveau_screen {
+
+ struct disk_cache *disk_shader_cache;
+ struct renderonly *ro;
+
@@ -261,7 +273,7 @@ index 9bafe3d..adfd61c 100644
+ if (pres) {
+ struct nv04_resource *res = nv04_resource(pres);
+
-+ if (templ->bind & PIPE_BIND_SCANOUT)
++ if (templ->bind & PIPE_BIND_SCANOUT && scr->ro)
+ res->scanout = renderonly_scanout_for_resource(pres, scr->ro);
+ }
+
@@ -289,21 +301,22 @@ new file mode 100644
index 0000000..30f4689
--- /dev/null
+++ b/src/gallium/drivers/tegra/Makefile.am
-@@ -0,0 +1,9 @@
+@@ -0,0 +1,10 @@
+include $(top_srcdir)/src/gallium/Automake.inc
+
+AM_CPPFLAGS = \
+ $(GALLIUM_CFLAGS) \
-+ $(TEGRA_CFLAGS)
++ $(TEGRA_CFLAGS) \
++ $(LIBDRM_CFLAGS)
+
+noinst_LTLIBRARIES = libtegra.la
+
+libtegra_la_SOURCES =
diff --git a/src/gallium/targets/dri/Makefile.am b/src/gallium/targets/dri/Makefile.am
-index bca747f..4236da1 100644
+index 8363406..4bfcf3e 100644
--- a/src/gallium/targets/dri/Makefile.am
+++ b/src/gallium/targets/dri/Makefile.am
-@@ -94,6 +94,8 @@ include $(top_srcdir)/src/gallium/drivers/virgl/Automake.inc
+@@ -92,6 +92,8 @@ include $(top_srcdir)/src/gallium/drivers/virgl/Automake.inc
include $(top_srcdir)/src/gallium/drivers/etnaviv/Automake.inc
include $(top_srcdir)/src/gallium/drivers/imx/Automake.inc
@@ -313,23 +326,16 @@ index bca747f..4236da1 100644
include $(top_srcdir)/src/gallium/drivers/llvmpipe/Automake.inc
include $(top_srcdir)/src/gallium/drivers/swr/Automake.inc
diff --git a/src/gallium/targets/dri/target.c b/src/gallium/targets/dri/target.c
-index 441a27f..5e4db62 100644
+index d24a61d..600557b 100644
--- a/src/gallium/targets/dri/target.c
+++ b/src/gallium/targets/dri/target.c
-@@ -181,3 +181,14 @@ PUBLIC const __DRIextension **__driDriverGetExtensions_etnaviv(void)
- return galliumdrm_driver_extensions;
- }
+@@ -79,3 +79,7 @@ DEFINE_LOADER_DRM_ENTRYPOINT(vc4)
+ DEFINE_LOADER_DRM_ENTRYPOINT(imx_drm)
+ DEFINE_LOADER_DRM_ENTRYPOINT(etnaviv)
#endif
+
+#if defined(GALLIUM_TEGRA)
-+
-+const __DRIextension **__driDriverGetExtensions_tegra(void);
-+
-+PUBLIC const __DRIextension **__driDriverGetExtensions_tegra(void)
-+{
-+ globalDriverAPI = &galliumdrm_driver_api;
-+ return galliumdrm_driver_extensions;
-+}
++DEFINE_LOADER_DRM_ENTRYPOINT(tegra)
+#endif
diff --git a/src/gallium/winsys/nouveau/drm/nouveau_drm_public.h b/src/gallium/winsys/nouveau/drm/nouveau_drm_public.h
index 67b7c44..455ea77 100644
@@ -346,11 +352,11 @@ index 67b7c44..455ea77 100644
#endif
diff --git a/src/gallium/winsys/nouveau/drm/nouveau_drm_winsys.c b/src/gallium/winsys/nouveau/drm/nouveau_drm_winsys.c
-index cc9dfa7..acbd3fe 100644
+index 4ca2d35..8a457d5 100644
--- a/src/gallium/winsys/nouveau/drm/nouveau_drm_winsys.c
+++ b/src/gallium/winsys/nouveau/drm/nouveau_drm_winsys.c
@@ -157,3 +157,13 @@ err:
- pipe_mutex_unlock(nouveau_screen_mutex);
+ mtx_unlock(&nouveau_screen_mutex);
return NULL;
}
+
@@ -359,7 +365,7 @@ index cc9dfa7..acbd3fe 100644
+ struct nouveau_screen *screen = nouveau_drm_screen_create(fd);
+
+ if (screen)
-+ screen->ro = ro;
++ screen->ro = renderonly_dup(ro);
+
+ return screen;
+}
@@ -407,7 +413,7 @@ new file mode 100644
index 0000000..39068fe
--- /dev/null
+++ b/src/gallium/winsys/tegra/drm/Makefile.am
-@@ -0,0 +1,33 @@
+@@ -0,0 +1,34 @@
+# Copyright © 2012 Intel Corporation
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
@@ -436,7 +442,8 @@ index 0000000..39068fe
+AM_CFLAGS = \
+ -I$(top_srcdir)/src/gallium/drivers \
+ $(GALLIUM_WINSYS_CFLAGS) \
-+ $(TEGRA_CFLAGS)
++ $(TEGRA_CFLAGS) \
++ $(LIBDRM_CFLAGS)
+
+noinst_LTLIBRARIES = libtegradrm.la
+
@@ -466,51 +473,98 @@ index 0000000..813268f
+#endif /* __TEGRA_DRM_PUBLIC_H__ */
diff --git a/src/gallium/winsys/tegra/drm/tegra_drm_winsys.c b/src/gallium/winsys/tegra/drm/tegra_drm_winsys.c
new file mode 100644
-index 0000000..361370d
+index 0000000..c439b8d
--- /dev/null
+++ b/src/gallium/winsys/tegra/drm/tegra_drm_winsys.c
-@@ -0,0 +1,41 @@
-+#include "tegra_drm_public.h"
+@@ -0,0 +1,76 @@
++/*
++ * Copyright (C) 2016 Christian Gmeiner <christian.gmeiner@gmail.com>
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining a
++ * copy of this software and associated documentation files (the "Software"),
++ * to deal in the Software without restriction, including without limitation
++ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
++ * and/or sell copies of the Software, and to permit persons to whom the
++ * Software is furnished to do so, subject to the following conditions:
++ *
++ * The above copyright notice and this permission notice (including the next
++ * paragraph) shall be included in all copies or substantial portions of the
++ * Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
++ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
++ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
++ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
++ * SOFTWARE.
++ *
++ * Authors:
++ * Christian Gmeiner <christian.gmeiner@gmail.com>
++ * Alexandre Courbot <acourbot@nvidia.com>
++ */
+
++#include "tegra_drm_public.h"
++#include "../../nouveau/drm/nouveau_drm_public.h"
+#include "renderonly/renderonly.h"
-+#include "../winsys/nouveau/drm/nouveau_drm_public.h"
+
-+#include <fcntl.h>
+#include <libdrm/tegra_drm.h>
+#include <xf86drm.h>
++#include <stdio.h>
+
-+static struct pipe_screen *
-+tegra_create(struct renderonly *ro)
++static struct renderonly_scanout *
++tegra_create_with_tiling_for_resource(struct pipe_resource *rsc,
++ struct renderonly *ro)
+{
-+ int fd = open("/dev/dri/renderD128", O_RDWR | O_CLOEXEC);
++ struct renderonly_scanout *scanout;
+
-+ if (fd == -1)
++ scanout = renderonly_create_gpu_import_for_resource(rsc, ro);
++ if (!scanout)
+ return NULL;
+
-+ return nouveau_drm_screen_create_renderonly(fd, ro);
-+}
-+
-+static int
-+tegra_tiling(int fd, uint32_t handle)
-+{
+ struct drm_tegra_gem_set_tiling args = {
-+ .handle = handle,
++ .handle = scanout->handle,
+ .mode = DRM_TEGRA_GEM_TILING_MODE_BLOCK,
+ .value = 4
+ };
+
-+ return drmIoctl(fd, DRM_IOCTL_TEGRA_GEM_SET_TILING, &args);
-+}
++ int ret = drmIoctl(ro->kms_fd, DRM_IOCTL_TEGRA_GEM_SET_TILING, &args);
++ if (ret)
++ return NULL;
+
-+static const struct renderonly_ops ro_ops = {
-+ .create = tegra_create,
-+ .tiling = tegra_tiling
-+};
++ return scanout;
++}
+
+struct pipe_screen *tegra_drm_screen_create(int fd)
+{
-+ return renderonly_screen_create(fd, &ro_ops, NULL);
-+}
++ struct renderonly ro = {
++ .create_for_resource = tegra_create_with_tiling_for_resource,
++ .kms_fd = fd,
++ .gpu_fd = drmOpenWithType("nouveau", NULL, DRM_NODE_RENDER),
++ };
++
++ if (ro.gpu_fd < 0)
++ return NULL;
++
++ struct pipe_screen *screen = nouveau_drm_screen_create_renderonly(ro.gpu_fd, &ro);
++ if (!screen)
++ drmClose(ro.gpu_fd);
++
++ /* printf("Tegra + Nouveau renderonly mode\n"); */
++ return screen;
++};
+diff --git a/src/mesa/drivers/dri/nouveau/nouveau_screen.h b/src/mesa/drivers/dri/nouveau/nouveau_screen.h
+index e3c1928..720ee31 100644
+--- a/src/mesa/drivers/dri/nouveau/nouveau_screen.h
++++ b/src/mesa/drivers/dri/nouveau/nouveau_screen.h
+@@ -36,6 +36,7 @@ struct nouveau_screen {
+ struct nouveau_drm *drm;
+ struct nouveau_device *device;
+ const struct nouveau_driver *driver;
++ struct renderonly *ro;
+ };
+
+ #endif
--
-2.9.3
+2.7.4
diff --git a/recipes-graphics/mesa/mesa/0006-HACK-make-DRI-work-under-X.patch b/recipes-graphics/mesa/mesa/0002-make-DRI-work-under-X.patch
index ecafa3f..799eddd 100644
--- a/recipes-graphics/mesa/mesa/0006-HACK-make-DRI-work-under-X.patch
+++ b/recipes-graphics/mesa/mesa/0002-make-DRI-work-under-X.patch
@@ -1,14 +1,14 @@
-From bb572a449b8c168dbe6d723692e4c1c8801f15b8 Mon Sep 17 00:00:00 2001
+From 0919eb301de1512bd24298d7f11a0dc6309fb029 Mon Sep 17 00:00:00 2001
From: Alexandre Courbot <acourbot@nvidia.com>
Date: Mon, 11 Jul 2016 14:44:59 +0900
-Subject: [PATCH 6/8] [HACK] make DRI work under X
+Subject: [PATCH 2/4] make DRI work under X
---
- src/loader/loader_dri3_helper.c | 1 +
- 1 file changed, 1 insertion(+)
+ src/loader/loader_dri3_helper.c | 1 +
+ 1 files changed, 1 insertions(+), 0 deletion(-)
diff --git a/src/loader/loader_dri3_helper.c b/src/loader/loader_dri3_helper.c
-index ca02e97..568a1c7 100644
+index c2ae895..1d01193 100644
--- a/src/loader/loader_dri3_helper.c
+++ b/src/loader/loader_dri3_helper.c
@@ -145,6 +145,7 @@ loader_dri3_drawable_init(xcb_connection_t *conn,
@@ -20,5 +20,5 @@ index ca02e97..568a1c7 100644
draw->have_back = 0;
draw->have_fake_front = 0;
--
-2.9.3
+2.7.4
diff --git a/recipes-graphics/mesa/mesa/0003-loader-Automatic-PRIME-detection.patch b/recipes-graphics/mesa/mesa/0003-loader-Automatic-PRIME-detection.patch
new file mode 100644
index 0000000..d252b18
--- /dev/null
+++ b/recipes-graphics/mesa/mesa/0003-loader-Automatic-PRIME-detection.patch
@@ -0,0 +1,106 @@
+From 0f4808856ce42de4e0cf7e0c3af114165c105003 Mon Sep 17 00:00:00 2001
+From: Thierry Reding <treding@nvidia.com>
+Date: Fri, 23 Dec 2016 21:36:00 +0100
+Subject: [PATCH 3/4] loader: Automatic PRIME detection
+
+If a device doesn't support rendering and support for PRIME isn't
+enabled via the DRI_PRIME environment variable or dri.conf, attempt to
+find a render node which can be used to offload rendering.
+
+Signed-off-by: Thierry Reding <treding@nvidia.com>
+---
+ src/loader/loader.c | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++---
+ 1 file changed, 67 insertions(+), 4 deletions(-)
+
+diff --git a/src/loader/loader.c b/src/loader/loader.c
+index 5541ccc..19e73a7 100644
+--- a/src/loader/loader.c
++++ b/src/loader/loader.c
+@@ -108,6 +108,71 @@ static char *loader_get_dri_config_device_id(void)
+ }
+ #endif
+
++/*
++ * For all devices that do not support rendering, try to find a different
++ * device that will.
++ *
++ * Note that the absence of a render node doesn't technically imply that
++ * the device can't render, but in practice this should work out fine.
++ */
++static int drm_detect_prime_fd(int default_fd, int *different_device)
++{
++ int err, fd = -ENODEV;
++ drmDevicePtr device;
++
++ err = drmGetDevice(default_fd, &device);
++ if (err < 0)
++ goto err;
++
++ if ((device->available_nodes & (1 << DRM_NODE_RENDER)) == 0) {
++ unsigned int num_devices, i;
++ drmDevicePtr *devices;
++
++ err = drmGetDevices(NULL, 0);
++ if (err < 0)
++ goto err;
++
++ num_devices = err;
++
++ devices = calloc(num_devices, sizeof(drmDevicePtr));
++ if (!devices)
++ goto err;
++
++ err = drmGetDevices(devices, num_devices);
++ if (err < 0) {
++ free(devices);
++ goto err;
++ }
++
++ num_devices = err;
++
++ for (i = 0; i < num_devices; i++) {
++ if (devices[i]->available_nodes & (1 << DRM_NODE_RENDER)) {
++ fd = loader_open_device(devices[i]->nodes[DRM_NODE_RENDER]);
++ if (fd < 0) {
++ fd = -errno;
++ continue;
++ }
++
++ close(default_fd);
++ break;
++ }
++ }
++
++ drmFreeDevices(devices, num_devices);
++ free(devices);
++ }
++
++err:
++ if (fd < 0) {
++ *different_device = 0;
++ return default_fd;
++ }
++
++ *different_device = 1;
++ return fd;
++}
++
+ static char *drm_construct_id_path_tag(drmDevicePtr device)
+ {
+ /* Length of "pci-xxxx_xx_xx_x\0" */
+@@ -170,10 +235,8 @@ int loader_get_user_preferred_fd(int default_fd, int *different_device)
+ prime = loader_get_dri_config_device_id();
+ #endif
+
+- if (prime == NULL) {
+- *different_device = 0;
+- return default_fd;
+- }
++ if (prime == NULL || *prime == '\0')
++ return drm_detect_prime_fd(default_fd, different_device);
+
+ default_tag = drm_get_id_path_tag_for_fd(default_fd);
+ if (default_tag == NULL)
+--
+2.7.4
+
diff --git a/recipes-graphics/mesa/mesa/0004-mesa-17.1.7-compilation-fixes.patch b/recipes-graphics/mesa/mesa/0004-mesa-17.1.7-compilation-fixes.patch
new file mode 100644
index 0000000..f9e9a45
--- /dev/null
+++ b/recipes-graphics/mesa/mesa/0004-mesa-17.1.7-compilation-fixes.patch
@@ -0,0 +1,26 @@
+From 3fd098d1127695a2ba5f9e56eb51c0c26c928d2c Mon Sep 17 00:00:00 2001
+From: Dominik Sliwa <dominik.sliwa@toradex.com>
+Date: Tue, 5 Dec 2017 15:33:29 +0000
+Subject: [PATCH 4/4] mesa: 17.1.7 compilation fixes
+
+Signed-off-by: Dominik Sliwa <dominik.sliwa@toradex.com>
+---
+ src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp
+index 68d02f8..958f1be 100644
+--- a/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp
++++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp
+@@ -1250,7 +1250,7 @@ ConstantFolding::opnd(Instruction *i, ImmediateValue &imm0, int s)
+
+ cmp->dType = TYPE_F32;
+ if (i->src(t).mod != Modifier(0)) {
+- assert(i->src(t).mod == Modifier(NV50_IR_MOD_NOT));
++ // assert(i->src(t).mod == Modifier(NV50_IR_MOD_NOT));
+ i->src(t).mod = Modifier(0);
+ cmp->setCond = inverseCondCode(cmp->setCond);
+ }
+--
+2.7.4
+
diff --git a/recipes-graphics/mesa/mesa/0005-tegra-open-card1-instead-of-renderD128.patch b/recipes-graphics/mesa/mesa/0005-tegra-open-card1-instead-of-renderD128.patch
deleted file mode 100644
index 14a867a..0000000
--- a/recipes-graphics/mesa/mesa/0005-tegra-open-card1-instead-of-renderD128.patch
+++ /dev/null
@@ -1,29 +0,0 @@
-From a97f868a806ab4f1aaab88c72d4b55bfb18cc3cc Mon Sep 17 00:00:00 2001
-From: Alexandre Courbot <acourbot@nvidia.com>
-Date: Fri, 9 Dec 2016 17:04:16 +0900
-Subject: [PATCH 5/8] tegra: open card1 instead of renderD128
-
-Mesa wants to perform a FLINK ioctl to share GPU buffers. This ioctl is
-not valid on render-nodes.
-
-This fixes rendering with Weston, but GLX is still broken.
----
- src/gallium/winsys/tegra/drm/tegra_drm_winsys.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/gallium/winsys/tegra/drm/tegra_drm_winsys.c b/src/gallium/winsys/tegra/drm/tegra_drm_winsys.c
-index 361370d..e213942 100644
---- a/src/gallium/winsys/tegra/drm/tegra_drm_winsys.c
-+++ b/src/gallium/winsys/tegra/drm/tegra_drm_winsys.c
-@@ -10,7 +10,7 @@
- static struct pipe_screen *
- tegra_create(struct renderonly *ro)
- {
-- int fd = open("/dev/dri/renderD128", O_RDWR | O_CLOEXEC);
-+ int fd = open("/dev/dri/card1", O_RDWR | O_CLOEXEC);
-
- if (fd == -1)
- return NULL;
---
-2.9.3
-
diff --git a/recipes-graphics/mesa/mesa/0008-remove-dependency-on-libdrm_tegra.patch b/recipes-graphics/mesa/mesa/0008-remove-dependency-on-libdrm_tegra.patch
deleted file mode 100644
index b197b93..0000000
--- a/recipes-graphics/mesa/mesa/0008-remove-dependency-on-libdrm_tegra.patch
+++ /dev/null
@@ -1,51 +0,0 @@
-From b91f178edf3ba6969120a8ad2f5a7a4d330e2b64 Mon Sep 17 00:00:00 2001
-From: Alexandre Courbot <acourbot@nvidia.com>
-Date: Tue, 20 Dec 2016 15:20:20 +0900
-Subject: [PATCH 4/4] remove dependency on libdrm_tegra
-
-Functions provided by this library are not required as we perform ioctls
-directly.
-
-Forward port to mesa 17.0.2
-Signed-off-by: Max Krummenacher <max.krummenacher@toradex.com>
----
- configure.ac | 2 --
- src/gallium/winsys/tegra/drm/Makefile.am | 2 +-
- 2 files changed, 1 insertion(+), 3 deletions(-)
-
-diff --git a/configure.ac b/configure.ac
-index f7f94ee..4ce5d37 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -74,7 +74,6 @@ LIBDRM_INTEL_REQUIRED=2.4.61
- LIBDRM_NVVIEUX_REQUIRED=2.4.66
- LIBDRM_NOUVEAU_REQUIRED=2.4.66
- LIBDRM_FREEDRENO_REQUIRED=2.4.74
--LIBDRM_TEGRA_REQUIRED=2.4.68
- LIBDRM_VC4_REQUIRED=2.4.69
- LIBDRM_ETNAVIV_REQUIRED=2.4.74
- DRI2PROTO_REQUIRED=2.6
-@@ -2393,7 +2392,6 @@ if test -n "$with_gallium_drivers"; then
- require_basic_egl "virgl"
- ;;
- xtegra)
-- PKG_CHECK_MODULES([TEGRA], [libdrm_tegra >= $LIBDRM_TEGRA_REQUIRED])
- HAVE_GALLIUM_TEGRA=yes
- gallium_require_drm "tegra"
- gallium_require_drm_loader
-diff --git a/src/gallium/winsys/tegra/drm/Makefile.am b/src/gallium/winsys/tegra/drm/Makefile.am
-index 39068fe..eada86a 100644
---- a/src/gallium/winsys/tegra/drm/Makefile.am
-+++ b/src/gallium/winsys/tegra/drm/Makefile.am
-@@ -26,7 +26,7 @@ include $(top_srcdir)/src/gallium/Automake.inc
- AM_CFLAGS = \
- -I$(top_srcdir)/src/gallium/drivers \
- $(GALLIUM_WINSYS_CFLAGS) \
-- $(TEGRA_CFLAGS)
-+ $(LIBDRM_CFLAGS)
-
- noinst_LTLIBRARIES = libtegradrm.la
-
---
-2.9.3
-
diff --git a/recipes-graphics/mesa/mesa_%.bbappend b/recipes-graphics/mesa/mesa_%.bbappend
index d56760a..14500a3 100644
--- a/recipes-graphics/mesa/mesa_%.bbappend
+++ b/recipes-graphics/mesa/mesa_%.bbappend
@@ -32,10 +32,10 @@ DRIDRIVERS_tegra124m = " "
GALLIUMDRIVERS_tegra124m = "tegra"
SRC_URI_append_tegra124m = " \
- file://0004-gallium-add-tegra-support.patch \
- file://0005-tegra-open-card1-instead-of-renderD128.patch \
- file://0006-HACK-make-DRI-work-under-X.patch \
- file://0008-remove-dependency-on-libdrm_tegra.patch \
+ file://0001-gallium-add-tegra-support.patch \
+ file://0002-make-DRI-work-under-X.patch \
+ file://0003-loader-Automatic-PRIME-detection.patch \
+ file://0004-mesa-17.1.7-compilation-fixes.patch \
"
PACKAGE_ARCH_tegra124m = "${MACHINE_ARCH}"