diff options
author | Thierry Reding <[email protected]> | 2014-05-28 00:36:48 +0200 |
---|---|---|
committer | Thierry Reding <[email protected]> | 2018-03-09 11:48:22 +0100 |
commit | 1755f608f5201e0a23f00cc3ea1b01edd07eb6ef (patch) | |
tree | 895ac31c09458ff34fa74690b18399ff6607b180 /src/gallium/auxiliary | |
parent | 2052dbdae363f4fd184842733ff9c96bd6e7f08c (diff) |
tegra: Initial support
Tegra K1 and later use a GPU that can be driven by the Nouveau driver.
But the GPU is a pure render node and has no display engine, hence the
scanout needs to happen on the Tegra display hardware. The GPU and the
display engine each have a separate DRM device node exposed by the
kernel.
To make the setup appear as a single device, this driver instantiates
a Nouveau screen with each instance of a Tegra screen and forwards GPU
requests to the Nouveau screen. For purposes of scanout it will import
buffers created on the GPU into the display driver. Handles that
userspace requests are those of the display driver so that they can be
used to create framebuffers.
This has been tested with some GBM test programs, as well as kmscube and
weston. All of those run without modifications, but I'm sure there is a
lot that can be improved.
Some fixes contributed by Hector Martin <[email protected]>.
Changes in v2:
- duplicate file descriptor in winsys to avoid potential issues
- require nouveau when building the tegra driver
- check for nouveau driver name on render node
- remove unneeded dependency on libdrm_tegra
- remove zombie references to libudev
- add missing headers to C_SOURCES variable
- drop unneeded tegra/ prefix for includes
- open device files with O_CLOEXEC
- update copyrights
Changes in v3:
- properly unwrap resources in ->resource_copy_region()
- support vertex buffers passed by user pointer
- allocate custom stream and const uploader
- silence error message on pre-Tegra124
- support X without explicit PRIME
Changes in v4:
- ship Meson build files in distribution tarball
- drop duplicate driver_tegra dependency
Reviewed-by: Emil Velikov <[email protected]>
Acked-by: Emil Velikov <[email protected]>
Tested-by: Andre Heider <[email protected]>
Reviewed-by: Dmitry Osipenko <[email protected]>
Reviewed-by: Dylan Baker <[email protected]>
Signed-off-by: Thierry Reding <[email protected]>
Diffstat (limited to 'src/gallium/auxiliary')
-rw-r--r-- | src/gallium/auxiliary/pipe-loader/pipe_loader_drm.c | 7 | ||||
-rw-r--r-- | src/gallium/auxiliary/target-helpers/drm_helper.h | 23 | ||||
-rw-r--r-- | src/gallium/auxiliary/target-helpers/drm_helper_public.h | 3 |
3 files changed, 32 insertions, 1 deletions
diff --git a/src/gallium/auxiliary/pipe-loader/pipe_loader_drm.c b/src/gallium/auxiliary/pipe-loader/pipe_loader_drm.c index 810542101ed..b6be1b4f127 100644 --- a/src/gallium/auxiliary/pipe-loader/pipe_loader_drm.c +++ b/src/gallium/auxiliary/pipe-loader/pipe_loader_drm.c @@ -134,7 +134,12 @@ static const struct drm_driver_descriptor driver_descriptors[] = { .driver_name = "imx-drm", .create_screen = pipe_imx_drm_create_screen, .configuration = pipe_default_configuration_query, - } + }, + { + .driver_name = "tegra", + .create_screen = pipe_tegra_create_screen, + .configuration = pipe_default_configuration_query, + }, }; #endif diff --git a/src/gallium/auxiliary/target-helpers/drm_helper.h b/src/gallium/auxiliary/target-helpers/drm_helper.h index 7aea83b8842..7dc2497c087 100644 --- a/src/gallium/auxiliary/target-helpers/drm_helper.h +++ b/src/gallium/auxiliary/target-helpers/drm_helper.h @@ -379,5 +379,28 @@ pipe_imx_drm_create_screen(int fd, const struct pipe_screen_config *config) #endif +#ifdef GALLIUM_TEGRA +#include "tegra/drm/tegra_drm_public.h" + +struct pipe_screen * +pipe_tegra_create_screen(int fd, const struct pipe_screen_config *config) +{ + 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, const struct pipe_screen_config *config) +{ + 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 e21ea32fabe..c1a7bf4e252 100644 --- a/src/gallium/auxiliary/target-helpers/drm_helper_public.h +++ b/src/gallium/auxiliary/target-helpers/drm_helper_public.h @@ -51,6 +51,9 @@ pipe_etna_create_screen(int fd, const struct pipe_screen_config *config); struct pipe_screen * pipe_imx_drm_create_screen(int fd, const struct pipe_screen_config *config); +struct pipe_screen * +pipe_tegra_create_screen(int fd, const struct pipe_screen_config *config); + const struct drm_conf_ret * pipe_default_configuration_query(enum drm_conf conf); |