1 DRI Compilation Guide 2 3 VA Linux Systems, Inc. Professional Services - Graphics. 4 5 21 April 2001 6 7 1. Preamble 8 9 1.1 Copyright 10 11 Copyright 2000-2001 by VA Linux Systems, Inc. All Rights Reserved. 12 13 Permission is granted to make and distribute verbatim copies of this document 14 provided the copyright notice and this permission notice are preserved on all 15 copies. 16 17 1.2 Trademarks 18 19 OpenGL is a registered trademark and SGI is a trademark of Silicon Graphics, 20 Inc. Unix is a registered trademark of The Open Group. The `X' device and X 21 Window System are trademarks of The Open Group. XFree86 is a trademark of 22 The XFree86 Project. Linux is a registered trademark of Linus Torvalds. 23 Intel is a registered trademark of Intel Corporation. 3Dlabs, GLINT, and 24 Oxygen are either registered trademarks or trademarks of 3Dlabs Inc. Ltd. 25 3dfx, Voodoo3, Voodoo4, and Voodoo5 are registered trademarks of 3dfx Inter- 26 active, Incorporated. Matrox is a registered trademark of Matrox Electronic 27 Systems Ltd. ATI Rage and Radeon is a registered trademark of ATI Technolo- 28 gies, Inc. All other trademarks mentioned are the property of their respec- 29 tive owners. 30 31 2. Introduction 32 33 This document describes how to download, compile and install the DRI. The 34 DRI provides 3D graphics hardware acceleration for the XFree86 project. This 35 information is intended for experienced Linux developers. Beginners are 36 probably better off installing precompiled packages. 37 38 Edits, corrections and updates to this document may be mailed to <brian@tung- 39 stengraphics.com>. 40 41 Last updated on 13 February 2002 by Brian Paul. 42 43 3. Prerequisites 44 45 You'll need the following: 46 47 o An installation of XFree86 4.1 or later. The DRI tree has been pruned 48 down to minimize its size. But in order to build the DRI tree you need 49 to have recent X header files, etc. already installed. If you don't 50 have XFree86 4.1 (or later) installed you can probably install it from 51 RPMs (or another package format). Or, you can download XFree86 as 52 sources and compile/install it yourself. 53 54 o At least 200MB of free disk space. If you compile for debugging (the -g 55 option) then you'll need about 600MB. 56 57 o GCC compiler and related tools. 58 59 o ssh (secure shell) if you're a DRI developer and don't want to use 60 anonymous CVS download. 61 62 o A 2.4.x Linux Kernel. See below for details. 63 64 o FreeBSD support is not currently being maintained and may not work. 65 66 The DRI 3D drivers generally work on systems with Intel or AMD CPUs. How- 67 ever, limited support for Alpha and PowerPC support is underway. 68 69 For 3dfx Voodoo hardware, you'll also need the Glide3 runtime library 70 (libglide3-v3.so for Voodoo3 or libglide3-v5.so for Voodoo4/5). These can be 71 downloaded from the DRI website. You can compile them yourself, but it's 72 often a painful process. 73 74 For Matrox G200/G400, Intel i810/i830 or ATI Rage128/Radeon hardware, you'll 75 also need AGP support in your Linux kernel, either built-in or as a loadable 76 module. 77 78 4. Linux Kernel Preparation 79 80 Only the Linux 2.4.x kernels are currently supported by the DRI hardware 81 drivers. 2.5.x kernels may work, but aren't tested. 82 83 Most of the DRI drivers require AGP support and using Intel Pentium III SSE 84 optimizations also requires an up-to-date Linux kernel. Configuring your 85 kernel correctly is very important, as features such as SSE optimizations 86 will be disabled if your kernel does not support them. Thus, if you have a 87 Pentium III processor, you must configure your kernel for the Pentium III 88 processor family. 89 90 Building a new Linux kernel can be difficult for beginners but there are 91 resources on the Internet to help. This document assumes experience with 92 configuring, building and installing Linux kernels. 93 94 Linux kernels can be downloaded from www.kernel.org 95 96 Here are the basic steps for kernel setup. 97 98 o Download the needed kernel and put it in /usr/src. Create a directory 99 for the source and unpack it. For example: 100 101 cd /usr/src 102 rm -f linux 103 mkdir linux-2.4.x 104 ln -s linux-2.4.x linux 105 bzcat linux-2.4.x.tar.bz2 | tar xf - 106 107 It is critical that /usr/src/linux point to your new kernel sources, 108 otherwise the kernel headers will not be used when building the DRI. 109 This will almost certainly cause compilation problems. 110 111 o Read /usr/src/linux/Documentation/Changes. This file lists the minimum 112 requirements for all software packages required to build the kernel. 113 You must upgrade at least gcc, make, binutils and modutils to at least 114 the versions specified in this file. The other packages may not be 115 needed. If you are upgrading from Linux 2.2.x you must upgrade your 116 modutils package for Linux 2.4.x. 117 118 o Configure your kernel. You might, for example, use make menuconfig and 119 do the following: 120 121 o Go to Code maturity level options 122 123 o Enable Prompt for development and/or incomplete code/drivers 124 125 o hit ESC to return to the top-level menu 126 127 o Go to Processor type and features 128 129 o Select your processor type from Processor Family 130 131 o hit ESC to return to the top-level menu 132 133 o Go to Character devices 134 135 o Disable Direct Rendering Manager (XFree86 DRI support) since we'll 136 use the DRI code from the XFree86/DRI tree and will compile it 137 there. 138 139 o Go to /dev/agpgart (AGP Support) (EXPERIMENTAL) (NEW) 140 141 o Hit SPACE twice to build AGP support into the kernel 142 143 o Enable all chipsets' support for AGP 144 145 o It's recommended that you turn on MTRRs under Processor type and 146 Features, but not required. 147 148 o Configure the rest of the kernel as required for your system (i.e. Eth- 149 ernet, SCSI, etc) 150 151 o Exit, saving your kernel configuration. 152 153 o Edit your /etc/lilo.conf file. Make sure you have an image entry as 154 follows (or similar): 155 156 image=/boot/vmlinuz 157 label=linux.2.4.x 158 read-only 159 root=/dev/hda1 160 161 The important part is that you have /boot/vmlinuz without a trailing 162 version number. If this is the first entry in your /etc/lilo.conf AND 163 you haven't set a default, then this will be your default kernel. 164 165 o Compile the new kernel. 166 167 cd /usr/src/linux-2.4.x 168 make dep 169 make bzImage 170 make modules 171 make modules_install 172 make install 173 174 Note that last make command will automatically run lilo for you. 175 176 o Now reboot to use the new kernel. 177 178 5. CPU Architectures 179 180 In general, nothing special has to be done to use the DRI on different CPU 181 architectures. There are, however, a few optimizations that are CPU-depen- 182 dent. Mesa will determine at runtime which CPU-dependent optimizations 183 should be used and enable them where appropriate. 184 185 5.1 Intel Pentium III Features 186 187 The Pentium III SSE instructions are used in optimized vertex transformation 188 functions in the Mesa-based DRI drivers. On Linux, SSE requires a recent 189 kernel (such as 2.4.0-test11 or later) both at compile time and runtime. 190 191 5.2 AMD 3DNow! Features 192 193 AMD's 3DNow! instructions are used in optimized vertex transformation func- 194 tions in the Mesa-based DRI drivers. 3DNow! is supported in most versions of 195 Linux. 196 197 5.3 Alpha Features 198 199 On newer Alpha processors a significant performance increase can be seen with 200 the addition of the -mcpu= option to GCC. This option is dependent on the 201 architecture of the processor. For example, -mcpu=ev6 will build specifi- 202 cally for the EV6 based AXP's, giving both byte and word alignment access to 203 the DRI/Mesa drivers. 204 205 To enable this optimization edit your xc/config/host.def file and add the 206 line: 207 208 #define DefaultGcc2AxpOpt -O2 -mcpu=ev6 209 210 Additional speed improvements to 3D rendering can be achieved by installing 211 Compaq's Math Libraries (CPML) which can be obtained from http://www.sup- 212 port.compaq.com/alpha-tools/software/index.html 213 214 Once installed, you can add this line to your host.def to build with the CPML 215 libraries: 216 217 #define UseCompaqMathLibrary YES 218 219 The host.def file is explained below. 220 221 6. Downloading the XFree86/DRI CVS Sources 222 223 The DRI project is hosted by SourceForge. The DRI source code, which is a 224 subset of the XFree86 source tree, is kept in a CVS repository there. 225 226 The DRI CVS sources may be accessed either anonymously or as a registered 227 SourceForge user. It's recommended that you become a registered SourceForge 228 user so that you may submit non-anonymous bug reports and can participate in 229 the mailing lists. 230 231 6.1 Anonymous CVS download: 232 233 1. Create a directory to store the CVS files: 234 235 cd ~ 236 mkdir DRI-CVS 237 238 You could put your CVS directory in a different place but we'll use 239 ~/DRI-CVS/ here. 240 241 2. Check out the CVS sources: 242 243 cd ~/DRI-CVS 244 cvs -d:pserver:anonymous (a] cvs.dri.sourceforge.net:/cvsroot/dri login 245 (hit ENTER when prompted for a password) 246 cvs -z3 -d:pserver:anonymous (a] cvs.dri.sourceforge.net:/cvsroot/dri co xc 247 248 The -z3 flag causes compression to be used in order to reduce the down- 249 load time. 250 251 6.2 Registered CVS download: 252 253 1. Create a directory to store the CVS files: 254 255 cd ~ 256 mkdir DRI-CVS 257 258 You could put your CVS directory in a different place but we'll use 259 ~/DRI-CVS/ here. 260 261 2. Set the CVS_RSH environment variable: 262 263 setenv CVS_RSH ssh // if using csh or tcsh 264 export CVS_RSH=ssh // if using sh or bash 265 266 3. Check out the CVS sources: 267 268 cd ~/DRI-CVS 269 cvs -z3 -d:ext:YOURID (a] cvs.dri.sourceforge.net:/cvsroot/dri co xc 270 271 Replace YOURID with your CVS login name. You'll be prompted to enter 272 your sourceforge password. 273 274 The -z3 flag causes compression to be used in order to reduce the down- 275 load time. 276 277 6.3 Updating your CVS sources 278 279 In the future you'll want to occasionally update your local copy of the DRI 280 source code to get the latest changes. This can be done with: 281 282 cd ~/DRI-CVS 283 cvs -z3 update -dA xc 284 285 The -d flag causes any new subdirectories to be created and -A causes most 286 recent trunk sources to be fetched, not branch sources. 287 288 7. Mesa 289 290 Most of the DRI 3D drivers are based on Mesa (the free implementation of the 291 OpenGL API). The relevant files from Mesa are already included in the 292 XFree86/DRI source tree. There is no need to download or install the Mesa 293 source files separately. 294 295 Sometimes a newer version of Mesa will be available than the version included 296 in XFree86/DRI. Upgrading Mesa within XFree86/DRI is not always straightfor- 297 ward. It can be an error-prone undertaking, especially for beginners, and is 298 not generally recommended. The DRI developers will upgrade Mesa when appro- 299 priate. 300 301 8. Compiling the XFree86/DRI tree 302 303 8.1 Make a build tree 304 305 Rather than placing object files and library files right in the source tree, 306 they're instead put into a parallel build tree. The build tree is made with 307 the lndir command: 308 309 cd ~/DRI-CVS 310 ln -s xc XFree40 311 mkdir build 312 cd build 313 lndir -silent -ignorelinks ../XFree40 314 315 The build tree will be populated with symbolic links which point back into 316 the CVS source tree. 317 318 Advanced users may have several build trees for compiling and testing with 319 different options. 320 321 8.2 Edit the host.def file 322 323 The ~/DRI-CVS/build/xc/config/cf/host.def file is used to configure the 324 XFree86 build process. You can change it to customize your build options or 325 make adjustments for your particular system configuration 326 327 The default host.def file will look something like this: 328 329 #define DefaultCCOptions -Wall 330 (i386) #define DefaultGcc2i386Opt -O2 331 (Alpha) #define DefaultGcc2AxpOpt -O2 -mcpu=ev6 (or similar) 332 #define LibraryCDebugFlags -O2 333 #define BuildServersOnly YES 334 #define XF86CardDrivers vga tdfx mga ati i810 335 #define LinuxDistribution LinuxRedHat 336 #define DefaultCCOptions -ansi GccWarningOptions -pipe 337 #define BuildXF86DRI YES 338 /* Optionally turn these on for debugging */ 339 /* #define GlxBuiltInTdfx YES */ 340 /* #define GlxBuiltInMga YES */ 341 /* #define GlxBuiltInR128 YES */ 342 /* #define GlxBuiltInRadeon YES */ 343 /* #define DoLoadableServer NO */ 344 #define SharedLibFont NO 345 346 The ProjectRoot variable specifies where the XFree86 files will be installed. 347 We recommend installing the DRI files over your existing XFree86 installation 348 - it's generally safe to do and less error-prone. This policy is different 349 than what we used to recommend. 350 351 If XFree86 4.x is not installed in /usr/X11R6/ you'll have to add the follow- 352 ing to the host.def file: 353 354 #define ProjectRoot pathToYourXFree86installation 355 356 Note the XF86CardDrivers line to be sure your card's driver is listed. 357 358 If you want to enable 3DNow! optimizations in Mesa and the DRI drivers, you 359 should add the following: 360 361 #define MesaUse3DNow YES 362 363 You don't have to be using an AMD processor in order to enable this option. 364 The DRI will look for 3DNow! support and runtime and only enable it if appli- 365 cable. 366 367 If you want to enable SSE optimizations in Mesa and the DRI drivers, you must 368 upgrade to a Linux 2.4.x kernel. Mesa will verify that SSE is supported by 369 both your processor and your operating system, but to build Mesa inside the 370 DRI you need to have the Linux 2.4.x kernel headers in /usr/src/linux. If 371 you enable SSE optimizations with an earlier version of the Linux kernel in 372 /usr/src/linux, Mesa will not compile. You have been warned. If you do have 373 a 2.4.x kernel, you should add the following: 374 375 #define MesaUseSSE YES 376 377 If you want to build the DRM kernel modules as part of the full build pro- 378 cess, add the following: 379 380 #define BuildXF86DRM YES 381 382 Otherwise, you'll need to build them separately as described below. 383 384 8.3 Compilation 385 386 To compile the complete DRI tree: 387 388 cd ~/DRI-CVS/build/xc/ 389 make World >& world.log 390 391 Or if you want to watch the compilation progress: 392 393 cd ~/DRI-CVS/build/xc/ 394 make World >& world.log & 395 tail -f world.log 396 397 With the default compilation flags it's normal to get a lot of warnings dur- 398 ing compilation. 399 400 Building will take some time so you may want to go check your email or visit 401 slashdot. 402 403 WARNING: do not use the -j option with make. It's reported that it does not 404 work with XFree86/DRI. 405 406 8.4 Check for compilation errors 407 408 Using your text editor, examine world.log for errors by searching for the 409 pattern ***. 410 411 After fixing the errors, run make World again. Later, you might just compile 412 parts of the source tree but it's important that the whole tree will build 413 first. 414 415 If you edited your host.def file to enable automatic building of the DRI ker- 416 nel module(s), verify that they were built: 417 418 cd ~/DRI-CVS/build/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel 419 ls 420 421 Otherwise, build them now by running 422 423 cd ~/DRI-CVS/build/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel 424 make -f Makefile.linux 425 426 For the 3dfx Voodoo, you should see tdfx.o. For the Matrox G200/G400, you 427 should see mga.o. For the ATI Rage 128, you should see r128.o. For the ATI 428 Radeon, you should see radeon.o. For the Intel i810, you should see i810.o. 429 430 If the DRI kernel module(s) failed to build you should verify that you're 431 using the right version of the Linux kernel. The most recent kernels are not 432 always supported. 433 434 If your build machine is running a different version of the kernel than your 435 target machine (i.e. 2.2.x vs. 2.4.x), make will select the wrong kernel 436 source tree. This can be fixed by explicitly setting the value of LINUXDIR. 437 If the path to your kernel source is /usr/src/linux-2.4.x, 438 439 cd ~/DRI-CVS/build/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel 440 make -f Makefile.linux LINUXDIR=/usr/src/linux-2.4.x 441 442 or alternatively, edit Makefile.linux to set LINUXDIR before the ifndef LIN- 443 UXDIR line. 444 445 8.5 DRI kernel module installation 446 447 The DRI kernel modules will be in ~/DRI-CVS/build/xc/pro- 448 grams/Xserver/hw/xfree86/os-support/linux/drm/kernel/. 449 450 To load the appropriate DRM module in your running kernel you can either use 451 ismod and restart your X server or copy the kernel module to /lib/mod- 452 ules/2.4.x/kernel/drivers/char/drm/ then run depmod and restart your X 453 server. 454 455 Make sure you first unload any older DRI kernel modules that might be already 456 loaded. 457 458 Note that some DRM modules require that the agpgart module be loaded first. 459 460 9. Normal Installation and Configuration 461 462 Most users will want to install the new X server and use it in place of their 463 old X server. This section explains how to do that. 464 465 Developers, on the other hand, may just want to test the X server without 466 actually installing it as their default server. If you want to do that, skip 467 to the next section. 468 469 9.1 Installation 470 471 Here are the installation commands: 472 473 su 474 cd ~/DRI-CVS/build/xc 475 make install 476 477 9.2 Update the XF86Config File 478 479 You may need to edit your XF86Config file to enable the DRI. The config file 480 is usually installed as /etc/X11/XF86Config-4. See the DRI User Guide for 481 details, but basically, you need to load the "glx" and "dri" modules and add 482 a "DRI" section. 483 484 On the DRI web site, in the resources section, you'll find example XF86Config 485 files for a number of graphics cards. These configuration files also setup 486 DRI options so it's highly recommended that you look at these examples. 487 488 The XFree86 4.x server can generate a basic configuration file itself. Sim- 489 ply do this: 490 491 cd /usr/X11R6/bin 492 ./XFree86 -configure 493 494 A file named /root/XF86Config.new will be created. It should allow you to 495 try your X server but you'll almost certainly have to edit it. For example, 496 you should add HorizSync and VertRefresh options to the Monitor section and 497 Modes options to the Screen section. Also, the ModulePath option in the 498 Files section should be set to /usr/X11R6/lib/modules. 499 500 9.3 Start the New X Server 501 502 The new X server should be ready to use now. Start your X server in your 503 usual manner. Often times the startx command is used: 504 505 startx 506 507 10. Testing the Server Without Installing It 508 509 As mentioned at the start of section 9, developers may want to simply run the 510 X server without installing it. This can save some time and allow you to 511 keep a number of X servers available for testing. 512 513 10.1 Configuration 514 515 As described in the preceding section, you'll need to create a configuration 516 file for the new server. Put the XF86Config file in your ~/DRI- 517 CVS/build/xc/programs/Xserver directory. 518 519 Be sure the ModulePath option in your XF86Config file is set correctly. 520 521 10.2 A Startup Script 522 523 A simple shell script can be used to start the X server. Here's an example. 524 525 #!/bin/sh 526 export DISPLAY=:0 527 ./XFree86 -xf86config XF86Config & \ 528 sleep 2 529 fvwm2 & 530 xset b off 531 xmodmap -e "clear mod4" 532 xsetroot -solid "#00306f" 533 xterm -geometry 80x40+0+0 534 535 You might name this script start-dri. Put it in your ~/DRI-CVS/build/xc/pro- 536 grams/Xserver directory. 537 538 To test the server run the script: 539 540 cd ~/DRI-CVS/build/xc/programs/Xserver 541 ./start-dri 542 543 For debugging, you may also want to capture the log messages printed by the 544 server in a file. If you're using the C-shell: 545 546 ./start-dri >& log 547 548 11. Where To Go From Here 549 550 At this point your X server should be up and running with hardware-acceler- 551 ated direct rendering. Please read the DRI User Guide for information about 552 trouble shooting and how to use the DRI-enabled X server for 3D applications. 553 554 Generated from XFree86: xc/programs/Xserver/hw/xfree86/doc/sgml/DRIcomp.sgml,v 1.19 dawes Exp $ 555 556 557