419a154dbe
The issue that userspace needed to solve is that there is ~two orders of magnitude size difference in cmdstream buffers (both for gmem commands and for draw commands), and that the previous practice of allocating worst-case sizes is quite wasteful. Previously a submit would be constructed (for example) like: CMD TARGET DESCRIPTION g0 N gmem/tiling commands b0 Y binning commands d0 Y draw commands Which, after the one non-IB-target cmd buffer is inserted into the kernel controlled ringbuffer, looks like (not to scale): b0: d0: +-----+ +-----+ IB1 | ... | | ... | +-----+ +-----+ ^ ^ | | +-----+ +-+---------+ g0: | | | +----+----+----+----+----+----+---- IB0 | .. | IB | .. | IB | .. | IB | ... +----+----+----+----+----+----+---- ^ tile0 tile1 | +-----------+ userspace | ~~~~~~~~~~~~~~~~~~~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ kernel | ----+----+---- ringbuffer ... | IB | ... ----+----+---- Now, multiple physical cmdstream buffers per fd_ringbuffer are supported, so this becomes: CMD TARGET DESCRIPTION g0 N ... N gmem/tiling commands gN N b0 Y ... Y binning commands bN Y d0 Y ... Y draw commands dN Y Which, after the non-IB-target cmd buffers (g0..gN) are inserted into the kernel controlled ringbuffer, looks like: b0: b1 d0: d1 +-----+ +-----+ +-----+ +-----+ IB1 | ... | | ... | ... | ... | | ... | ... +-----+ +-----+ +-----+ +-----+ ^ ^ ^ ^ | | | | | +-+ | +-----+------+ +-----+ | | | | | | +--+----------+ | g0: | | | | | | +----+----+----+----+----+----+---+----+----+---- IB0 | .. | IB | IB | .. | IB | IB |.. | IB | IB |... +----+----+----+----+----+----+---+----+----+---- ^ tile0 tile1 | to b0 to b1 | | | to|d0 to|d1 | | +----+ | +-+-----------+ | | | | | | | +------+ | +-+-------------+ | | g1: | | | | | | | +----+----+----+----+----+----+---+----+----+---- IB0 | | .. | IB | IB | .. | IB | IB |.. | IB | IB |... | +----+----+----+----+----+----+---+----+----+---- | ^ tileX tileY | | | +-----------+ +-----------+ | userspace | | ~~~~~~~~~~~~~~~~~~~|~~~~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ kernel | | ----+----+----+---- ringbuffer ... | IB | IB | ... ----+----+----+---- Signed-off-by: Rob Clark <robclark@freedesktop.org> |
||
---|---|---|
amdgpu | ||
exynos | ||
freedreno | ||
include/drm | ||
intel | ||
libkms | ||
m4 | ||
man | ||
nouveau | ||
omap | ||
radeon | ||
tegra | ||
tests | ||
vc4 | ||
.gitignore | ||
Android.mk | ||
CleanSpec.mk | ||
Makefile.am | ||
Makefile.sources | ||
README | ||
RELEASING | ||
autogen.sh | ||
configure.ac | ||
libdrm.pc.in | ||
libdrm_lists.h | ||
libdrm_macros.h | ||
util_double_list.h | ||
util_math.h | ||
xf86atomic.h | ||
xf86drm.c | ||
xf86drm.h | ||
xf86drmHash.c | ||
xf86drmHash.h | ||
xf86drmMode.c | ||
xf86drmMode.h | ||
xf86drmRandom.c | ||
xf86drmRandom.h | ||
xf86drmSL.c |
README
libdrm - userspace library for drm This is libdrm, a userspace library for accessing the DRM, direct rendering manager, on Linux, BSD and other operating systes that support the ioctl interface. The library provides wrapper functions for the ioctls to avoid exposing the kernel interface directly, and for chipsets with drm memory manager, support for tracking relocations and buffers. libdrm is a low-level library, typically used by graphics drivers such as the Mesa DRI drivers, the X drivers, libva and similar projects. New functionality in the kernel DRM drivers typically requires a new libdrm, but a new libdrm will always work with an older kernel. Compiling --------- libdrm is a standard autotools packages and follows the normal configure, build and install steps. The first step is to configure the package, which is done by running the configure shell script: ./configure By default, libdrm will install into the /usr/local/ prefix. If you want to install this DRM to replace your system copy, pass --prefix=/usr and --exec-prefix=/ to configure. If you are building libdrm from a git checkout, you first need to run the autogen.sh script. You can pass any options to autogen.sh that you would other wise pass to configure, or you can just re-run configure with the options you need once autogen.sh finishes. Next step is to build libdrm: make and once make finishes successfully, install the package using make install If you are install into a system location, you will need to be root to perform the install step.