Andreas Boll | ecd5c7c | 2012-06-12 09:05:03 +0200 | [diff] [blame] | 1 | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> |
| 2 | <html lang="en"> |
| 3 | <head> |
| 4 | <meta http-equiv="content-type" content="text/html; charset=utf-8"> |
| 5 | <title>llvmpipe</title> |
| 6 | <link rel="stylesheet" type="text/css" href="mesa.css"> |
| 7 | </head> |
| 8 | <body> |
Brian Paul | 0da2a22 | 2011-04-07 13:56:45 -0600 | [diff] [blame] | 9 | |
Andreas Boll | b5da52a | 2012-09-18 18:57:02 +0200 | [diff] [blame] | 10 | <div class="header"> |
| 11 | <h1>The Mesa 3D Graphics Library</h1> |
| 12 | </div> |
| 13 | |
| 14 | <iframe src="contents.html"></iframe> |
| 15 | <div class="content"> |
| 16 | |
Andreas Boll | ecd5c7c | 2012-06-12 09:05:03 +0200 | [diff] [blame] | 17 | <h1>Introduction</h1> |
Brian Paul | 0da2a22 | 2011-04-07 13:56:45 -0600 | [diff] [blame] | 18 | |
| 19 | <p> |
| 20 | The Gallium llvmpipe driver is a software rasterizer that uses LLVM to |
| 21 | do runtime code generation. |
| 22 | Shaders, point/line/triangle rasterization and vertex processing are |
| 23 | implemented with LLVM IR which is translated to x86 or x86-64 machine |
| 24 | code. |
| 25 | Also, the driver is multithreaded to take advantage of multiple CPU cores |
| 26 | (up to 8 at this time). |
| 27 | It's the fastest software rasterizer for Mesa. |
| 28 | </p> |
José Fonseca | 9285f15 | 2009-08-10 12:35:16 +0100 | [diff] [blame] | 29 | |
| 30 | |
Brian Paul | 0da2a22 | 2011-04-07 13:56:45 -0600 | [diff] [blame] | 31 | <h1>Requirements</h1> |
José Fonseca | 9285f15 | 2009-08-10 12:35:16 +0100 | [diff] [blame] | 32 | |
José Fonseca | 65d0c84 | 2011-11-05 10:38:16 +0000 | [diff] [blame] | 33 | <ul> |
| 34 | <li> |
Andreas Boll | fd64b39 | 2012-06-12 09:05:49 +0200 | [diff] [blame] | 35 | <p>An x86 or amd64 processor; 64-bit mode recommended.</p> |
Brian Paul | 0da2a22 | 2011-04-07 13:56:45 -0600 | [diff] [blame] | 36 | <p> |
Matt Turner | 9f52b87 | 2011-11-05 17:11:59 -0400 | [diff] [blame] | 37 | Support for SSE2 is strongly encouraged. Support for SSSE3 and SSE4.1 will |
| 38 | yield the most efficient code. The fewer features the CPU has the more |
Andreas Boll | fd64b39 | 2012-06-12 09:05:49 +0200 | [diff] [blame] | 39 | likely is that you run into underperforming, buggy, or incomplete code. |
Brian Paul | 0da2a22 | 2011-04-07 13:56:45 -0600 | [diff] [blame] | 40 | </p> |
| 41 | <p> |
José Fonseca | da1c402 | 2009-11-26 11:15:08 +0000 | [diff] [blame] | 42 | See /proc/cpuinfo to know what your CPU supports. |
Brian Paul | 0da2a22 | 2011-04-07 13:56:45 -0600 | [diff] [blame] | 43 | </p> |
José Fonseca | 65d0c84 | 2011-11-05 10:38:16 +0000 | [diff] [blame] | 44 | </li> |
| 45 | <li> |
José Fonseca | 76bf4bd | 2014-05-29 20:02:31 +0100 | [diff] [blame^] | 46 | <p>LLVM: version 3.4 recommended; 3.1 or later required.</p> |
Brian Paul | 0da2a22 | 2011-04-07 13:56:45 -0600 | [diff] [blame] | 47 | <p> |
José Fonseca | 1257655 | 2010-01-10 18:37:07 +0000 | [diff] [blame] | 48 | For Linux, on a recent Debian based distribution do: |
Brian Paul | 0da2a22 | 2011-04-07 13:56:45 -0600 | [diff] [blame] | 49 | </p> |
| 50 | <pre> |
José Fonseca | 9285f15 | 2009-08-10 12:35:16 +0100 | [diff] [blame] | 51 | aptitude install llvm-dev |
Brian Paul | 0da2a22 | 2011-04-07 13:56:45 -0600 | [diff] [blame] | 52 | </pre> |
Andreas Boll | df2be22 | 2012-06-12 09:05:22 +0200 | [diff] [blame] | 53 | <p> |
Brian Paul | 0da2a22 | 2011-04-07 13:56:45 -0600 | [diff] [blame] | 54 | For a RPM-based distribution do: |
| 55 | </p> |
| 56 | <pre> |
| 57 | yum install llvm-devel |
| 58 | </pre> |
José Fonseca | 19b31d0 | 2009-08-10 15:43:04 +0100 | [diff] [blame] | 59 | |
Brian Paul | 0da2a22 | 2011-04-07 13:56:45 -0600 | [diff] [blame] | 60 | <p> |
José Fonseca | 65d0c84 | 2011-11-05 10:38:16 +0000 | [diff] [blame] | 61 | For Windows you will need to build LLVM from source with MSVC or MINGW |
| 62 | (either natively or through cross compilers) and CMake, and set the LLVM |
| 63 | environment variable to the directory you installed it to. |
José Fonseca | 19b31d0 | 2009-08-10 15:43:04 +0100 | [diff] [blame] | 64 | |
José Fonseca | 65d0c84 | 2011-11-05 10:38:16 +0000 | [diff] [blame] | 65 | LLVM will be statically linked, so when building on MSVC it needs to be |
| 66 | built with a matching CRT as Mesa, and you'll need to pass |
| 67 | -DLLVM_USE_CRT_RELEASE=MTd for debug and checked builds, |
| 68 | -DLLVM_USE_CRT_RELEASE=MTd for profile and release builds. |
José Fonseca | f379e7d | 2010-05-13 16:18:05 +0100 | [diff] [blame] | 69 | |
José Fonseca | 65d0c84 | 2011-11-05 10:38:16 +0000 | [diff] [blame] | 70 | You can build only the x86 target by passing -DLLVM_TARGETS_TO_BUILD=X86 |
| 71 | to cmake. |
Brian Paul | 0da2a22 | 2011-04-07 13:56:45 -0600 | [diff] [blame] | 72 | </p> |
José Fonseca | 65d0c84 | 2011-11-05 10:38:16 +0000 | [diff] [blame] | 73 | </li> |
José Fonseca | f379e7d | 2010-05-13 16:18:05 +0100 | [diff] [blame] | 74 | |
José Fonseca | 65d0c84 | 2011-11-05 10:38:16 +0000 | [diff] [blame] | 75 | <li> |
| 76 | <p>scons (optional)</p> |
| 77 | </li> |
| 78 | </ul> |
| 79 | |
José Fonseca | 9285f15 | 2009-08-10 12:35:16 +0100 | [diff] [blame] | 80 | |
Brian Paul | 0da2a22 | 2011-04-07 13:56:45 -0600 | [diff] [blame] | 81 | <h1>Building</h1> |
José Fonseca | 9285f15 | 2009-08-10 12:35:16 +0100 | [diff] [blame] | 82 | |
José Fonseca | 1257655 | 2010-01-10 18:37:07 +0000 | [diff] [blame] | 83 | To build everything on Linux invoke scons as: |
José Fonseca | 9285f15 | 2009-08-10 12:35:16 +0100 | [diff] [blame] | 84 | |
Brian Paul | 0da2a22 | 2011-04-07 13:56:45 -0600 | [diff] [blame] | 85 | <pre> |
José Fonseca | 601498a | 2010-11-01 13:30:22 +0000 | [diff] [blame] | 86 | scons build=debug libgl-xlib |
Brian Paul | 0da2a22 | 2011-04-07 13:56:45 -0600 | [diff] [blame] | 87 | </pre> |
José Fonseca | 9285f15 | 2009-08-10 12:35:16 +0100 | [diff] [blame] | 88 | |
José Fonseca | 5811ed8 | 2009-08-22 22:26:55 +0100 | [diff] [blame] | 89 | Alternatively, you can build it with GNU make, if you prefer, by invoking it as |
| 90 | |
Brian Paul | 0da2a22 | 2011-04-07 13:56:45 -0600 | [diff] [blame] | 91 | <pre> |
José Fonseca | 5811ed8 | 2009-08-22 22:26:55 +0100 | [diff] [blame] | 92 | make linux-llvm |
Brian Paul | 0da2a22 | 2011-04-07 13:56:45 -0600 | [diff] [blame] | 93 | </pre> |
José Fonseca | 5811ed8 | 2009-08-22 22:26:55 +0100 | [diff] [blame] | 94 | |
José Fonseca | 1fc4100 | 2009-09-11 11:24:00 +0100 | [diff] [blame] | 95 | but the rest of these instructions assume that scons is used. |
José Fonseca | 5811ed8 | 2009-08-22 22:26:55 +0100 | [diff] [blame] | 96 | |
José Fonseca | 65d0c84 | 2011-11-05 10:38:16 +0000 | [diff] [blame] | 97 | For Windows the procedure is similar except the target: |
José Fonseca | 1257655 | 2010-01-10 18:37:07 +0000 | [diff] [blame] | 98 | |
Brian Paul | 0da2a22 | 2011-04-07 13:56:45 -0600 | [diff] [blame] | 99 | <pre> |
José Fonseca | 76bf4bd | 2014-05-29 20:02:31 +0100 | [diff] [blame^] | 100 | scons platform=windows build=debug libgl-gdi |
Brian Paul | 0da2a22 | 2011-04-07 13:56:45 -0600 | [diff] [blame] | 101 | </pre> |
José Fonseca | 9285f15 | 2009-08-10 12:35:16 +0100 | [diff] [blame] | 102 | |
Brian Paul | 0da2a22 | 2011-04-07 13:56:45 -0600 | [diff] [blame] | 103 | |
| 104 | <h1>Using</h1> |
José Fonseca | 9285f15 | 2009-08-10 12:35:16 +0100 | [diff] [blame] | 105 | |
José Fonseca | 76bf4bd | 2014-05-29 20:02:31 +0100 | [diff] [blame^] | 106 | <h2>Linux</h2> |
| 107 | |
| 108 | <p>On Linux, building will create a drop-in alternative for libGL.so into</p> |
José Fonseca | 9285f15 | 2009-08-10 12:35:16 +0100 | [diff] [blame] | 109 | |
Brian Paul | 0da2a22 | 2011-04-07 13:56:45 -0600 | [diff] [blame] | 110 | <pre> |
José Fonseca | 601498a | 2010-11-01 13:30:22 +0000 | [diff] [blame] | 111 | build/foo/gallium/targets/libgl-xlib/libGL.so |
Brian Paul | 0da2a22 | 2011-04-07 13:56:45 -0600 | [diff] [blame] | 112 | </pre> |
| 113 | or |
| 114 | <pre> |
| 115 | lib/gallium/libGL.so |
| 116 | </pre> |
José Fonseca | 9285f15 | 2009-08-10 12:35:16 +0100 | [diff] [blame] | 117 | |
José Fonseca | 76bf4bd | 2014-05-29 20:02:31 +0100 | [diff] [blame^] | 118 | <p>To use it set the LD_LIBRARY_PATH environment variable accordingly.</p> |
José Fonseca | 5811ed8 | 2009-08-22 22:26:55 +0100 | [diff] [blame] | 119 | |
José Fonseca | 76bf4bd | 2014-05-29 20:02:31 +0100 | [diff] [blame^] | 120 | <p>For performance evaluation pass build=release to scons, and use the corresponding |
| 121 | lib directory without the "-debug" suffix.</p> |
José Fonseca | 1fc4100 | 2009-09-11 11:24:00 +0100 | [diff] [blame] | 122 | |
José Fonseca | 76bf4bd | 2014-05-29 20:02:31 +0100 | [diff] [blame^] | 123 | |
| 124 | <h2>Windows</h2> |
| 125 | |
| 126 | <p> |
| 127 | On Windows, building will create |
| 128 | <code>build/windows-x86-debug/gallium/targets/libgl-gdi/opengl32.dll</code> |
| 129 | which is a drop-in alternative for system's <code>opengl32.dll</code>. To use |
| 130 | it put it in the same directory as your application. It can also be used by |
José Fonseca | 1257655 | 2010-01-10 18:37:07 +0000 | [diff] [blame] | 131 | replacing the native ICD driver, but it's quite an advanced usage, so if you |
| 132 | need to ask, don't even try it. |
José Fonseca | 76bf4bd | 2014-05-29 20:02:31 +0100 | [diff] [blame^] | 133 | </p> |
| 134 | |
| 135 | <p> |
| 136 | There is however an easy way to replace the OpenGL software renderer that comes |
| 137 | with Microsoft Windows 7 (or later) with llvmpipe (that is, on systems without |
| 138 | any OpenGL drivers): |
| 139 | </p> |
| 140 | |
| 141 | <ul> |
| 142 | <li><p>copy build/windows-x86-debug/gallium/targets/libgl-gdi/opengl32.dll to C:\Windows\SysWOW64\mesadrv.dll</p></li> |
| 143 | <li><p>load this registry settings:</p> |
| 144 | <pre>REGEDIT4 |
| 145 | |
| 146 | ; http://technet.microsoft.com/en-us/library/cc749368.aspx |
| 147 | ; http://www.msfn.org/board/topic/143241-portable-windows-7-build-from-winpe-30/page-5#entry942596 |
| 148 | [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\OpenGLDrivers\MSOGL] |
| 149 | "DLL"="mesadrv.dll" |
| 150 | "DriverVersion"=dword:00000001 |
| 151 | "Flags"=dword:00000001 |
| 152 | "Version"=dword:00000002 |
| 153 | </pre> |
| 154 | </li> |
| 155 | <li>Ditto for 64 bits drivers if you need them.</li> |
| 156 | </ul> |
José Fonseca | 1257655 | 2010-01-10 18:37:07 +0000 | [diff] [blame] | 157 | |
José Fonseca | 9285f15 | 2009-08-10 12:35:16 +0100 | [diff] [blame] | 158 | |
Brian Paul | 0da2a22 | 2011-04-07 13:56:45 -0600 | [diff] [blame] | 159 | <h1>Profiling</h1> |
José Fonseca | 388c941 | 2010-09-21 17:50:30 +0100 | [diff] [blame] | 160 | |
José Fonseca | b8f6858 | 2013-04-17 13:32:15 +0100 | [diff] [blame] | 161 | <p> |
| 162 | To profile llvmpipe you should build as |
| 163 | </p> |
Brian Paul | 0da2a22 | 2011-04-07 13:56:45 -0600 | [diff] [blame] | 164 | <pre> |
Andreas Boll | 703a662 | 2012-06-12 09:05:15 +0200 | [diff] [blame] | 165 | scons build=profile <same-as-before> |
Brian Paul | 0da2a22 | 2011-04-07 13:56:45 -0600 | [diff] [blame] | 166 | </pre> |
José Fonseca | 388c941 | 2010-09-21 17:50:30 +0100 | [diff] [blame] | 167 | |
José Fonseca | b8f6858 | 2013-04-17 13:32:15 +0100 | [diff] [blame] | 168 | <p> |
José Fonseca | 388c941 | 2010-09-21 17:50:30 +0100 | [diff] [blame] | 169 | This will ensure that frame pointers are used both in C and JIT functions, and |
| 170 | that no tail call optimizations are done by gcc. |
José Fonseca | b8f6858 | 2013-04-17 13:32:15 +0100 | [diff] [blame] | 171 | </p> |
José Fonseca | 388c941 | 2010-09-21 17:50:30 +0100 | [diff] [blame] | 172 | |
José Fonseca | b8f6858 | 2013-04-17 13:32:15 +0100 | [diff] [blame] | 173 | <h2>Linux perf integration</h2> |
| 174 | |
| 175 | <p> |
| 176 | On Linux, it is possible to have symbol resolution of JIT code with <a href="http://perf.wiki.kernel.org/">Linux perf</a>: |
| 177 | </p> |
José Fonseca | 388c941 | 2010-09-21 17:50:30 +0100 | [diff] [blame] | 178 | |
Brian Paul | 0da2a22 | 2011-04-07 13:56:45 -0600 | [diff] [blame] | 179 | <pre> |
José Fonseca | b8f6858 | 2013-04-17 13:32:15 +0100 | [diff] [blame] | 180 | perf record -g /my/application |
| 181 | perf report |
Brian Paul | 0da2a22 | 2011-04-07 13:56:45 -0600 | [diff] [blame] | 182 | </pre> |
José Fonseca | 388c941 | 2010-09-21 17:50:30 +0100 | [diff] [blame] | 183 | |
José Fonseca | b8f6858 | 2013-04-17 13:32:15 +0100 | [diff] [blame] | 184 | <p> |
| 185 | When run inside Linux perf, llvmpipe will create a /tmp/perf-XXXXX.map file with |
| 186 | symbol address table. It also dumps assembly code to /tmp/perf-XXXXX.map.asm, |
| 187 | which can be used by the bin/perf-annotate-jit script to produce disassembly of |
| 188 | the generated code annotated with the samples. |
| 189 | </p> |
José Fonseca | 388c941 | 2010-09-21 17:50:30 +0100 | [diff] [blame] | 190 | |
José Fonseca | b8f6858 | 2013-04-17 13:32:15 +0100 | [diff] [blame] | 191 | <p>You can obtain a call graph via |
| 192 | <a href="http://code.google.com/p/jrfonseca/wiki/Gprof2Dot#linux_perf">Gprof2Dot</a>.</p> |
José Fonseca | 388c941 | 2010-09-21 17:50:30 +0100 | [diff] [blame] | 193 | |
| 194 | |
Brian Paul | 0da2a22 | 2011-04-07 13:56:45 -0600 | [diff] [blame] | 195 | <h1>Unit testing</h1> |
José Fonseca | 9285f15 | 2009-08-10 12:35:16 +0100 | [diff] [blame] | 196 | |
Brian Paul | 0da2a22 | 2011-04-07 13:56:45 -0600 | [diff] [blame] | 197 | <p> |
José Fonseca | 9285f15 | 2009-08-10 12:35:16 +0100 | [diff] [blame] | 198 | Building will also create several unit tests in |
| 199 | build/linux-???-debug/gallium/drivers/llvmpipe: |
Brian Paul | 0da2a22 | 2011-04-07 13:56:45 -0600 | [diff] [blame] | 200 | </p> |
José Fonseca | 9285f15 | 2009-08-10 12:35:16 +0100 | [diff] [blame] | 201 | |
Andreas Boll | df2be22 | 2012-06-12 09:05:22 +0200 | [diff] [blame] | 202 | <ul> |
Brian Paul | 0da2a22 | 2011-04-07 13:56:45 -0600 | [diff] [blame] | 203 | <li> lp_test_blend: blending |
| 204 | <li> lp_test_conv: SIMD vector conversion |
| 205 | <li> lp_test_format: pixel unpacking/packing |
| 206 | </ul> |
José Fonseca | 9285f15 | 2009-08-10 12:35:16 +0100 | [diff] [blame] | 207 | |
Brian Paul | 0da2a22 | 2011-04-07 13:56:45 -0600 | [diff] [blame] | 208 | <p> |
José Fonseca | 1fc4100 | 2009-09-11 11:24:00 +0100 | [diff] [blame] | 209 | Some of this tests can output results and benchmarks to a tab-separated-file |
José Fonseca | 89146cd | 2009-08-20 10:21:49 +0100 | [diff] [blame] | 210 | for posterior analysis, e.g.: |
Brian Paul | 0da2a22 | 2011-04-07 13:56:45 -0600 | [diff] [blame] | 211 | </p> |
| 212 | <pre> |
José Fonseca | 5811ed8 | 2009-08-22 22:26:55 +0100 | [diff] [blame] | 213 | build/linux-x86_64-debug/gallium/drivers/llvmpipe/lp_test_blend -o blend.tsv |
Brian Paul | 0da2a22 | 2011-04-07 13:56:45 -0600 | [diff] [blame] | 214 | </pre> |
José Fonseca | 9285f15 | 2009-08-10 12:35:16 +0100 | [diff] [blame] | 215 | |
José Fonseca | c5531f5 | 2009-08-21 10:57:48 +0100 | [diff] [blame] | 216 | |
Brian Paul | 0da2a22 | 2011-04-07 13:56:45 -0600 | [diff] [blame] | 217 | <h1>Development Notes</h1> |
José Fonseca | c5531f5 | 2009-08-21 10:57:48 +0100 | [diff] [blame] | 218 | |
Brian Paul | 0da2a22 | 2011-04-07 13:56:45 -0600 | [diff] [blame] | 219 | <ul> |
| 220 | <li> |
| 221 | When looking to this code by the first time start in lp_state_fs.c, and |
José Fonseca | 5811ed8 | 2009-08-22 22:26:55 +0100 | [diff] [blame] | 222 | then skim through the lp_bld_* functions called in there, and the comments |
Andreas Boll | fd64b39 | 2012-06-12 09:05:49 +0200 | [diff] [blame] | 223 | at the top of the lp_bld_*.c functions. |
Brian Paul | 0da2a22 | 2011-04-07 13:56:45 -0600 | [diff] [blame] | 224 | </li> |
| 225 | <li> |
| 226 | The driver-independent parts of the LLVM / Gallium code are found in |
Brian Paul | d0b3535 | 2010-03-15 11:46:41 -0600 | [diff] [blame] | 227 | src/gallium/auxiliary/gallivm/. The filenames and function prefixes |
| 228 | need to be renamed from "lp_bld_" to something else though. |
Brian Paul | 0da2a22 | 2011-04-07 13:56:45 -0600 | [diff] [blame] | 229 | </li> |
| 230 | <li> |
| 231 | We use LLVM-C bindings for now. They are not documented, but follow the C++ |
José Fonseca | c5531f5 | 2009-08-21 10:57:48 +0100 | [diff] [blame] | 232 | interfaces very closely, and appear to be complete enough for code |
| 233 | generation. See |
José Fonseca | 68b696e | 2013-11-21 17:52:50 +0000 | [diff] [blame] | 234 | <a href="http://npcontemplation.blogspot.com/2008/06/secret-of-llvm-c-bindings.html"> |
| 235 | this stand-alone example</a>. See the llvm-c/Core.h file for reference. |
Brian Paul | 0da2a22 | 2011-04-07 13:56:45 -0600 | [diff] [blame] | 236 | </li> |
| 237 | </ul> |
Andreas Boll | ecd5c7c | 2012-06-12 09:05:03 +0200 | [diff] [blame] | 238 | |
José Fonseca | 68b696e | 2013-11-21 17:52:50 +0000 | [diff] [blame] | 239 | <h1 id="recommended_reading">Recommended Reading</h1> |
| 240 | |
| 241 | <ul> |
| 242 | <li> |
| 243 | <p>Rasterization</p> |
| 244 | <ul> |
| 245 | <li><a href="http://www.cs.unc.edu/~olano/papers/2dh-tri/">Triangle Scan Conversion using 2D Homogeneous Coordinates</a></li> |
| 246 | <li><a href="http://www.drdobbs.com/parallel/rasterization-on-larrabee/217200602">Rasterization on Larrabee</a> (<a href="http://devmaster.net/posts/2887/rasterization-on-larrabee">DevMaster copy</a>)</li> |
| 247 | <li><a href="http://devmaster.net/posts/6133/rasterization-using-half-space-functions">Rasterization using half-space functions</a></li> |
| 248 | <li><a href="http://devmaster.net/posts/6145/advanced-rasterization">Advanced Rasterization</a></li> |
| 249 | <li><a href="http://fgiesen.wordpress.com/2013/02/17/optimizing-sw-occlusion-culling-index/">Optimizing Software Occlusion Culling</a></li> |
| 250 | </ul> |
| 251 | </li> |
| 252 | <li> |
| 253 | <p>Texture sampling</p> |
| 254 | <ul> |
| 255 | <li><a href="http://chrishecker.com/Miscellaneous_Technical_Articles#Perspective_Texture_Mapping">Perspective Texture Mapping</a></li> |
| 256 | <li><a href="http://www.flipcode.com/archives/Texturing_As_In_Unreal.shtml">Texturing As In Unreal</a></li> |
| 257 | <li><a href="http://www.gamasutra.com/view/feature/3301/runtime_mipmap_filtering.php">Run-Time MIP-Map Filtering</a></li> |
| 258 | <li><a href="http://alt.3dcenter.org/artikel/2003/10-26_a_english.php">Will "brilinear" filtering persist?</a></li> |
| 259 | <li><a href="http://ixbtlabs.com/articles2/gffx/nv40-rx800-3.html">Trilinear filtering</a></li> |
| 260 | <li><a href="http://devmaster.net/posts/12785/texture-swizzling">Texture Swizzling</a></li> |
| 261 | </ul> |
| 262 | </li> |
| 263 | <li> |
| 264 | <p>SIMD</p> |
| 265 | <ul> |
| 266 | <li><a href="http://www.cdl.uni-saarland.de/projects/wfv/#header4">Whole-Function Vectorization</a></li> |
| 267 | </ul> |
| 268 | </li> |
| 269 | <li> |
| 270 | <p>Optimization</p> |
| 271 | <ul> |
| 272 | <li><a href="http://www.drdobbs.com/optimizing-pixomatic-for-modern-x86-proc/184405807">Optimizing Pixomatic For Modern x86 Processors</a></li> |
| 273 | <li><a href="http://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-optimization-manual.html">Intel 64 and IA-32 Architectures Optimization Reference Manual</a></li> |
| 274 | <li><a href="http://www.agner.org/optimize/">Software optimization resources</a></li> |
| 275 | <li><a href="http://software.intel.com/en-us/articles/intel-intrinsics-guide">Intel Intrinsics Guide</a><li> |
| 276 | </ul> |
| 277 | </li> |
| 278 | <li> |
| 279 | <p>LLVM</p> |
| 280 | <ul> |
| 281 | <li><a href="http://llvm.org/docs/LangRef.html">LLVM Language Reference Manual</a></li> |
| 282 | <li><a href="http://npcontemplation.blogspot.co.uk/2008/06/secret-of-llvm-c-bindings.html">The secret of LLVM C bindings</a></li> |
| 283 | </ul> |
| 284 | </li> |
| 285 | <li> |
José Fonseca | eb0892b | 2013-11-25 08:28:23 +0000 | [diff] [blame] | 286 | <p>General</p> |
José Fonseca | 68b696e | 2013-11-21 17:52:50 +0000 | [diff] [blame] | 287 | <ul> |
José Fonseca | eb0892b | 2013-11-25 08:28:23 +0000 | [diff] [blame] | 288 | <li><a href="http://fgiesen.wordpress.com/2011/07/09/a-trip-through-the-graphics-pipeline-2011-index/">A trip through the Graphics Pipeline</a></li> |
José Fonseca | 68b696e | 2013-11-21 17:52:50 +0000 | [diff] [blame] | 289 | <li><a href="http://msdn.microsoft.com/en-us/library/gg615082.aspx#architecture">WARP Architecture and Performance</a></li> |
| 290 | </ul> |
| 291 | </li> |
| 292 | </ul> |
| 293 | |
Andreas Boll | b5da52a | 2012-09-18 18:57:02 +0200 | [diff] [blame] | 294 | </div> |
Andreas Boll | ecd5c7c | 2012-06-12 09:05:03 +0200 | [diff] [blame] | 295 | </body> |
| 296 | </html> |