Because ANGLE can only generate full HLSL programs after we known the signatures between the vertex and pixel stages, we can not immediately call the D3D compiler at GL shader compile time. Moreover, we can insert additional optimization code right at draw-time.
ESSL 1.00 shaders treat all vertex inputs as floating point. We insert a conversion routine to transform un-normalized integer vertex attributes in the shader preamble to floating point, saving CPU conversion time.
At draw-time, we also optimize out any unused render target outputs. This improved draw call performance significantly on lower spec and integrated devices. Changing render target setups may trigger a shader recompile at draw time.
ANGLE is not the only program to do this kind of draw-time optimization. A common complaint from application developers is that draw calls sometimes perform very slowly due to dynamic shader re-compilation. A future design direction for ANGLE, when targeting a more modern API, is to perform the vertex conversion in a separate shader pass, which would then be linked with another compiled shader.