summaryrefslogtreecommitdiff
path: root/recipes-graphics/mesa/mesa/0001-gallium-add-tegra-support.patch
diff options
context:
space:
mode:
Diffstat (limited to 'recipes-graphics/mesa/mesa/0001-gallium-add-tegra-support.patch')
-rw-r--r--recipes-graphics/mesa/mesa/0001-gallium-add-tegra-support.patch570
1 files changed, 570 insertions, 0 deletions
diff --git a/recipes-graphics/mesa/mesa/0001-gallium-add-tegra-support.patch b/recipes-graphics/mesa/mesa/0001-gallium-add-tegra-support.patch
new file mode 100644
index 0000000..f47e2c5
--- /dev/null
+++ b/recipes-graphics/mesa/mesa/0001-gallium-add-tegra-support.patch
@@ -0,0 +1,570 @@
+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
+
+Signed-off-by: Christian Gmeiner <christian.gmeiner@gmail.com>
+[acourbot@nvidia.com: port to latest branch]
+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 | 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
+ create mode 100644 src/gallium/winsys/tegra/drm/Makefile.am
+ create mode 100644 src/gallium/winsys/tegra/drm/Makefile.sources
+ create mode 100644 src/gallium/winsys/tegra/drm/tegra_drm_public.h
+ create mode 100644 src/gallium/winsys/tegra/drm/tegra_drm_winsys.c
+
+diff --git a/configure.ac b/configure.ac
+index fd346c8..790388b 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -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.66
+ LIBDRM_VC4_REQUIRED=2.4.69
+ 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,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"])
+@@ -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])
++ HAVE_GALLIUM_TEGRA=yes
++ require_libdrm "tegra"
++# gallium_require_drm_loader
++# require_egl_drm "tegra"
++ ;;
+ *)
+ AC_MSG_ERROR([Unknown Gallium driver: $driver])
+ ;;
+@@ -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)
++AM_CONDITIONAL(HAVE_GALLIUM_TEGRA, test "x$HAVE_GALLIUM_TEGRA" = xyes)
+
+ AM_CONDITIONAL(HAVE_GALLIUM_STATIC_TARGETS, test "x$enable_shared_pipe_drivers" = xno)
+
+@@ -2766,6 +2775,7 @@ AC_CONFIG_FILES([Makefile
+ src/gallium/drivers/imx/Makefile
+ src/gallium/drivers/vc4/Makefile
+ src/gallium/drivers/virgl/Makefile
++ src/gallium/drivers/tegra/Makefile
+ src/gallium/state_trackers/clover/Makefile
+ src/gallium/state_trackers/dri/Makefile
+ src/gallium/state_trackers/glx/xlib/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
++ src/gallium/winsys/tegra/drm/Makefile
+ src/gbm/Makefile
+ src/gbm/main/gbm.pc
+ src/glx/Makefile
+diff --git a/src/gallium/Makefile.am b/src/gallium/Makefile.am
+index 38da63b..1df0d3c 100644
+--- a/src/gallium/Makefile.am
++++ b/src/gallium/Makefile.am
+@@ -95,6 +95,10 @@ if HAVE_GALLIUM_VIRGL
+ SUBDIRS += drivers/virgl winsys/virgl/drm winsys/virgl/vtest
+ endif
+
++if HAVE_GALLIUM_TEGRA
++SUBDIRS += drivers/tegra winsys/tegra/drm
++endif
++
+ ## the sw winsys'
+ 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 a4f5cfc..3cad124 100644
+--- a/src/gallium/auxiliary/pipe-loader/pipe_loader_drm.c
++++ b/src/gallium/auxiliary/pipe-loader/pipe_loader_drm.c
+@@ -139,6 +139,11 @@ static const struct drm_driver_descriptor driver_descriptors[] = {
+ .configuration = configuration_query,
+ },
+ {
++ .driver_name = "tegra",
++ .create_screen = pipe_tegra_create_screen,
++ .configuration = configuration_query,
++ },
++ {
+ .driver_name = "etnaviv",
+ .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 3159df6..99b6cb5 100644
+--- a/src/gallium/auxiliary/target-helpers/drm_helper.h
++++ b/src/gallium/auxiliary/target-helpers/drm_helper.h
+@@ -284,4 +284,27 @@ pipe_imx_drm_create_screen(int fd)
+ #endif
+
+
++#ifdef GALLIUM_TEGRA
++#include "tegra/drm/tegra_drm_public.h"
++
++struct pipe_screen *
++pipe_tegra_create_screen(int fd)
++{
++ struct pipe_screen *screen;
++
++ screen = tegra_drm_screen_create(fd);
++ return screen ? debug_screen_wrap(screen) : NULL;
++}
++
++#else
++
++struct pipe_screen *
++pipe_tegra_create_screen(int fd)
++{
++ fprintf(stderr, "tegra: driver missing\n");
++ return NULL;
++}
++
++#endif
++
+ #endif /* DRM_HELPER_H */
+diff --git a/src/gallium/auxiliary/target-helpers/drm_helper_public.h b/src/gallium/auxiliary/target-helpers/drm_helper_public.h
+index bc12b21..5525bdf 100644
+--- a/src/gallium/auxiliary/target-helpers/drm_helper_public.h
++++ b/src/gallium/auxiliary/target-helpers/drm_helper_public.h
+@@ -40,4 +40,7 @@ pipe_etna_create_screen(int fd);
+ struct pipe_screen *
+ pipe_imx_drm_create_screen(int fd);
+
++struct pipe_screen *
++pipe_tegra_create_screen(int fd);
++
+ #endif /* _DRM_HELPER_PUBLIC_H */
+diff --git a/src/gallium/drivers/nouveau/nouveau_buffer.c b/src/gallium/drivers/nouveau/nouveau_buffer.c
+index 2c60441..b45cc7b 100644
+--- a/src/gallium/drivers/nouveau/nouveau_buffer.c
++++ b/src/gallium/drivers/nouveau/nouveau_buffer.c
+@@ -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, scr->ro);
++
+ FREE(res);
+
+ NOUVEAU_DRV_STAT(nouveau_screen(pscreen), buf_obj_current_count, -1);
+diff --git a/src/gallium/drivers/nouveau/nouveau_buffer.h b/src/gallium/drivers/nouveau/nouveau_buffer.h
+index 3a33fae..c01fda4 100644
+--- a/src/gallium/drivers/nouveau/nouveau_buffer.h
++++ b/src/gallium/drivers/nouveau/nouveau_buffer.h
+@@ -50,6 +50,8 @@ struct nv04_resource {
+
+ /* buffer range that has been initialized */
+ struct util_range valid_buffer_range;
++
++ struct renderonly_scanout *scanout;
+ };
+
+ void
+diff --git a/src/gallium/drivers/nouveau/nouveau_screen.h b/src/gallium/drivers/nouveau/nouveau_screen.h
+index e4fbae9..b326c52 100644
+--- a/src/gallium/drivers/nouveau/nouveau_screen.h
++++ b/src/gallium/drivers/nouveau/nouveau_screen.h
+@@ -2,6 +2,7 @@
+ #define __NOUVEAU_SCREEN_H__
+
+ #include "pipe/p_screen.h"
++#include "renderonly/renderonly.h"
+ #include "util/disk_cache.h"
+ #include "util/u_memory.h"
+
+@@ -62,6 +63,8 @@ struct nouveau_screen {
+
+ struct disk_cache *disk_shader_cache;
+
++ struct renderonly *ro;
++
+ #ifdef NOUVEAU_ENABLE_DRIVER_STATISTICS
+ union {
+ uint64_t v[29];
+diff --git a/src/gallium/drivers/nouveau/nv50/nv50_miptree.c b/src/gallium/drivers/nouveau/nv50/nv50_miptree.c
+index f2e304f..29e95a6 100644
+--- a/src/gallium/drivers/nouveau/nv50/nv50_miptree.c
++++ b/src/gallium/drivers/nouveau/nv50/nv50_miptree.c
+@@ -189,6 +189,9 @@ nv50_miptree_get_handle(struct pipe_screen *pscreen,
+ if (!mt || !mt->base.bo)
+ return false;
+
++ if (renderonly_get_handle(mt->base.scanout, whandle))
++ return TRUE;
++
+ stride = mt->level[0].pitch;
+
+ return nouveau_screen_bo_get_handle(pscreen,
+diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_resource.c b/src/gallium/drivers/nouveau/nvc0/nvc0_resource.c
+index 9bafe3d..adfd61c 100644
+--- a/src/gallium/drivers/nouveau/nvc0/nvc0_resource.c
++++ b/src/gallium/drivers/nouveau/nvc0/nvc0_resource.c
+@@ -8,12 +8,26 @@ static struct pipe_resource *
+ nvc0_resource_create(struct pipe_screen *screen,
+ const struct pipe_resource *templ)
+ {
++ struct nouveau_screen *scr = nouveau_screen(screen);
++ struct pipe_resource *pres;
++
+ switch (templ->target) {
+ case PIPE_BUFFER:
+- return nouveau_buffer_create(screen, templ);
++ pres = nouveau_buffer_create(screen, templ);
++ break;
+ default:
+- return nvc0_miptree_create(screen, templ);
++ pres = nvc0_miptree_create(screen, templ);
++ break;
+ }
++
++ if (pres) {
++ struct nv04_resource *res = nv04_resource(pres);
++
++ if (templ->bind & PIPE_BIND_SCANOUT && scr->ro)
++ res->scanout = renderonly_scanout_for_resource(pres, scr->ro);
++ }
++
++ return pres;
+ }
+
+ static struct pipe_resource *
+diff --git a/src/gallium/drivers/tegra/Automake.inc b/src/gallium/drivers/tegra/Automake.inc
+new file mode 100644
+index 0000000..89e0441
+--- /dev/null
++++ b/src/gallium/drivers/tegra/Automake.inc
+@@ -0,0 +1,9 @@
++if HAVE_GALLIUM_TEGRA
++
++TARGET_DRIVERS += tegra
++TARGET_CPPFLAGS += -DGALLIUM_TEGRA
++TARGET_LIB_DEPS += \
++ $(top_builddir)/src/gallium/winsys/tegra/drm/libtegradrm.la \
++ $(LIBDRM_LIBS)
++
++endif
+diff --git a/src/gallium/drivers/tegra/Makefile.am b/src/gallium/drivers/tegra/Makefile.am
+new file mode 100644
+index 0000000..30f4689
+--- /dev/null
++++ b/src/gallium/drivers/tegra/Makefile.am
+@@ -0,0 +1,10 @@
++include $(top_srcdir)/src/gallium/Automake.inc
++
++AM_CPPFLAGS = \
++ $(GALLIUM_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 8363406..4bfcf3e 100644
+--- a/src/gallium/targets/dri/Makefile.am
++++ b/src/gallium/targets/dri/Makefile.am
+@@ -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
+
++include $(top_srcdir)/src/gallium/drivers/tegra/Automake.inc
++
+ include $(top_srcdir)/src/gallium/drivers/softpipe/Automake.inc
+ 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 d24a61d..600557b 100644
+--- a/src/gallium/targets/dri/target.c
++++ b/src/gallium/targets/dri/target.c
+@@ -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)
++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
+--- a/src/gallium/winsys/nouveau/drm/nouveau_drm_public.h
++++ b/src/gallium/winsys/nouveau/drm/nouveau_drm_public.h
+@@ -3,7 +3,9 @@
+ #define __NOUVEAU_DRM_PUBLIC_H__
+
+ struct pipe_screen;
++struct renderonly;
+
+ struct pipe_screen *nouveau_drm_screen_create(int drmFD);
++struct pipe_screen *nouveau_drm_screen_create_renderonly(int fd, struct renderonly *ro);
+
+ #endif
+diff --git a/src/gallium/winsys/nouveau/drm/nouveau_drm_winsys.c b/src/gallium/winsys/nouveau/drm/nouveau_drm_winsys.c
+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:
+ mtx_unlock(&nouveau_screen_mutex);
+ return NULL;
+ }
++
++struct pipe_screen *nouveau_drm_screen_create_renderonly(int fd, struct renderonly *ro)
++{
++ struct nouveau_screen *screen = nouveau_drm_screen_create(fd);
++
++ if (screen)
++ screen->ro = renderonly_dup(ro);
++
++ return screen;
++}
+diff --git a/src/gallium/winsys/tegra/drm/Android.mk b/src/gallium/winsys/tegra/drm/Android.mk
+new file mode 100644
+index 0000000..a48dca4
+--- /dev/null
++++ b/src/gallium/winsys/tegra/drm/Android.mk
+@@ -0,0 +1,33 @@
++# Copyright (C) 2014 Emil Velikov <emil.l.velikov@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 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.
++
++LOCAL_PATH := $(call my-dir)
++
++# get C_SOURCES
++include $(LOCAL_PATH)/Makefile.sources
++
++include $(CLEAR_VARS)
++
++LOCAL_SRC_FILES := $(C_SOURCES)
++
++LOCAL_MODULE := libmesa_winsys_tegra
++
++include $(GALLIUM_COMMON_MK)
++include $(BUILD_STATIC_LIBRARY)
+diff --git a/src/gallium/winsys/tegra/drm/Makefile.am b/src/gallium/winsys/tegra/drm/Makefile.am
+new file mode 100644
+index 0000000..39068fe
+--- /dev/null
++++ b/src/gallium/winsys/tegra/drm/Makefile.am
+@@ -0,0 +1,34 @@
++# Copyright © 2012 Intel Corporation
++#
++# 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.
++
++include Makefile.sources
++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
++
++libtegradrm_la_SOURCES = $(C_SOURCES)
+diff --git a/src/gallium/winsys/tegra/drm/Makefile.sources b/src/gallium/winsys/tegra/drm/Makefile.sources
+new file mode 100644
+index 0000000..29a0edc
+--- /dev/null
++++ b/src/gallium/winsys/tegra/drm/Makefile.sources
+@@ -0,0 +1,3 @@
++C_SOURCES := \
++ tegra_drm_public.h \
++ tegra_drm_winsys.c
+diff --git a/src/gallium/winsys/tegra/drm/tegra_drm_public.h b/src/gallium/winsys/tegra/drm/tegra_drm_public.h
+new file mode 100644
+index 0000000..813268f
+--- /dev/null
++++ b/src/gallium/winsys/tegra/drm/tegra_drm_public.h
+@@ -0,0 +1,8 @@
++#ifndef __TEGRA_DRM_PUBLIC_H__
++#define __TEGRA_DRM_PUBLIC_H__
++
++struct pipe_screen;
++
++struct pipe_screen *tegra_drm_screen_create(int drmFD);
++
++#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..c439b8d
+--- /dev/null
++++ b/src/gallium/winsys/tegra/drm/tegra_drm_winsys.c
+@@ -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 <libdrm/tegra_drm.h>
++#include <xf86drm.h>
++#include <stdio.h>
++
++static struct renderonly_scanout *
++tegra_create_with_tiling_for_resource(struct pipe_resource *rsc,
++ struct renderonly *ro)
++{
++ struct renderonly_scanout *scanout;
++
++ scanout = renderonly_create_gpu_import_for_resource(rsc, ro);
++ if (!scanout)
++ return NULL;
++
++ struct drm_tegra_gem_set_tiling args = {
++ .handle = scanout->handle,
++ .mode = DRM_TEGRA_GEM_TILING_MODE_BLOCK,
++ .value = 4
++ };
++
++ int ret = drmIoctl(ro->kms_fd, DRM_IOCTL_TEGRA_GEM_SET_TILING, &args);
++ if (ret)
++ return NULL;
++
++ return scanout;
++}
++
++struct pipe_screen *tegra_drm_screen_create(int fd)
++{
++ 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.7.4
+