HScottH,
Brook+ provides double and scatter support which, to my knowledge, is not possible from a graphics API w/ pixel shaders. I'm not sure about geometry or vertex shaders, but why spend the time learning them when it is easier to just use pixel shaders. Brook+ does not have backends for OGL/DirectX, however, the original Brook works on DirectX and OpenGL, such that it works on more graphics cards than CUDA or CAL supports. Therefor if you use the core Brook+ language without using any of the AMD extensions that we implemented, then you can write code that works on many cards.
I mentioned double and scatter support, but there are many other aspects that you get when programming in Brook+/CAL that you don't get in OpenGL/DirectX. Things such as more resources dedicated to your process since CAL doesn't use Vertex Shaders or Geometry shaders, resources don't need to be allocated for them. You also get low level access to the graphics card via CAL where you can write screaming fast kernels. The current fastest matrix multiplication kernel that I know of is written in IL using CAL, getting 210+ gflops kernel performance on a HD3870. I don't think you are able to get that with a graphics interface and HLSL, or even on CUDA on an equivalent card.
Brook+/CAL also give you explicit control over memory and how it is allocated and used, which can be a boon or a bane, depending on how it is developed.
CAL also provides a utility library to use AMD HLSL, which is HLSL w/ extensions for our graphics card features such as double and scatter, so you can use your HLSL knowledge and the CAL layer without having to use IL or Brook+.
So we do provide methods of writing code that works on multiple graphic cards of many generations, but the extensions we provide cannot be utilized or the code will not work on older cards.
We try to provide all the layers of the software stack from high level down to ISA level depending on the needs of the application and the programmer. At every level most of the graphics aspects are hidden from the programmer to provide an easier to program interface.