I did exstensive research into this area and consider myself as quiet an expert at graphics programming mainly for my ASM experties so as you can guess I have written a few software renderers in my time.
Here is your quote:
"you can't beat the speed of hardware period. Use the blitter."
Very true but what happens if there is no hardware accleration or limited capabilities!!!
Not all graphics cards support all the latest accelerartion techniques even my computer, not even a year old does not support any form of video to system or system to video aceleration!
Now I know that the Microsoft documentation on Direct Draw hardware accleration usage is a little vague in this area so I will try and make things more clear.
DDCAPS_BLT
Hardware blitting supported Video To Video only!!!
DDCAPS_CANBLTSYSMEM
System to Video and Video to System blits using DMA. This may require the use of PageLock and PageUnlock to use the hardware acceleration
DDCAPS2_NOPAGELOCKREQUIRED
if DDCAPS_CANBLTSYSMEM then no page lock is required for hardware acceleration
DDCAPS2_NONLOCALVIDMEM
AGP non local video memory support make sure your surfaces are created using the non local video memory flag when calling CreateSurface. Non local video memory is an area in system ram treated like video ram.
DDCAPS2_NONLOCALVIDMEMCAPS
The blitting capabilities to non local video memory are not the same as video to video check dwNLVBCaps & dwNLVBCaps2
So in conclusion for a well designed game you have to anticipate a veriaty of hardware config's and write a number of update/rendering routines optimised for to use what hardware acceleration is avaliable and there are a hundred ways that can be writen. This can be seen with 3D games when they have different renderers for Glide, OpenGL, D3D, and Software.
Phillip stiby
============================
Technical Manager Coull Ltd.
PS So the better quote to use is
Use hardware were avliable you can't out code it, but if it's not avaliable a piece of well designed personalised code is a lot faster then an all round blitter like IDirectDrawSurface::Blt()!