I agree with removing the width and height params and handling the checks from inside device_init itself. I'll put it accordingly.
You can move the DDSCAPS_3DDEVICE check from d3drm1_CreateDeviceFromSurface into device_init as well, that way you don't need to fetch the surface description twice.
This could still lead to a redundant check for DDSCAPS_3DDEVICE in the case of CreateDeviceFromClipper, as we're creating the surface internally so we know that this flag will be set always. Is this overhead acceptable? If yes then I have no problem in shifting the check there.