mirror of
https://gitlab.freedesktop.org/mesa/drm.git
synced 2026-05-08 06:58:25 +02:00
read-only mirror of https://gitlab.freedesktop.org/mesa/drm
One of the costs of superioctl has been the need to perform relocations
inside the kernel. The cost of mapping the buffers to the CPU and writing
data is fairly high, especially if those buffers have been mapped and read
by the GPU.
If we assume that buffers don't move around very often, we can have the
client compute the relocations itself using the previous GPU address. When
that object doesn't move, the kernel can skip computing and writing the
updated data.
Here's a patch which adds a new field to struct drm_bo_info_req called
'presumed_offset', and a new DRM_BO_HINT_PRESUMED_OFFSET that is set when
this field has been filled in by the client.
There are two separate optimizations performed when the presumed_offset is
correct:
1. i915_exec_reloc checks to see if all previous buffer offsets were guessed
correctly. If so, there's no need for it to look at *any* of the
relocations for a buffer. When this happens, it skips the whole
relocation process, simply returning success.
2. i915_apply_reloc checks to see if the target buffer offset was guessed
correctly. If so, it skips mapping the relocatee, computing the
relocation and writing the value. If no relocations are needed, the
relocatee should never be mapped to the CPU, and so the kernel shouldn't
need to wait for any fences to pass.
|
||
|---|---|---|
| bsd-core | ||
| libdrm | ||
| linux-core | ||
| scripts | ||
| shared-core | ||
| tests | ||
| .gitignore | ||
| autogen.sh | ||
| configure.ac | ||
| libdrm.pc.in | ||
| Makefile.am | ||
| README | ||
DRM README file There are two main parts to this package: the DRM client library/interface (libdrm.so) and kernel/hardware-specific device modules (such as i915.ko). Compiling --------- By default, libdrm and the DRM header files will install into /usr/local/. If you want to install this DRM to replace your system copy, say: ./configure --prefix=/usr --exec-prefix=/ Then, make install To build the device-specific kernel modules: cd linux-core/ make cp *.ko /lib/modules/VERSION/kernel/drivers/char/drm/ (where VERSION is your kernel version: uname -f) Or, cd bsd-core/ make copy the kernel modules to the appropriate place Tips & Trouble-shooting ----------------------- 1. You'll need kernel sources. If using Fedora Core 5, for example, you may need to install RPMs such as: kernel-smp-devel-2.6.15-1.2054_FC5.i686.rpm kernel-devel-2.6.15-1.2054_FC5.i686.rpm etc. 2. You may need to make a symlink from /lib/modules/VERSION/build to your kernel sources in /usr/src/kernels/VERSION (where version is `uname -r`): cd /lib/modules/VERSION ln -s /usr/src/kernels/VERSION build 3. If you've build the kernel modules but they won't load because of an error like this: $ /sbin/modprobe drm FATAL: Error inserting drm (/lib/modules/2.6.15-1.2054_FC5smp/kernel/drivers/char/drm/drm.ko): Invalid module format And 'dmesg|tail' says: drm: disagrees about version of symbol struct_module Try recompiling your drm modules without the Module.symvers file. That is rm the /usr/src/kernels/2.6.15-1.2054_FC5-smp-i686/Module.symvers file (or rename it). Then do a 'make clean' before rebuilding your drm modules.