I know I already had a thread on this, but this version is much different.
It comes in your favorite .compositor format

Off:

On:

Off:

On:

Off:

On:

The SSAO buffer itself:


Implementation details:
The compositor uses a 64-bit surface (FLOAT16_RGBA) to store depth / farClipDistance and XYZ normals. You can also only store XY and compute Z, but the computation of Z will be too heavy for the blur shaders, so I figured an exta 16 bits won't hurt. This geometry buffer is rendered after the "previous" scene has been pulled in, then the raw 1/2 resolution SSAO buffer is computed using 6 samples per pixel, then the full-resolution X gaussian blur buffer is computed, and then the full-resolution Y gaussian blur buffer is computed. After that, a simple "modulate" material is used to modulate the previous scene contents with the now blurred SSAO buffer.
The "smart" blur is done using a simple dot product between the original normal and the new pixels' normal. If it's over 0.9, then the pixel is accepted - otherwise, it is rejected.
The compositor does need a small CompositorInstance::Listener, but you can easily fine it in main.cpp, "ssaoListener". It simply passes some custom matrices to the SSAO shader to get rid of shader-side instructions. This allows the SSAO shader to run under pixel shader 2.b, it does not require 3.0.
The demo also features a slightly modified version of my previous shadows code.
The demo runs under both Direct3D and OpenGL. It was compiled with MinGW. See data/config.ini for some settings. If it runs slow, chances are that it's not the SSAO that is the trouble, but either the large amount of objects (non-instanced), or the rather brute-force blurs.
This was only tested on my 8800GTS so far (excellent frame rates), so I do not guarentee that it will run on anything else - but, it really should

Compiled demo + source mirrors:
mirror0: http://willhostforfood.com/files4/5429919/ssao_demo.7z
mirror1: http://www.MegaShare.com/591606
mirror2: http://rapidshare.com/files/216761501/ssao_demo.7z.html
Controls: WASD for movement, mouse for mouse look, 'L' to place a light at the current camera position, F1 to toggle SSAO compositor on/off, and printscr to make a screen shot.
If you integrate this compositor into your own application, make sure you adjust the units and stuff. Look in ssao.cg, find the "zd" variable inside the loop. When this is calculated, you may want to scale it up or down by a certain coefficient depending on how big or small your world units are (the demo uses meters).