<HTML> <TITLE>Cell Driver</TITLE> <link rel="stylesheet" type="text/css" href="mesa.css"></head> <BODY> <H1>Mesa/Gallium Cell Driver</H1> <p> The Mesa <a href="http://en.wikipedia.org/wiki/Cell_%28microprocessor%29" target="_parent">Cell</a> driver is part of the <a href="http://www.tungstengraphics.com/wiki/index.php/Gallium3D" target="_parent">Gallium3D</a> architecture. </p> <p> <a href="http://www.tungstengraphics.com/" target="_parent">Tungsten Graphics</a> is leading the project. Two phases are planned. First, to implement the framework for parallel rasterization using the Cell SPEs, including texture mapping. Second, to implement a full-featured OpenGL driver with support for GLSL, etc. The second phase is now underway. </p> <H2>Source Code</H2> <p> The latest Cell driver source code is on the <code>gallium-0.2</code> branch of the Mesa git repository. After you've cloned the repository, check out the branch with: </p> <pre> git-checkout -b gallium-0.2 origin/gallium-0.2 </pre> <p> To build the driver you'll need the IBM Cell SDK (version 2.1 or 3.0). To use the driver you'll need a Cell system, such as a PS3 running Linux, or the Cell Simulator (untested, though). </p> <p> If using Cell SDK 2.1, see the configs/linux-cell file for some special changes. </p> <p> To compile the code, run <code>make linux-cell</code>. To build in debug mode, run <code>make linux-cell-debug</code>. </p> <p> To use the library, make sure <code>LD_LIBRARY_PATH</code> points the Mesa/lib/ directory that contains <code>libGL.so</code>. </p> <p> Verify that the Cell driver is being used by running <code>glxinfo</code> and looking for: <pre> OpenGL renderer string: Gallium 0.2, Cell on Xlib </pre> <H2>Driver Implementation Summary</H2> <p> Rasterization is parallelized across the SPUs in a tiled-based manner. Batches of transformed triangles are sent to the SPUs (actually, pulled by from main memory by the SPUs). Each SPU loops over a set of 32x32-pixel screen tiles, rendering the triangles into each tile. Because of the limited SPU memory, framebuffer tiles are paged in/out of SPU local store as needed. Similarly, textures are tiled and brought into local store as needed. </p> <H2>Status</H2> <p> As of October 2008, the driver runs quite a few OpenGL demos. Features that work include: </p> <ul> <li>Point/line/triangle rendering, glDrawPixels <li>2D, NPOT and cube texture maps with nearest/linear/mipmap filtering <li>Dynamic SPU code generation for fragment shaders, but not complete <li>Dynamic SPU code generation for fragment ops (blend, Z-test, etc), but not complete <li>Dynamic PPU/PPC code generation for vertex shaders, but not complete </ul> <p> Performance has recently improved with the addition of PPC code generation for vertex shaders, but the code quality isn't too great yet. </p> <p> Another bottleneck is SwapBuffers. It may be the limiting factor for many simple GL tests. </p> <H2>Debug Options</H2> <p> The CELL_DEBUG env var can be set to a comma-separated list of one or more of the following debug options: </p> <ul> <li><b>checker</b> - use a different background clear color for each SPU. This lets you see which SPU is rendering which screen tiles. <li><b>sync</b> - wait/synchronize after each DMA transfer <li><b>asm</b> - print generated SPU assembly code to stdout <li><b>fragops</b> - emit fragment ops debug messages <li><b>fragopfallback</b> - don't use codegen for fragment ops <li><b>cmd</b> - print SPU commands as their received <li><b>cache</b> - print texture cache statistics when program exits </ul> <p> Note that some of these options may only work for linux-cell-debug builds. </p> <p> If the GALLIUM_NOPPC env var is set, PPC code generation will not be used and vertex shaders will be run with the TGSI interpreter. </p> <p> If the GALLIUM_NOCELL env var is set, the softpipe driver will be used intead of the Cell driver. This is useful for comparison/validation. </p> <H2>Contributing</H2> <p> If you're interested in contributing to the effort, familiarize yourself with the code, join the <a href="lists.html">mesa3d-dev mailing list</a>, and describe what you'd like to do. </p> </BODY> </HTML>