The GL_ARB_separate_program_objects extensions allows for using different shaders for different stages, similar to Microsoft's Direct3D, NVIDIA Cg, and older versions of OpenGL. For a more thorough explanation, the OpenGL registry specification explains:
Conventional GLSL requires multiple shader stages (vertex, fragment, geometry, tessellation control, and tessellation evaluation) to be linked into a single monolithic program object to specify a GLSL shader for each stage.The Mesa support for separate OpenGL shader program objects come in the form of 12 patches and currently reside on the Mesa mailing list. This support comes for both the classic Intel Mesa driver as well as the Gallium3D drivers.
While GLSL's monolithic approach has some advantages for optimizing shaders as a unit that span multiple stages, all existing GPU hardware supports the more flexible mix-and-match approach.
Shaders written for HLSL9, Cg, the prior OpenGL assembly program extensions, and game console favor a more flexible "mix-and-match" approach to specifying shaders independently for these different shader stages. Many developers build their shader content around the mix-and-match approach where they can use a single vertex shader with multiple fragment shaders (or vice versa).
This extension adopts a "mix-and-match" shader stage model for GLSL allowing multiple different GLSL program objects to be bound at once each to an individual rendering pipeline stage independently of other stage bindings. This allows program objects to contain only the shader stages that best suit the applications needs.