Evaluation of the PowerStorm 350 (and 4D51T)

Started: June 2000, Last updated: March 2001


The following describes various "potential" bugs and experiences with the PowerStorm 350 drivers from Compaq. The tests are performed on an XP1000 (sometimes es40) running Tru64 version 4.0E (sometimes 4.0F). Comparisons are made between applications being developed inhouse and currently running on 4D51T cards in the same computer and TNT2 cards in PeeCee (Linux) machines.

Texture Performance

Just what performance improvement should I expect between the 4D51T and the PS350? From what I can tell for textured applications, there is very lttle difference (if any). While I have achieved significant improvements for glDrawPixels() calls, and, while I haven't timed it, I believe there are worthwhile improvements for raw geometry. However I don't seem to get much improvement for texture based models like the one shown below.

Frame rate on PowerStorm 4D51T ~ 21 frames per sec
Frame rate on PowerStorm 350 ~ 22 rames per second

Frame rate on PowerStorm 4D51T ~ 8 frames per sec
Frame rate on PowerStorm 350 ~ 8 frames per second

Note: I would put about a 1 or 2 frames per second variation on the above times. Both timings were performed in identially sized windows. All the textures are mipmapped and are typically around 64x64 to 256x256 in size. There are less than 5000 polygons in the whole model.
BTW: this is a model of our lab, the 64 machines on the right is our cluster.

/var/X11/Xserver.conf settings:

   -screen 1280x992 -I -riDefaultTexel32 -riFlipVSync

I would like to know why "-riDefaultTexel32" isn't the default! Almost all textures look bad if they get converted to 16 bit.

glEnable(GL_BLEND) and antialiasing

Demonstration source: example1.c
I appreciate that antialiasing isn't properly supported but it shouldn't ever degrade the image if it is on, for example, one has no control over precompiled binaries!

PowerStorm 4D51T

PowerStorm 350

Polygon anti-aliasing is typically performed with depth-sorted polygons (and depth-test disabled) and a blend function of (GL_SRC_ALPHA_SATURATE, GL_ONE) which requires a destination alpha buffer. (Destination alpha is not supported on PS350.) This method of polygon-aa is designed to avoid the artifacts you see in example1 at the seems of triangles. I expect that you'd see similar artifacts if you run example1 on other hardware that supports polygon antialiasing. I would try myself, but I surprisingly have *no* other boards at my disposal that support polygon-aa. 4D51T did not support polygon-aa at all, and so you just see the normal jaggies and no line through the quad. A program can check at run-time whether or not destination alpha is supported, and choose only to turn it on if alpha planes are present (ensuring attractive results).

FAR clipping plane weirdness

Demonstration source: example2.c

If the far cutting plane of gluPerspective() is set to a big number like 1e10, one has weird effects that look like a loss of depth testing. The parameter is supposed to be a double and certainly 1e10 isn't that big.

PowerStorm 4D51T

PowerStorm 350

1e10 =~ 2^33. This is slightly bigger than the 32-bit Z-buffer on the 4D51T, and *much* bigger than the 24-bit Z-buffer on the PS350. The size of the depth buffer can be queried at runtime, either via the GLX visual, or glGetIntegerv(GL_DEPTH_BITS, &dbits).
It turns out that the 4D51T used Z for the depth buffer while the PS350 uses W. W is linear through the depth buffer, Z is logarithmically bunched up toward the eye. Changing the depth buffer to Z using a undocumented/unsupported untested environment variable fixed the problem, the PS350 for the moment is stuck with a depth buffer based upon W and therefore linear!


Demonstration source: example3.c

There is something "strange" with glViewPort() or a related function when setting smaller viewports within a large one, eg: I use this for capturing high resolution versions of an OpenGL scene, see the snippet of code below which should give the idea.

      Set up the projection
      for (i=0;i<4;i++) {
         for (j=0;j<4;j++) {
            fprintf(stderr,"Frame (%d,%d)\n",i,j);
            Clear the left (and right) buffers
               -i * camera.screenwidth , -j * camera.screenheight,
                4 * camera.screenwidth ,  4 * camera.screenheight);
            Create the scene geometry and lighting
            Do a glReadBuffer(); glReadPixels();
            The pieces are stitched together later

For example, the following two images show the result from the 4D51T and from the 350. In the code example (example3.c) the right mouse menu provides three image dumping options. My experience is as follows, all image dumping modes work as expected on the 4D51T at screen/window resolutions up to 1280x1024. On the 350 a window of 400x300 the default) works, but full screen (example -f) fails at 1280x992. The program creates 1, 4, or 16 ppm files, sorry but you'll have to stitch them together yourself. However as the images are being saved they are displayed on the screen and it is easy to see thimgs are not working right, it would be even clearer if a more interesting piece of geometry is added to MakeGeometry(). Seems like a viewport resolution matter, I don't know if there are supposed to be any restrictions?!

PowerStorm 4D51T

PowerStorm 350

Example3 is technically another non-bug. According to the blue-book reference: "Viewport width and height are silently clamped to a range that depends on the implementation. To query this range, call glGet with argument GL_MAX_VIEWPORT_DIMS."
With that said, I don't think there is a reason why our current limit (3840x2048) isn't greater than it is. In fact, in support of 8-head PanoramiX capabilities, I was looking at increasing these numbers anyway. If all goes well, I should have these cranked up to 15360x9600 in the next beta kit. This should allow you to zoom in to your heart's content. You didn't have this problem on 4D51T because it must have the viewport max cranked up (probably arbitrarily).

