Eventually hardware abstraction layers (HAL) such as DirectX were developed which separate application software from the underlying hardware. The application software does not need to know anything about the hardware on which it was to be used. Instead it discovers the capabilities of the hardware through the standardized abstraction layer, and then use abstracted commands to control the hardware. It is up to the HAL to be able to translate these commands into the specific format required for each device, using device drivers typically provided by the hardware manufacturer.