State of GSoC Wed May 26
[ikiwiki.git] / docs / developer / GEMdrmKMS / index.mdwn
1 # Port of GEM and KMS
2
3 ## Status
4
5 The latest drm code from FreeBSD 9.x current has been successfully ported to DragonFly BSD, [patch](http://leaf.dragonflybsd.org/~davshao/r600fbsd.diff) and git branch **r600fbsd** git://leaf.dragonflybsd.org/~davshao/dragonfly.git, and tested with a Radeon HD 4550 on an x86_64 machine (Shuttle SG45H7).  However it must be remembered that testing has only been done with this one graphics card and it is completely unknown whether say an Intel machine will lock up solid.  Also nothing was done to port the extensive Via drivers FreeBSD has already ported.
6
7 ## Introduction or what the heck is being talked about
8
9 We are talking about modern graphics card drivers that have already or are in the process of being written for Linux.  Fortunately for the BSDs the source code that is the basis of these drivers, part hosted in git repositories accessible from [freedesktop.org](http://cgit.freedesktop.org/), and even the part that is now residing in the Linux kernel, is mostly licensed under terms compatible with the [MIT X License](http://www.opensource.org/licenses/mit-license.php), and therefore can be directly ported to DragonFly.
10
11 When we refer to DRM, we are referring to the [Direct Render Manager](http://dri.freedesktop.org/wiki/DRM) that is a kernel module arbitrating requests for various graphics related services.  Because of this acronym, the source code for DragonFly's DRM module can be found in directory **sys/dev/drm**, while the source code for Linux'd DRM module has been split into **include/drm** hosting common header files and **drivers/gpu/drm**.  Furthermore the Linux files have had vendor specific code split off into their own separate directories, a change the BSDs should consider since having all files in one directory is becoming rather unwieldy.
12
13 ## Previous work makes the port possible
14
15 Simply take a diff of the FreeBSD and DragonFlyBSD versions of DRM and one can readily see that the hard work of translating the semantics of the locking for the Linux drivers has mostly been done, and better still can be done almost automatically.  The FreeBSD port represents the limits of what can be ported having worked out exclusive access mechanisms, but not having completely worked out equivalents of other Linux APIs such as **idr**, small integer ID management.
16
17 ## What has been done and should be done
18
19 The software used for graphics whether the kernel or Mesa is surprisingly resilient.  As long as it compiles it will try and find a way with dealing with other mismatched components by falling back on default behavior.  Working on a fast x86_64 machine, it is easy to be lulled into a false sense that things are working properly unless one checks the logs.
20
21 ### **dmesg* output
22
23 Here the proper kernel module appears to be loaded.  I wasted quite a bit of time earlier this week not realizing an error that led to the kernel module not being loaded at all that appeared from the messages to be a device non-existence problem.
24
25     drm0: <ATI Radeon HD 4550> on vgapci0
26     vgapci0: child drm0 requested pci_enable_busmaster
27     info: [drm] Initialized radeon 1.31.0 20080613
28     info: [drm] Setting GART location based on new memory map
29     info: [drm] Loading RV710 Microcode
30     info: [drm] Resetting GPU
31     info: [drm] writeback test succeeded in 1 usecs
32
33 ### **var/log/Xorg.0.log** output
34
35 Somewhere on one's system are the logs of the latest startup of the X server and the modules it finds.  There can be an alternate place if one installs a second X.org, say at */opt/xtest*, in which case instead of **/var/log/Xorg.0.log** one will look in **/opt/xtest/var/log/Xorg.0.log**.
36
37 Here's a case of a failure where things are fine: I am composing this wiki from within Firefox 3.6.3 on a system where the proper module fails to load and yet where because of the machine's speed there is no discernible problem.
38
39     drmOpenDevice: node name is /dev/dri/card0
40     drmOpenDevice: open result is 10, (OK)
41     drmOpenByBusid: Searching for BusID pci:0000:01:00.0
42     drmOpenDevice: node name is /dev/dri/card0
43     drmOpenDevice: open result is 10, (OK)
44     drmOpenByBusid: drmOpenMinor returns 10
45     drmOpenByBusid: drmGetBusid reports pci:0000:01:00.0
46     (EE) AIGLX error: dlopen of /usr/pkg/lib/dri/r600_dri.so failed (Cannot open "/usr/pkg/lib/dri/r600_dri.so")
47     (EE) AIGLX: reverting to software rendering
48     (II) AIGLX: Loaded and initialized /usr/pkg/lib/dri/swrast_dri.so
49
50 The Mesa 7.4.x series simply didn't *have* an r600_drv.so driver so of course it can't be found.  Mesa happily falls back to using software rendering and nothing seems greatly wrong.
51
52 Now here is an example using latest Mesa and everything else from git where the driver is found:
53
54     [    95.404] drmOpenDevice: node name is /dev/dri/card0
55     [    95.405] drmOpenDevice: open result is 11, (OK)
56     [    95.405] drmOpenByBusid: Searching for BusID pci:0000:01:00.0
57     [    95.405] drmOpenDevice: node name is /dev/dri/card0
58     [    95.405] drmOpenDevice: open result is 11, (OK)
59     [    95.405] drmOpenByBusid: drmOpenMinor returns 11
60     [    95.405] drmOpenByBusid: drmGetBusid reports pci:0000:01:00.0
61     [    95.507] (II) AIGLX: enabled GLX_MESA_copy_sub_buffer
62     [    95.507] (II) AIGLX: enabled GLX_SGI_make_current_read
63     [    95.507] (II) AIGLX: enabled GLX_texture_from_pixmap with driver support
64     [    95.507] (II) AIGLX: Loaded and initialized /opt/xtest/lib/dri/r600_dri.so
65     [    95.507] (II) GLX: Initialized DRI GL provider for screen 0
66     [    95.508] (II) RADEON(0): Setting screen physical size to 508 x 285
67
68 Ironically I knew I was on the right track porting the latest git versions of the X.org stack when I succeeded in locking up hard my machine.  That meant a real hardware acceleration module was being loaded by that the previous kernel could not handle it, which was why the latest drm from FreeBSD had to be imported for Radeon r600.
69
70 ## Disclaimer
71
72 Code that is uploaded to the experimental git branches has been verified to work for one graphics card only
73 and one x86_64 system only.  It is highly likely that systems exist where using the experimental branches
74 will leave one's system unable to use software based on X.org.  Use at one's own risk.
75
76 I have experienced from an ill-fated experiment forced rebooting with corruption of a ufs2 root filesystem;
77 therefore, the same could well happen to you.  Only use this code on a system with no valuable or
78 irreplaceable data.  I disclaim any warranty or fitness of code.
79
80 ## Current Progress for Google Summer of Code 2010
81
82 Current work on porting the Linux drm to DragonFly BSD can be found in
83 git branch **gsocdrmalpha** git://leaf.dragonflybsd.org/~davshao/dragonfly.git
84
85 As of Wednesday, May 26, 2010, the first goal is to port the API from *drm.h* and *drmP.h*.
86
87 I have ported the easy 90% that does not require changing any working code.  The next harder step
88 will be to fully use the already existing implementation of *list_head* to replace the custom list
89 and locking for agp memory.
90
91 ## Installing from pkgsrc
92
93 ### GNU m4 1.4.14 and bison 2.4.2
94
95 Patch both *devel/m4* and *devel/bison* using the patch idea from:
96 <http://www.netbsd.org/cgi-bin/query-pr-single.pl?number=43098>
97
98 Unfortunately the problems are in the *work* directories so that one needs the knowledge from
99 <http://www.netbsd.org/docs/pkgsrc/components.html>
100 to even get the patches to be applied.
101
102 Install *pkgtools/pkgdiff*.
103
104 ### gstreamer 0.10
105
106 As of 2010-05-09, I find it necessary on x86_64 to use the following patch for
107 pkgsrc gstreamer0.10, an eventual dependency of the full xfce desktop:
108
109     --- pkgsrc/multimedia/gstreamer0.10/Makefile.orig       2010-03-29 16:04:23 -0700
110     +++ pkgsrc/multimedia/gstreamer0.10/Makefile    2010-03-29 16:09:04 -0700
111     @@ -44,6 +44,11 @@
112  
113      .include "../../mk/bsd.prefs.mk"
114  
115     +# __udivti3 error otherwise
116     +.if ${OPSYS} == "DragonFly" && ${MACHINE_ARCH} == "x86_64"
117     +MAKEFLAGS+=    CCVER=gcc44
118     +.endif
119     +
120      .if ${OPSYS} == "NetBSD"
121      # We must have a glib2 compiled with the RTLD_GLOBAL fix; if not, plugins
122      # won't work at all.
123
124 See for example the following bug report for more details:
125 <http://mail-index.netbsd.org/pkgsrc-bugs/2010/03/30/msg037304.html>
126
127 ## Building a separate version of X.org
128
129 We try something **ill-advised**, we build a separate version of X.org in another directory, say */opt/xbeta*,
130 on the same machine where we have installed the latext pkgsrc.  We do this because we have no choice but to
131 use the graphics hardware on this machine, but the risk is that it is very easy to link the wrong libraries
132 from pkgsrc.
133
134 ### expat and gettext
135
136 We start with installing into */opt/xbeta* [expat 2.0.1](http://sourceforge.net/projects/expat/)
137 and [gettext 0.17](http://www.gnu.org/software/gettext/).
138
139 ### Git repository for most of X.org
140
141 We use the following listing:
142
143 [freedesktop.org git repository browser](http://cgit.freedesktop.org/)
144
145 One can easily script getting, updating, and building the projects listed on that page.
146
147 ### Example of using ldd
148
149     $ ldd ./libXau.so.6          
150     ./libXau.so.6:
151         libc.so.7 => /usr/lib/libc.so.7 (0x800640000)
152     $ ldd ./libXdmcp.so.6        
153     ./libXdmcp.so.6:
154         libc.so.7 => /usr/lib/libc.so.7 (0x800640000)
155
156 ### libxcb problem with Python 2.6 cElementTree
157
158 Library *xcb/libxcb* unfortunately needs to be built early and there is a catch for
159 using pkgsrc Python 2.6.  Unfortunately at the current time not all of
160 *cElementTree* appears to be functional; therefore, one needs a patch similar to
161
162     diff --git a/src/c_client.py b/src/c_client.py
163     index d86d05e..36a7039 100755
164     --- a/src/c_client.py
165     +++ b/src/c_client.py
166     @@ -1,5 +1,5 @@
167      #!/usr/bin/env python
168     -from xml.etree.cElementTree import *
169     +from xml.etree.ElementTree import *
170      from os.path import basename
171      import getopt
172      import sys
173
174 As of May 20, 2010, the situation for libxcb seems to be more complicated.  The latest *xcb/proto* needs
175 to be installed.  If one does not wish to install on top of one's current Python modules,
176 define
177
178     export PYTHONPATH=${PREFIX}/lib/python2.6/site-packages
179
180 and apply a patch similar to below to change from using Python 2.6's *cElementTree* to *ElementTree*
181
182     diff --git a/xcbgen/matcher.py b/xcbgen/matcher.py
183     index e7958fa..16e8273 100644
184     --- a/xcbgen/matcher.py
185     +++ b/xcbgen/matcher.py
186     @@ -7,7 +7,7 @@ we do not create a new type object, we just record the existing one under a new
187      '''
188
189      from os.path import join
190     -from xml.etree.cElementTree import parse
191     +from xml.etree.ElementTree import parse
192
193      import state
194      from xtypes import *
195     diff --git a/xcbgen/state.py b/xcbgen/state.py
196     index 51efc94..e72dc3e 100644
197     --- a/xcbgen/state.py
198     +++ b/xcbgen/state.py
199     @@ -2,7 +2,7 @@
200      This module contains the namespace class and the singleton module class.
201      '''
202      from os.path import dirname, basename
203     -from xml.etree.cElementTree import parse
204     +from xml.etree.ElementTree import parse
205
206      import matcher
207      from error import *
208
209 ### libXext
210
211       CCLD   libXext.la
212     /usr/libexec/binutils217/elf/ld: .libs/extutil.o: relocation R_X86_64_PC32 against `xgeExtRegister' can not be used when making a shared   object; recompile with -fPIC
213     /usr/libexec/binutils217/elf/ld: final link failed: Bad value
214
215 Use the following patch from <http://lists.x.org/archives/xorg-devel/2009-November/003724.html>
216
217     diff --git a/src/Xge.c b/src/Xge.c
218     index 7a583e5..2ea5d27 100644
219     --- a/src/Xge.c
220     +++ b/src/Xge.c
221     @@ -294,7 +294,7 @@ _xgeEventToWire(Display* dpy, XEvent* re, xEvent* event)
222      /*
223       * Extensions need to register callbacks for their events.
224       */
225     -Bool
226     +_X_HIDDEN Bool
227      xgeExtRegister(Display* dpy, int offset, XExtensionHooks* callbacks)
228      {
229          XGEExtNode* newExt;
230
231 ### FreeType 2
232
233 We install [FreeType 2.3.12](http://www.freetype.org/).  It appears that *GNUMAKE=gmake* is required.
234 Most of the X.org projects use *autogen.sh*, but here we use a standard call to *configure* somewhat
235 similar to:
236
237         export ACLOCAL="aclocal -I ${PREFIX}/share/aclocal"
238         export PKG_CONFIG_PATH="${PREFIX}/lib/pkgconfig"
239         GNUMAKE=gmake ./configure --prefix=${PREFIX} CPPFLAGS="-I${PREFIX}/include -I${PREFIX}/X11/include" LDFLAGS="-L${PREFIX}/lib -Wl,-rpath -Wl,${PREFIX}/lib -L${PREFIX}/X11/lib -Wl,-rpath -Wl,${PREFIX}/lib/X11"
240
241 where *$PREFIX* is where we install X.org, say */opt/xbeta*,
242 the first two exports of *ACLOCAL* and *PKG_CONFIG_PATH* occur for most X.org projects,
243 *CPPFLAGS* and *LDFLAGS* ensure that the *$PREFIX* include directories and library paths
244 are used, and *-Wl,-rpath ...* is an incantation that ensures that previous built
245 *libtool* libraries can be used.
246
247 ### libXfont
248
249 *autogen.sh* script seems to build easier with
250     --without-xmlto
251 option.
252
253 ### Mesa
254
255 As of 2010-05-09, known problem with GNU m4 pkgsrc on DragonFly
256
257     /usr/pkg/bin/gm4: m4_esyscmd subprocess failed: Operation not permitted
258     /usr/pkg/bin/gm4:configure.ac:8: cannot run command `${MAKE-make} -s -f bin/version.mk version | tr -d '\n'': Operation not permitted
259     configure.ac:8: error: Failed to get the Mesa version from `make -f bin/version.mk version`
260
261 For now just manually run command
262     $ make -f bin/version.mk version
263     7.9.0
264 and substitute it using a patch similar to
265
266     diff --git a/configure.ac b/configure.ac
267     index c40c842..224a858 100644
268     --- a/configure.ac
269     +++ b/configure.ac
270     @@ -4,7 +4,7 @@ AC_PREREQ([2.59])
271  
272      dnl Versioning - scrape the version from configs/default
273      m4_define([mesa_version],
274     -    [m4_esyscmd([${MAKE-make} -s -f bin/version.mk version | tr -d '\n'])])
275     +    [7.9.0])])
276      m4_ifval(mesa_version,,
277          [m4_fatal([Failed to get the Mesa version from `make -f bin/version.mk version`])])
278
279 #### C99 fpclassify()
280
281     diff --git a/src/mesa/main/querymatrix.c b/src/mesa/main/querymatrix.c
282     index ca292aa..a0969f6 100644
283     --- a/src/mesa/main/querymatrix.c
284     +++ b/src/mesa/main/querymatrix.c
285     @@ -71,7 +71,7 @@ fpclassify(double x)
286      }
287
288      #elif defined(__APPLE__) || defined(__CYGWIN__) || defined(__FreeBSD__) || \
289     -     (defined(__sun) && defined(__C99FEATURES__))
290     +     defined(__DragonFly__) || (defined(__sun) && defined(__C99FEATURES__))
291
292      /* fpclassify is available. */
293
294 ### xserver
295
296 If one uses the patches alluded to in the pkgsrc section, one can avoid the following build error:
297
298       YACC   parser.c
299     bison: m4 subprocess failed: Operation not permitted
300     gmake[3]: *** [parser.c] Error 1
301
302 Developer documentation appears to now be enabled by default; therefore, if one is bootstrapping
303 a new tree, one might want to use the option to *autogen.sh* to not build developer documentation:
304
305 I experienced the following build error:
306
307       GEN    Xserver-spec.txt
308     No way to convert HTML to text found.
309
310 Corrected using the *autogen.sh* flag:
311
312     --disable-devel-docs
313
314 ### xinit
315
316     diff --git a/xinit.c b/xinit.c
317     index 313806e..0d31637 100644
318     --- a/xinit.c
319     +++ b/xinit.c
320     @@ -48,6 +48,12 @@ in this Software without prior written authorization from The Open Group.
321      #endif
322      #endif
323  
324     +/* For PRIO_PROCESS and setpriority() */
325     +#ifdef __DragonFly__
326     +#include <sys/time.h>
327     +#include <sys/resource.h>
328     +#endif /* __DragonFly__ */
329     +
330      #include <stdlib.h>
331
332      #ifndef SHELL
333
334 ## Building a Separate Version of GNOME
335
336 ### glib
337
338 See the bug report at <https://bugzilla.gnome.org/show_bug.cgi?id=618754> for an error similar to
339
340     /usr/libexec/binutils217/elf/ld: .libs/gthread.o: relocation R_X86_64_PC32
341     against `_g_mem_thread_init_noprivate_nomessage' can not be used when making a
342     shared object; recompile with -fPIC
343     /usr/libexec/binutils217/elf/ld: final link failed: Bad value
344
345 This bug is especially a problem because it may be related to some interaction with gcc 4.1.2 only on DragonFly.
346
347 The following patch is a complete hack:
348
349     diff --git a/configure.in b/configure.in
350     index 38288c3..51a1c07 100644
351     --- a/configure.in
352     +++ b/configure.in
353     @@ -3033,7 +3033,7 @@ _______EOF
354      #define G_GNUC_INTERNAL __attribute__((visibility("hidden")))
355      #elif defined(__SUNPRO_C) && (__SUNPRO_C >= 0x550)
356      #define G_GNUC_INTERNAL __hidden
357     -#elif defined (__GNUC__) && defined (G_HAVE_GNUC_VISIBILITY)
358     +#elif defined (__GNUC__) && defined (G_HAVE_GNUC_VISIBILITY) && !defined(__DragonFly__)
359      #define G_GNUC_INTERNAL __attribute__((visibility("hidden")))
360      #else
361      #define G_GNUC_INTERNAL
362
363 ### Graphics Image Formats
364
365 *libpng* <http://www.libpng.org/pub/png/libpng.html> version *1.4.2*
366 can be installed using *autogen.sh* and then *configure*, in contrast to
367 the X.org projects that pass parameters from *autogen.sh* to run *configure* automatically.
368
369 Independent JPEG Group's library <http://www.ijg.org/> version *8b* can be installed
370 using *configure* alone (there is no autogen.sh).
371
372 LibTIFF <http://www.remotesensing.org/libtiff/> has a recommended dependency on jpeg.
373 LibTIFF version 3.9.2 can be installed using *autogen.sh* and then *configure*.
374
375 Running
376     gmake check
377 after building any of the above three projects appears to produce passes tests.
378
379 ### XML
380
381 #### libxml2
382
383 *autogen.sh* calls *configure*
384
385 11 tests fail after *gmake check*
386
387 ### Cairo
388
389 Seems to require
390
391     export LDFLAGS="-L${PREFIX}/lib -Wl,-rpath -Wl,${PREFIX}/lib -L${PREFIX}/lib/X11 -Wl,-rpath -Wl,${PREFIX}/lib/X11"
392     export CPPFLAGS="-I${PREFIX}/include -I${PREFIX}/X11/include"
393
394 When using gcc 4.1.2, *gmake check* gives:
395
396       LINK  check-link
397     ./.libs/libcairo.so: undefined reference to `__umodti3'
398     ./.libs/libcairo.so: undefined reference to `__udivti3'
399
400 When using *CCVER=gcc44* to force gcc 4.4, one obtains the worse:
401
402       CHECK cairo.h
403     cc1: error: unrecognized command line option "-Wlogical-op"
404       CHECK cairo-deprecated.h
405     cc1: error: unrecognized command line option "-Wlogical-op"
406     ...
407
408 The problem is 128-bit division using gcc 4.1.2 as discussed earlier.  One can examine
409 *src/cairo-wideint.c* and see the telltale code enclosed in an if test for *HAVE_UINT128_T*
410 with 128-bit division if defined.
411
412 ### Pango
413
414 Install *gnome-common* first, required.
415
416 If Cairo is not built with *CCVER=gcc44*, obtain build error similar to
417
418       CCLD   pango-view
419     /opt/xcatch/lib/libcairo.so: undefined reference to `__umodti3'
420     /opt/xcatch/lib/libcairo.so: undefined reference to `__udivti3'
421     gmake[3]: *** [pango-view] Error 1
422
423 Following patch corrects an API change not propagated to the test for *gmake check*
424 <https://bugzilla.gnome.org/show_bug.cgi?id=619456>
425
426 Not including patch itself because there are tabs.  But edit file *pango/pangoft2.def*
427 and change
428     pango_fc_font_create_metrics_for_context
429 to
430     pango_fc_font_create_base_metrics_for_context
431
432 ### GObject Introspection
433
434 *cElementTree* is changed to *ElementTree* in files
435 *giscanner/girparser.py*, *giscanner/glibtransformer.py*, and *giscanner/scannermain.py*.
436
437 Using *pkg_alternatives* for a python wrapper fails as a script is generated with
438
439     #! /usr/pkg/bin/python
440
441     import os
442     import sys
443
444 A shell script cannot use another shell script as its interpreter.
445 What works for now is to manually create */usr/pkg/bin/python* as a symlink to */usr/pkg/bin/python2.6*.
446
447 ### gtk+
448
449 *gobject-introspection* is listed as a dependency but can be avoided.
450 Use option *--disable-introspection* to avoid an error
451
452     checking for gobject-introspection... yes
453     ./configure: ${INTROSPECTION_GIRDIR/...}: Bad substitution
454