I have implemented it, but there is a problem. If I enable the optimization, EXT_separate_shader_objects must be disabled. Is it okay with you? This is a valid sequence with EXT_sso: glUseProgram(prog_with_vs_and_fs); glUseShaderProgramEXT(prog_with_fs); prog_with_vs_and_fs cannot be optimized, because the program object can be bound partially (in this case only the vertex shader from the program object is bound). ARB_separate_shader_objects doesn't have this issue.