|
Packit |
631bab |
|
|
Packit |
631bab |
|
|
Packit |
631bab |
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
|
|
Packit |
631bab |
|
|
Packit |
631bab |
|
|
Packit |
631bab |
Written 2012 by David Herrmann <dh.herrmann@googlemail.com>
|
|
Packit |
631bab |
Dedicated to the Public Domain
|
|
Packit |
631bab |
-->
|
|
Packit |
631bab |
|
|
Packit |
631bab |
<refentry id="drm">
|
|
Packit |
631bab |
<refentryinfo>
|
|
Packit |
631bab |
<title>Direct Rendering Manager</title>
|
|
Packit |
631bab |
<productname>libdrm</productname>
|
|
Packit |
631bab |
<date>September 2012</date>
|
|
Packit |
631bab |
<authorgroup>
|
|
Packit |
631bab |
<author>
|
|
Packit |
631bab |
<contrib>Developer</contrib>
|
|
Packit |
631bab |
<firstname>David</firstname>
|
|
Packit |
631bab |
<surname>Herrmann</surname>
|
|
Packit |
631bab |
<email>dh.herrmann@googlemail.com</email>
|
|
Packit |
631bab |
</author>
|
|
Packit |
631bab |
</authorgroup>
|
|
Packit |
631bab |
</refentryinfo>
|
|
Packit |
631bab |
|
|
Packit |
631bab |
<refmeta>
|
|
Packit |
631bab |
<refentrytitle>drm</refentrytitle>
|
|
Packit |
631bab |
<manvolnum>7</manvolnum>
|
|
Packit |
631bab |
</refmeta>
|
|
Packit |
631bab |
|
|
Packit |
631bab |
<refnamediv>
|
|
Packit |
631bab |
<refname>drm</refname>
|
|
Packit |
631bab |
<refpurpose>Direct Rendering Manager</refpurpose>
|
|
Packit |
631bab |
</refnamediv>
|
|
Packit |
631bab |
|
|
Packit |
631bab |
<refsynopsisdiv>
|
|
Packit |
631bab |
<funcsynopsis>
|
|
Packit |
631bab |
<funcsynopsisinfo>#include <xf86drm.h></funcsynopsisinfo>
|
|
Packit |
631bab |
</funcsynopsis>
|
|
Packit |
631bab |
</refsynopsisdiv>
|
|
Packit |
631bab |
|
|
Packit |
631bab |
<refsect1>
|
|
Packit |
631bab |
<title>Description</title>
|
|
Packit |
631bab |
<para>The <emphasis>Direct Rendering Manager</emphasis> (DRM) is a framework
|
|
Packit |
631bab |
to manage <emphasis>Graphics Processing Units</emphasis> (GPUs). It is
|
|
Packit |
631bab |
designed to support the needs of complex graphics devices, usually
|
|
Packit |
631bab |
containing programmable pipelines well suited to 3D graphics
|
|
Packit |
631bab |
acceleration. Furthermore, it is responsible for memory management,
|
|
Packit |
631bab |
interrupt handling and DMA to provide a uniform interface to
|
|
Packit |
631bab |
applications.</para>
|
|
Packit |
631bab |
|
|
Packit |
631bab |
<para>In earlier days, the kernel framework was solely used to provide raw
|
|
Packit |
631bab |
hardware access to privileged user-space processes which implement
|
|
Packit |
631bab |
all the hardware abstraction layers. But more and more tasks were
|
|
Packit |
631bab |
moved into the kernel. All these interfaces are based on
|
|
Packit |
631bab |
<citerefentry><refentrytitle>ioctl</refentrytitle><manvolnum>2</manvolnum></citerefentry>
|
|
Packit |
631bab |
commands on the DRM character device. The <emphasis>libdrm</emphasis>
|
|
Packit |
631bab |
library provides wrappers for these system-calls and many helpers to
|
|
Packit |
631bab |
simplify the API.</para>
|
|
Packit |
631bab |
|
|
Packit |
631bab |
<para>When a GPU is detected, the DRM system loads a driver for the detected
|
|
Packit |
631bab |
hardware type. Each connected GPU is then presented to user-space via
|
|
Packit |
631bab |
a character-device that is usually available as
|
|
Packit |
631bab |
<filename>/dev/dri/card0</filename> and can be accessed with
|
|
Packit |
631bab |
<citerefentry><refentrytitle>open</refentrytitle><manvolnum>2</manvolnum></citerefentry>
|
|
Packit |
631bab |
and
|
|
Packit |
631bab |
<citerefentry><refentrytitle>close</refentrytitle><manvolnum>2</manvolnum></citerefentry>.
|
|
Packit |
631bab |
However, it still depends on the graphics driver which interfaces are
|
|
Packit |
631bab |
available on these devices. If an interface is not available, the
|
|
Packit |
631bab |
syscalls will fail with <literal>EINVAL</literal>.</para>
|
|
Packit |
631bab |
|
|
Packit |
631bab |
<refsect2>
|
|
Packit |
631bab |
<title>Authentication</title>
|
|
Packit |
631bab |
<para>All DRM devices provide authentication mechanisms. Only a DRM-Master
|
|
Packit |
631bab |
is allowed to perform mode-setting or modify core state and only one
|
|
Packit |
631bab |
user can be DRM-Master at a time. See
|
|
Packit |
631bab |
<citerefentry><refentrytitle>drmSetMaster</refentrytitle><manvolnum>3</manvolnum></citerefentry>
|
|
Packit |
631bab |
for information on how to become DRM-Master and what the limitations
|
|
Packit |
631bab |
are. Other DRM users can be authenticated to the DRM-Master via
|
|
Packit |
631bab |
<citerefentry><refentrytitle>drmAuthMagic</refentrytitle><manvolnum>3</manvolnum></citerefentry>
|
|
Packit |
631bab |
so they can perform buffer allocations and rendering.</para>
|
|
Packit |
631bab |
</refsect2>
|
|
Packit |
631bab |
|
|
Packit |
631bab |
<refsect2>
|
|
Packit |
631bab |
<title>Mode-Setting</title>
|
|
Packit |
631bab |
<para>Managing connected monitors and displays and changing the current
|
|
Packit |
631bab |
modes is called <emphasis>Mode-Setting</emphasis>. This is
|
|
Packit |
631bab |
restricted to the current DRM-Master. Historically, this was
|
|
Packit |
631bab |
implemented in user-space, but new DRM drivers implement a kernel
|
|
Packit |
631bab |
interface to perform mode-setting called
|
|
Packit |
631bab |
<emphasis>Kernel Mode Setting</emphasis> (KMS). If your
|
|
Packit |
631bab |
hardware-driver supports it, you can use the KMS API provided by
|
|
Packit |
631bab |
DRM. This includes allocating framebuffers, selecting modes and
|
|
Packit |
631bab |
managing CRTCs and encoders. See
|
|
Packit |
631bab |
<citerefentry><refentrytitle>drm-kms</refentrytitle><manvolnum>7</manvolnum></citerefentry>
|
|
Packit |
631bab |
for more.</para>
|
|
Packit |
631bab |
</refsect2>
|
|
Packit |
631bab |
|
|
Packit |
631bab |
<refsect2>
|
|
Packit |
631bab |
<title>Memory Management</title>
|
|
Packit |
631bab |
<para>The most sophisticated tasks for GPUs today is managing memory
|
|
Packit |
631bab |
objects. Textures, framebuffers, command-buffers and all other kinds
|
|
Packit |
631bab |
of commands for the GPU have to be stored in memory. The DRM driver
|
|
Packit |
631bab |
takes care of managing all memory objects, flushing caches,
|
|
Packit |
631bab |
synchronizing access and providing CPU access to GPU memory. All
|
|
Packit |
631bab |
memory management is hardware driver dependent. However, two generic
|
|
Packit |
631bab |
frameworks are available that are used by most DRM drivers. These
|
|
Packit |
631bab |
are the <emphasis>Translation Table Manager</emphasis> (TTM) and the
|
|
Packit |
631bab |
<emphasis>Graphics Execution Manager</emphasis> (GEM). They provide
|
|
Packit |
631bab |
generic APIs to create, destroy and access buffers from user-space.
|
|
Packit |
631bab |
However, there are still many differences between the drivers so
|
|
Packit |
631bab |
driver-depedent code is still needed. Many helpers are provided in
|
|
Packit |
631bab |
<emphasis>libgbm</emphasis> (Graphics Buffer Manager) from the
|
|
Packit |
631bab |
<emphasis>mesa-project</emphasis>. For more information on DRM
|
|
Packit |
631bab |
memory-management, see
|
|
Packit |
631bab |
<citerefentry><refentrytitle>drm-memory</refentrytitle><manvolnum>7</manvolnum></citerefentry>.</para>
|
|
Packit |
631bab |
</refsect2>
|
|
Packit |
631bab |
</refsect1>
|
|
Packit |
631bab |
|
|
Packit |
631bab |
<refsect1>
|
|
Packit |
631bab |
<title>Reporting Bugs</title>
|
|
Packit |
631bab |
<para>Bugs in this manual should be reported to
|
|
Packit |
631bab |
https://bugs.freedesktop.org/enter_bug.cgi?product=DRI&component=libdrm
|
|
Packit |
631bab |
under the "DRI" product, component "libdrm"</para>
|
|
Packit |
631bab |
</refsect1>
|
|
Packit |
631bab |
|
|
Packit |
631bab |
<refsect1>
|
|
Packit |
631bab |
<title>See Also</title>
|
|
Packit |
631bab |
<para>
|
|
Packit |
631bab |
<citerefentry><refentrytitle>drm-kms</refentrytitle><manvolnum>7</manvolnum></citerefentry>,
|
|
Packit |
631bab |
<citerefentry><refentrytitle>drm-memory</refentrytitle><manvolnum>7</manvolnum></citerefentry>,
|
|
Packit |
631bab |
<citerefentry><refentrytitle>drmSetMaster</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
|
|
Packit |
631bab |
<citerefentry><refentrytitle>drmAuthMagic</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
|
|
Packit |
631bab |
<citerefentry><refentrytitle>drmAvailable</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
|
|
Packit |
631bab |
<citerefentry><refentrytitle>drmOpen</refentrytitle><manvolnum>3</manvolnum></citerefentry>
|
|
Packit |
631bab |
</para>
|
|
Packit |
631bab |
</refsect1>
|
|
Packit |
631bab |
</refentry>
|