This library implements parts of the OpenGL 3.1 core profile specification for the PlayStation 3's RSX GPU. It's suitable for use in programs that have exclusive access to the RSX, such as GameOS software (and is likely unsuitable for implementing a multitasking desktop, as the library
doesn't arbitrate access to the RSX).
Please see the STATUS file for up-to-date information about the current capabilities of this library.
Briefly, the following OpenGL 3.1 features haven't been implemented yet (the RSX is capable of supporting most of them):
Full GLSL support. Currently, GLSL and Cg shaders can be compiled offline and used with a OpenGL ES 2 style API.
Instanced draw commands.
Framebuffer objects and multiple render targets.
A variety of capabilities related to texture maps (rectangular and cube textures, the behavior of glPixelStore, copying from the framebuffer, mipmap generation, and texture formats, including compressed formats, that require conversion and/or swizzling).
Client-side vertex array data. OpenGL 3.1's core profile specifically omits this, but it is specified by OpenGL ES 2 (as well as the OpenGL 3 compatibility profile), and is likely still widely used, particularly by smaller demonstration programs.
Application object namespaces (another feature omitted by OpenGL 3.1, but used by earlier specs).
Most glGet*() functions haven't been implemented. Some specified behavior of glEnable()/glDisable() likely needs to be implemented as well.
Further details follow:
FULL GLSL SUPPORT
This is admittedly a large area of missing capability. Currently you can compile GLSL (and Cg) programs offline using NVIDIA's cgc compiler, and use them in an OpenGL program via an API that resembles the OpenGL ES 2 API - glShaderBinary() is used to load shader objects, and exactly two such shader objects (a vertex program and a fragment program) can be linked together by glLinkProgram().
This project certainly hopes to extend its implementation of GLSL further.
Intel contributed a standalone GLSL compiler to Mesa which can emit two intermediate representations that maybe could be translated to the NVIDIA microcode used by the RSX (maybe this compiler does this already; I haven't looked in a few months). Perhaps this compiler could be made to run from within a PS3 program.
Another longer avenue would be to explore writing an NVIDIA microcode backend for the LLVM compiler (my own brief investigation of this suggests that this might be hard, as LLVM possibly requires that its targets model some sort of heap, which the NVIDIA cards don't do).
There are opportunities to creatively implement other, recent OpenGL features. Uniform buffer objects could be supported, since both the vertex and fragment stages of the RSX can fetch from floating point textures. Transform feedback might be implemented by having the GLSL compiler factor out the program paths that compute vertices and generate a separate "fragment" program that renders to a buffer. Newer pipeline stages, like tesselation and geometry programs, could possibly be executed on the PS3's SPU's.
The RSX can directly read from a handful of texture formats, but the OpenGL spec calls for many more besides. RSXGL currently implements only those formats whereby image data can simply be copied to the RSX's memory; other formats will require pixel-by-pixel type conversion and swizzling. The Mesa library appears to be able to perform many of these conversions.
STREAMING, SYNCHRONIZATION, CACHING
Right now, RSXGL takes a conservative approach to handling data that streams to the GPU - if an application wants to write to an area of memory that the GPU is using, then the application will wait for the GPU to finish.
This library will implement other strategies. OpenGL specifies a few ways for an application to request synchronization behavior, but
affords implementations a wide latitude for interpreting such requests. Data stores might be partially or fully double-buffered, temporarily or for the entire lifetime of the memory area. Additionally, the PS3 itself makes two equally-sized memory areas available to the RSX, with different transfer speeds in each direction.
RSXGL takes a similarly greedy approach the flushing the GPU's vertex and texture caches - it does this every time a new glDraw*() command is sent by the application. The library will instead use the information it has available to it to determine if these caches really
ought to be flushed or not before drawing.
COMMAND BUFFER FLUSHING
RSXGL performs the equivalent of a glFlush() when the framebuffer is flipped, and when the application needs to wait for the GPU to finish with a buffer before modifying its contents (in addition to the occasions when flushing is explicitly called for by a GL function
I've noticed that whan a large-ish number of glDraw*() commands (on the order of several thousand) are submitted per frame without any additional flushing that performance degrades considerably. This particularly is the case if program uniform variables (such as an object's transformation matrix) are modified prior to each draw call. Therefore it's currently a good idea for the application to call glFlush() frequently.
Obviously this needs to be handled more transparently by the library itself, but I'm undecided as to a flushing policy - should it happen every draw call, or per a certain number of draw calls, or should it happen based upon the number of vertices being drawn, or the current size of the command buffer? (You can be assured that this will be an application-tunable setting.
I'm unclear as to how expensive an operation glFlush() is - it involves a small write by the PPU to the RSX's control register, allegedly a fast operation (reading from RSX memory by the PPU is not fast), but beyond that I don't know.
I haven't either tried to observe what happens when the command buffer's capacity is exceeded before the framebuffer is flipped (the libEGL implementation creates a command buffer with the capcity for 524288 commands, which is set in rsxgl_config.h and can be overriden at runtime by calling rsxeglInit() before initializing EGL).
CLIENT VERTEX ARRAYS
The OpenGL ES 2 profile, as well as OpenGL profiles prior to version 3.1, allow an application to specify vertex data from the system's main memory, without specifically asking the library to create a buffer of some predetermined size. This usually requires the library
to implement some strategies to migrate client-side memory to the GPU, and there are likely many ways to try to perform this efficiently.
OpenGL 3.1 requires applications to create buffer objects for any vertex data (though not for index buffers; these can still be migrated
from client memory). This makes life easier for the library implementor, and is one reason why RSXGL implements GL 3.1 and not GL ES 2 (it also helps keep the data structures that the library allocates small).
Nonetheless, many existing programs depend upon the older spec, so it'd be good to support this in RSXGL (even if it's not super-efficient at first). Since supporting this older capability can potentially bloat RSXGL's data structures, this will likely be an
option specified when the library is configured.
Since client memory can be mapped into the RSX's address space, there will also be capability, implemented in the style of an OpenGL extension, for the application to promise that the client pointers submitted via glVertexArrayPointer are so mapped, eliminating a memcpy.
OpenGL 3.1 requires that applications call glGen*() functions to create the names for objects that get created. ES 2 and previous GL
versions made this optional, allowing the application to come up with any unsigned integers it wanted to name objects with. This change was another reason to implement OpenGL 3.1, because it allows for a faster pool-style allocation of object data structures instead of potentially requiring a costly data structure like an associative map.
The older behavior will be supported as a configure option, too, for compatibility with existing programs.
I'm interested in porting the [OpenGL Samples Pack] (http://www.g-truc.net/project-0026.html). They are small demonstration programs that are helpfully organized by the OpenGL profiles that they support.
RSXGL uses the GNU autotools for its build system and is distributed with a configure script. It requires the following projects:
NVIDIA's cgc shader compiler, from the Cg toolkit, is also required to use vertex and fragment GPU programs.
The RSXGL library depends upon a toolchain that can generate binaries for the PS3's PPU, and also upon parts of the PSL1GHT SDK. The sample programs also require a few ported libraries, such as libpng, which are provided by the ps3toolchain project. ps3toolchain recommends setting two environment variables to locate these dependencies:
RSXGL's configure script will use these environment variables if they're set; if they aren't set, by default the script uses the above settings. The PORTLIBS environment variable may also be set to further control were the ported libraries can be found.
Anyway if these variables are set reasonably, then the following commands should build RSXGL and its samples:
(Sample programs are packaged into NPDRM packages, but those packages remain in their build locations; they don't get moved anywhere relative to RSXGL's install path).
By default, configure will create non-debug builds with low optimization settings (-O1). Other options are:
The configure expects to find versions of the gcc, g++, ar, ranlib, and ld programs that target the PS3's PPU. It tries to find these in $PS3DEV/ppu/bin, but the following environment variables can be set to provide full paths to these programs to the configure script:
PPU_CC Location of C compiler
PPU_CXX Location of C++ compiler
PPU_AR Location of the ar archive utility
PPU_RANLIB Location of the ranlib utility
PPU_LD Location of the ld linker
The following environment variables can also be set to further influence how headers and libraries are located:
src/samples/rsxgltest - A very simple test program whose contents and behavior will vary. This program is mainly used to try out various features of the library as they are developed.
src/samples/rsxglgears - A port of an old chestnut, the "glgears" program that uses OpenGL to render some spinning gears. This port is based upon a version included in the Mesa library, which was itself a port to OpenGL ES 2 after being handed down throughout the ages.
The sample can print debugging information over TCP, in the manner of PSL1GHT's network/debugtest sample. src/samples/rsxgltest/main.c has symbols called TEST_IP and TESTPORT which specify the IP address and port number to try to connect to, and you can use "nc -l portnum" to receive messages.
x glMapBuffer* should block if an operation on the buffer is still pending.
Less conservative approach to buffer mapping & GPU cache invalidation.
(Finish) object "orphaning" (Programs orphanable, Disposal of orphaned objects)
implement glCopyTexImage*() and glCopyTexSubImage*()
implement the effects of glPixelStore
Support for GLES2-style client vertex data.
Support for GLES2-style application object namespaces.
Implement glGet*() functions.
More GLSL support.
Make it possible to work with non-EGL configured display.
Move object storage from globals to context.
Support multiple contexts with shared objects.
__restrict keyword where appropriate.
x Add libstdc++.a to libGL.a, so that client code doesn't need to use g++ to link.
Flushing and orphan cleanup policy
Vertex program textures
Stay tuned for more PS3 Hacks and PS3 CFW news, follow us on Twitter and be sure to drop by the PS3 Hacks and PS3 Custom Firmware Forums for the latest PlayStation 3 scene updates and homebrew releases!
Please pardon my ignorance here, but would this allow allow for improvements to the existing emulators & possibly new ones incl N64, PS1/PS2, Dreamcast, Sega Saturn etc and perhaps more sophisticated & graphically complex homebrew..?
Would it also enable HW acceleration of HD video playback..?
There are also some more info's about the GPU, which I like to post to this article.
The RSX is a graphical processor unit (GPU) based off of the nVidia 7800GTX graphics processor, and is a G70/G71 hybrid with some modifications. The RSX has separate vertex and pixel shader pipelines.
The following is a small sample of serial numbers of the RSX by model number.
The following are relevant facts about the RSX
8 vertex shaders at 500Mhz
28 pixel shaders (4 redundant, 24 active) at 550Mhz
28 texture units (4 redundant, 24 active)
8 Raster Operations Pipeline units (ROPs)
Includes 256MB GDDR3 650Mhz clocked graphics memory
Earlier PS3 Models: Samsung K4J52324QC-SC14 rated at 700Mhz
Later PS3 Models: Qimonda HYB18H512322AF-14
GDDR3 Memory interface bus width: 128bit
Rambus XDR Memory interface bus width: 56bit out of 64bit (serial)
More features are revealed in the following chart delineating the differences between the RSX and the nVidia 7800 GTX.
Other RSX features/differences include:
More shader instructions
[LIST] Extra texture lookup logic (helps RSX transport data from XDR)
Fast vector normalize
Note that the cache (Post Transform and Lighting Vertext Cache) is located between the vector shader and the triangle setup.
A sample flow of data inside the RSX would see them first processed by 8 vertex shaders. The output are then sent to the 24 active pixel shaders, which can involve the 24 active texture units. Finally, the data is passed to the 8 Raster Operation Pipeline units (ROPs), and on out to the GDDR3. Note that the pixel shaders are grouped into groups of four (called Quads). There are 7 Quads, with 1 redundant, leaving 6 Quads active, which provides us with the 24 active pixel shaders listed above (6 times 4 equals 24). Since each Quad has 96kB of L1 and L2 cache, the total RSX texture cache is 576kB. General RSX features include 2x and 4x hardware anti-aliasing, and support for Shader Model 3.0.
Although the RSX has 256MB of GDDR3 RAM, not all of it is useable. The last 4MB is reserved for keeping track of the RSX internal state and issued commands. The 4MB of GPU Data contains RAMIN, RAMHT, RAMFC, DMA Objects, Graphic Objects, and the Graphic Context. The following is a breakdown of the address within 256MB of the RSX.
The RSX is dedicated to 3D graphics, and developers are able to use different API libraries to access its features. The easiest way is to use high level PSGL, which is basicially OpenGL|ES with programmable pipeline added in. At a lower level developers can use LibGCM, which is an API that talks to the RSX at a lower level. PSGL is actually implemented on top of LibGCM. For the advanced programmer, you can program the RSX by sending commands to it directly using C or assembly. This can be done by setting up commands (via FIFO Context) and DMA Objects and issuing them to the RSX via DMA calls.
Upgrading the PS3 is theoretically possible of course but it really wouldn't be viable at all. Not only would be it overcomplicated and cost too much to make sense but it just wouldn't be worth doing considering realistically the old hardware would only be a tiny fraction of the processing power necessary.
That's also ignoring the fact that the old hardware isn't going to last that long. It'd be dandy if all of the PS3s lasted 20 years but the fact is a lot of them broke down after 2, which is partially because the average Joe doesn't know that it is essentially a computer that needs maintenance... the dust needs to be cleaned out, the original thermal compound needs to be replaced, you can't throw it in a volcano and still expect it to work, etc. That aside it's upsetting and actually disturbing to see how much Sony stinged out on quality.
They practically used mud for thermal paste, the heatsink's finish actually greatly interferes with contact (oddly enough) and the heatsink itself might as well have been replaced with a rock... it's made of extremely low quality material. I'm not sure about modern PS3s but the fat ones I've seen the inside of didn't even use solid state capacitors, they used the "1 cent for 20 billion" electrolytic capacitors made in Taiwan which are notorious for having massive amounts of batches in the 2000s which literally blew up after a few months of use. I personally experienced that with several motherboards.
What I've always hoped for is that the next generation of consoles would stop using alien mumbo jumbo and switch to a standard x86-64 architecture for the purpose of interfacing with a standard PC to use that as an "upgrade". That way those who don't care about graphics can have their 720p at 30 frames and be happy about it and those of us who do care can use the PCs we likely already have.
yeah i agree i think the ps4 should be released by mid 2012 myself.what would be nice is if you can get a plug in upgrade/adapter for ps3 to make it more powerful.. but i'm not sure if its possible.. i remember seeing something about it being patented by sony here 3 or 4 months ago.. would be good as i have a few 60gig consoles to sell.. LOL
i agree totally also mate but last time i said ps3 was outdated etc i got flamed at.. LOL