Yes, the 4D51T has a maximum viewport of 65536 x 65536.
Tested OK in Beta4c-15Jun00.

Emitter light

The stereo emitter stays on, this is a different behavour to the 4D51T where the emitter comes on only when one enters stereo mode. I don't know how this might affect the life of the emitter?!

The emitter suppliers have informed us that there would be a negligible effect on the lifespan of the emitter by being left on.

Stereo pair movie player timings

The following timings are for glDrawPixels() calls. I'd be very interested in suggestions on how to get the highest glDrawPixels() performance, my stereo movie player is doing nothing else but writing 24 bit images to the left and right buffers using glDrawPixels().

            Mono     Stereo     Comments
4D51T       21.3      5.5        800x600 full screen
350         52.0     27.5        800x600 window      no   FlipVSync
350         22.1     11.0       1280x992 full screen no   FlipVSync
350         42.5     21.2        800x600 window      with FlipVSync
350         21.2     10.5       1280x992 full screen with FlipVSync

Playing digital movies in mono and stereo using my movie player with various compressors.

                                 no FlipVsync      with FlipVsync
                  4D51T          350                   350
               mono   stereo     mono              mono   stereo
 8 grey         17      4         36               28     14
 9 YCC          16      3         30               28     14
16 colour       16      4         31               28     10
24 colour       18      5         37               28     14

Projector details

Tested stereo resolutions on our 3 gun RGB projector, a NEC XG110LC with fast green phosphor installed.

1280 x 1024 @ 120HzFail
1280 x 1024 @ 110HzFail
1280 x 1024 @ 100HzSucceed
1280 x 992 @ 120HzFail
1280 x 992 @ 110HzFail
1280 x 992 @ 100HzSucceed
1152 x 864 @ 110HzSucceed
1152 x 864 @ 100HzSucceed
1024 x 768 @ 130HzSucceed
1024 x 768 @ 100HzSucceed

Monitor Details

Tested stereo resolutions on a Compaq P110 21 inch monitor. As it turns out, this is identical to the NEC projector above.

1280 x 1024 @ 120HzFail
1280 x 1024 @ 110HzFail
1280 x 1024 @ 100HzSucceed
1280 x 992 @ 120HzFail
1280 x 992 @ 110HzFail
1280 x 992 @ 100HzSucceed
1152 x 864 @ 110HzSucceed
1152 x 864 @ 100HzSucceed
1024 x 768 @ 130HzSucceed
1024 x 768 @ 100HzSucceed

QUAD strip bug

November 2000, OpenGL Beta7-- 06Sep00

Incorrect rendering when using QUAD_STRIPs. The screen shots below show the strange behaviour on the PS350 and expected behaviour on the 4D51T. The exact polygons that get clipped (not drawn) varies as the view changes with respect to the stripes. Note, the bands of different green shades are due to the glColour() routines intentionally moved outside the inner j loop.

Here's the source for the plane.


   /* Ground plane */
   for (i=-10;i<10;i++) {
      for (j=-10;j<=10;j++) {

State PS350 4D51T
Shaded, no lights
Shaded, lights
This has been fixed from v2.0 RC2 kit (ps3x0v20-rc2-V40EFG).

Latest digital movie timings

The mono and stereo precomputed movie frame rates for the PS350 on Alphix are given below. These all relate to when the movie is cached, so this is an indication of the processing/memory/bus/card/update peak performance.

Mode               9 bit image        24 bit image
----------         -----------        ------------
non-stereo          34/35 fps           43/44 fps
    stereo          15/16 fps           19/20 fps

Things to note

Determining stereo capabilities

While testing the drivers for Tru64V5, it was uncovered that the method of detecting stereo capability was faulty. I was using something like:

   if (!stereo)
      glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);

This is not the right way! glGetBooleanv() doesn't make sense until a visual has been created.

My suggestion would be first to call XGetVisualInfo to query the list of visuals and then to call glXGetConfig for each visual to check if the attribute GLX_STEREO is supported. Your mixed results with glGet is due to the fact that this GL call will return "undefined" results until you have chosen and made current to a GLX visual. Some cards will return true when undefined, others will return false. But this return value is completely unreliable and meaningless until you've chosen and created your visual using the GLX calls.

PS350 and 4D51T

Polygon clipping edges

When polygons are clipped to the bottom and left border of the view frustum they result in a visible edge running up the clipped edge. This doesn't happen on a variety of other OpenGL boards/drivers, eg: TNT and GeForce in Linux machines. It DOES happen with the current drivers for the 4D51T and PS350.


No border

This only "looks" ugly when using a single window but it is a serious problem for multiwall displays where the walls need to meet perfectly.

This has been fixed in "PTR 93-5-183". Evaluation drivers have been installed locally and I've demonstrated the problem no longer occurs on both the PS350 and 4D51T.


Missing line on right buffer

This rather serious bug would be easy to miss if one only ever dealt with projected images. It is more obvious if one uses buffer dumps for printing and is a disaster if one renders pieces to a larger viewport in order to create high resolution images or perform antialiasing.

See the one pixel black line at the bottom these right buffer images. The line is actually in the clear colour....so the buffer can be written to.

This may in fact be related to the last problem with an additional edge being added to wireframe objects, except that happens for both left and right eye buffers.

This does indeed seem to have been fixed along with the above patch.