The Linux graphics stack is constantly evolving to add support for new hardware. This evolution and new software specifications have forced the X graphical server to be split into several components including a now rotates in the Linux kernel, the Direct Rendering Manager (DRM). A quick presentation of these components and their role will be carried out before looking at new major change in the common code, the NVIDIA Optimus technology.
One equipped with Optimus technology laptop has two graphics processing units (GPUs), one from Intel and one from NVIDIA. This technology combines the low power Intel GPU when the machine is not used to the performance of NVIDIA GPUs when the user plays. This technology, however, is a nightmare to manage kernel-side although the final building blocks necessary for its complete management are being finalized. Further explanation of this issue will be made and we’ll see how this new software architecture has added graphics acceleration on embedded processor SoCs like Tegra.
The case of open source NVIDIA driver, called “New” will then be studied. This is the graphics driver community as it is developed without the help of NVIDIA and attracted several regular contributors, including myself! We’ll take a quick history of the project before talking about the current developments and issues related to the lack of documentation.
The end of this presentation will then be left to the participants so they can ask more general questions about the graphics stack, if they wish.
Martin Peres, Laboratoire Bordelais de Recherche en Informatique
Unveiling Design Patterns: A Visual Guide with UML Diagrams
Kernel Recipes 2014 - The Linux graphics stack and Nouveau driver
1. The Linux graphics stack, Optimus and the
Nouveau driver
Cooperative rendering across GPUs on Linux
Martin Peres
Nouveau developer
PhD student at LaBRI
X.Org Foundation board member
September 26, 2014
2. Introduction to the Linux graphics stack Optimus Prime Nouveau Q&A
Summary
1 Introduction to the Linux graphics stack
General overview
Kernel space
User space
2 Optimus
3 Prime
4 Nouveau
5 Q&A
1 / 29
3. Introduction to the Linux graphics stack Optimus Prime Nouveau Q&A
General overview of the Linux Graphics stack
The graphics stack before 2005
The X-Server provided everything:
Modesetting (CRTC & plane management);
2D/3D acceleration;
Video rendering acceleration;
Input management.
The X-Server talked to the GPU directly, as root.
The current graphics stack
The X-Server got split into more than 200 components:
Privileged operations moved to the kernel;
2D drivers got put into dierent shared objects;
3D acceleration got put in mesa;
The list is too long (and boring) ;)
2 / 29
4. Introduction to the Linux graphics stack Optimus Prime Nouveau QA
by Shmuel Csaba Otto Traian; CC-BY-SA 4.0 intl; created 2013-08-24; last updated 2014-03-25
3D-game engine
Wayland compositor
Mesa: APIs+DRI/Gallium3D driver
libGL-mesa-swx11 (libGL)
libGL-mesa-glx
libOpenVG-mesa
libGLES-mesa
libEGL-mesa
libEGL-mesa-drivers (Wayland)
libGBM
libGL-mesa-DRI (Modules)
Applications
Toolkits
X-server (X.Org)
X.Org Server display driver
xserver-xorg-video-nouveau
xserver-xorg-video-nvidia
xserver-xorg-video-radeon
libDRM-intel
libDRM-radeon
libDRM-nouveau
libDRM-freedreno
libwayland-client
Wayland 1.5
hardware specific
Userspace interface to
hardware specific
direct rendering manager
DRM Linux kernel
CPU registers L1 L2 L3 L4 main memory
GPU registers L1 L2 ( graphic memory)
libDRM
DDX-driver
libX / libXCB
Proprietary OpenGL 4.2 driver
libGL-nvidia-glx
libGL-fglrx-glx
libGL
Rendering APIs:
OpenGL
OpenGL|ES
OpenVG
X 11R7.8
blob
Display
server
framebuffer
DIX driver
hardware-specific
KMS
Kernel Mode Setting
Wayland
obsoletes
2D drivers in
the display server
API:
EGL
API:
EGL
Window manager
KWin
Mutter
Weston
Enlightment
KWin
Compiz
OpenBox
Metacity
Mutter
Figure: General overview of the Linux graphics stack
3 / 29
5. Introduction to the Linux graphics stack Optimus Prime Nouveau QA
The kernel space
Direct Rendering Manager (DRM) : The common code
This common code provides:
Kernel ModeSetting (KMS): CRTC plane management;
Video memory management via GEM (with a TTM backend?);
Nodes with dierent capabilities (master or render nodes).
DRM open source drivers
i810/i915: Intel;
nouveau: NVIDIA;
radeon: AMD/ATI;
vmwgfx: VMware;
many SoC GPUs (armada, exynos, msm, omap, tegra, ...).
4 / 29
6. Introduction to the Linux graphics stack Optimus Prime Nouveau QA
Architecture of the X-Server
Client
Pango
Server
DDX
Acceleration Architectures
DIX
Event_Queue Input Drivers
Hardware devices Extensions
Cairo
Toolkit
Xlib or xcb OpenGL
Dispatch Mesa
Mouse Keyboard Render Xinput
RandR GLX Gallium
Video Drivers
Display Acceleration_Video Acceleration_2D
Pixman
FrameBuffer
Figure: General overview of the X-Server's internal architecture
5 / 29
7. Introduction to the Linux graphics stack Optimus Prime Nouveau QA
Architecture of Mesa
Applications
Mesa
Gallium
State trackers
drivers (compilers)
Mesa Classics (simplified)
X-Server
xorg
Wine
Nine
Weston
EGL
Xonotic
Qt
libgl
OpenGL
Gallium
softpipe r600g r300g nvc0
nv50 nv30
GPU
llvmpipe
LLVM
CPU
intel radeon nouveau_vieux swrast
(through
libdrm)
Figure: General overview of Mesa's internal architecture
6 / 29
8. Introduction to the Linux graphics stack Optimus Prime Nouveau QA
Summary
1 Introduction to the Linux graphics stack
2 Optimus
Introduction
Turning the dGPU on/o
Driving the right outputs
How to share buers across drivers?
3 Prime
4 Nouveau
5 QA
7 / 29
9. Introduction to the Linux graphics stack Optimus Prime Nouveau QA
Great performance, great battery-life
Optimus
Laptops can be equipped with two GPUs;
The Intel IGP is great for battery-life;
NVIDIA's discrete GPU (dGPU) is great for performance;
Dynamic switch between the 2: get the best of both worlds!
Challenges
When/How the dGPU should be turned on/o?
Who drives the outputs?
How to copy buers from one driver to another?
How should we do application migration?
How should we handle the HDMI sound card?
8 / 29
10. Introduction to the Linux graphics stack Optimus Prime Nouveau QA
Turning the dGPU on/o
How
Optimus laptops have ACPI functions to do that;
Two ways of calling them:
bbswitch: Old kernel module for manual management;
vgaswitcheroo: Manual or automatic power management.
When: The case of vgaswitcheroo
Turn o the dGPU when it has been idle for 5 seconds;
Idle?:
no graphics context allocated;
no output is being used;
no sound interface used (not done);
no call to the drm driver has been made;
9 / 29
11. Introduction to the Linux graphics stack Optimus Prime Nouveau QA
Handling the outputs : Hardware multiplexer
Figure: Switchable graphics
10 / 29
12. Introduction to the Linux graphics stack Optimus Prime Nouveau QA
Handling the outputs : Software multiplexer
Figure: The real Optimus architecture
11 / 29
13. Introduction to the Linux graphics stack Optimus Prime Nouveau QA
Sharing buers across drivers
Cross-driver BO sharing : Challenges
The memory representation for buers is dierent from
hardware to hardware:
pitch: number of pixels per row;
tiling: technique that increases the spatial locality.
Synchronising rendering across drivers.
Solutions
VirtualGL: Remote rendering solution. Redirects drawing
commands to a distant GPU, read back the rendered frame;
Primus: Same solution as VirtualGL except in a more
lightweight fashion!
DMA-Buf: A Linux-only solution that allows sharing buers
between dierent GPUs without copies.
12 / 29
14. Introduction to the Linux graphics stack Optimus Prime Nouveau QA
Sharing buers across drivers : VirtualGL
13 / 29
15. Introduction to the Linux graphics stack Optimus Prime Nouveau QA
Sharing buers across drivers : DMA-Buf
Driver roles
Exporter: Being able to export a buer;
User: Being able to import a buer.
General overview
No standardised memory allocation: It's up to the exporter;
An arbitrary buer can be wrapped into a DMA buer;
An fd can be returned to the userspace to reference this buer;
The fd can be passed to another process;
The fd can be mmapped and accessed by the CPU;
The fd can be imported by any driver supporting the user role.
14 / 29
16. Introduction to the Linux graphics stack Optimus Prime Nouveau QA
dma_buf usage flow
Video
decoder
Graphics
stack
dma_buf
User
Kernel
1
CMA
(optional)
2
3
4
5
6
1) allocation (CMA usage is optional).
2) dma_buf_export(): request the creation of a dma_buf for previously allocated memory.
3) dma_buf_fd(): provides a fd to return to userspace.
4) fd passed to video decoder.
5) dma_buf_get(fd): takes ref and returns 'struct dma_buf'.
6) dma_buf_attach() + dma_buf_map_attachment(): to get info for dma
a) dev-dma_parms should be expanded to tell if receiving device needs contiguous
memory or any other special requirements
b) allocation of backing pages could be deferred by exporting driver until it is known if
importing driver requires contiguous memory.. to make things a bit easier on systems
without IOMMU
15 / 29
17. Introduction to the Linux graphics stack Optimus Prime Nouveau QA
How should we do application migration?
Short answer
We don't!
Why?
The context is hardware-dependent;
The context can be HUGE (hundreds of MB);
The best way is to ask the application to re-upload its
context: GL ARB robustness.
16 / 29
18. Introduction to the Linux graphics stack Optimus Prime Nouveau QA
Optimus : How windows does it
Figure: The global hardware/software infrastructure
17 / 29
19. Introduction to the Linux graphics stack Optimus Prime Nouveau QA
Summary
1 Introduction to the Linux graphics stack
2 Optimus
3 Prime
Introduction
How to
Demos
4 Nouveau
5 QA
18 / 29
20. Introduction to the Linux graphics stack Optimus Prime Nouveau QA
Prime
Prime
Prime is the name for all the ustream open source technologies
that make hybrid graphics possible:
DMA-Buf: sharing buers across drivers (Linux 3.3);
vgaswitcheroo: switching graphics (Linux 3.12);
Cross-device fence mechanism: make a driver wait on another
driver to complete a task (Linux 3.17);
DMA-Buf synchronisation: Wait for rendering completion of a
DMA-Buf before compositing to avoid tearing (Linux 3.19?).
List of requirements
running nouveau/radeon drm;
running the nouveau/radeon ddx;
19 / 29
21. Introduction to the Linux graphics stack Optimus Prime Nouveau QA
Prime: Simpli
22. ed how-to for Nouveau
vgaswitcheroo
# cd /sys/kernel/debug/vgaswitcheroo/
# cat switch
# echo (DIGDjDDIS) switch
(Re)start your desktop environment.
XRandr
$ xrandr listproviders
$ xrandr setproviderooadsink nouveau Intel
This sets the order: Nouveau == ooad, Intel == default
20 / 29
23. Introduction to the Linux graphics stack Optimus Prime Nouveau QA
Prime: Simpli
24. ed how-to for Nouveau
Usage
DRI PRIME=1 glxgears # Use the NVIDIA GPU
DRI PRIME=0 glxgears # Use the Intel GPU
glxgears # Use the Intel GPU
Longer How-to for Nouveau
http://nouveau.freedesktop.org/wiki/Optimus
21 / 29
25. Introduction to the Linux graphics stack Optimus Prime Nouveau QA
Prime: Demos
Current setup
This is an Optimus laptop (Sandy Bridge + NVIDIA NVD9);
All the outputs are connected to the Intel IGP.
List of demos
Selecting the GPU and checking with glxinfo;
Performance dierence in glxgears;
Video decoding with VDPAU on the NVIDIA GPU.
22 / 29
26. Introduction to the Linux graphics stack Optimus Prime Nouveau QA
Summary
1 Introduction to the Linux graphics stack
2 Optimus
3 Prime
4 Nouveau
Introduction
Current work
Involvement from NVIDIA
5 QA
23 / 29
27. Introduction to the Linux graphics stack Optimus Prime Nouveau QA
Nouveau: Introduction
Nouveau: An Open Source Linux driver for NVIDIA GPUs
Merged in Linux 2.6.33 left staging on Linux 3.4;
Mostly developed by Red Hat and students.
Current features
Modesetting support for almost all NVIDIA GPUs;
2D, 3D and video-rendering accel on NV04-;
Video decoding accel on NV40-NV117 (non-free).
24 / 29
28. Introduction to the Linux graphics stack Optimus Prime Nouveau QA
Nouveau: Current developments
Current work
Maxwell support:
Released in two times (March then September);
Modesetting: DONE;
2D/3D support: MOSTLY DONE;
Video decoding: TODO
Open source
29. rmware: WIP
Manual reclocking support:
nv40-a3: crude support, disabled by default;
nva3-ac: good chances of working;
Fermi: crude support, disabled by default;
Kepler: WIP, good chances of partial support;
Maxwell: TODO
Adding new OpenGL extensions:
Everything is done up to Fermi;
OpenGL 4 for the other GPUs.
25 / 29
30. Introduction to the Linux graphics stack Optimus Prime Nouveau QA
Involvement from NVIDIA
NV
1998(?): NVIDIA releases nv, a Linux OSS 2D driver;
1998: Obfuscation commit, release only pre-processed source.
Little hope of NVIDIA ever working again on an OSS driver
It's so hard to write a graphics driver that open-sourcing it would
not help [...] In addition, customers aren't asking for opensource
drivers.
Andrew Fear, NVIDIA software product manager, April 2006
26 / 29
31. Introduction to the Linux graphics stack Optimus Prime Nouveau QA
Short history of Nouveau
Nouveau
2005: Stephane Marchesin improves nv and works on 3D
2008: Open Arena runs on nv40
2009: KMS driver based on TTM for memory management
2010: Merged in Linux 2.6.33
2010: Nv is deprecated by NVIDIA, use VESA.
A new hope from NVIDIA
September 2013: NVIDIA releases some vbios documentation;
January 2014: NVIDIA starts adding support for their Tegra
K1 in Nouveau, as requested by its clients;
Full support for the Tegra K1 expected by the end of 2014.
27 / 29
32. Introduction to the Linux graphics stack Optimus Prime Nouveau QA
Summary
1 Introduction to the Linux graphics stack
2 Optimus
3 Prime
4 Nouveau
5 QA
28 / 29
33. Introduction to the Linux graphics stack Optimus Prime Nouveau QA
Questions?
Thank you for listening! Questions?
Martin Peres: martin.peres@free.fr
29 / 29