The code was mostly doing the same thing, but stereo was being left behind as features were added to SetupIntermediateResourcesSingle. No longer!
There is some follow-up work to do. Not all targets being allocated respect RenderScale. And we could probably cache off our generated RenderTextureDescriptor.
Basically, something is going wrong with UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX or stereoTargetEyeIndex in stereo instancing. We can work around it by not calling it, because UNITY_SETUP_INSTANCE_ID sets up unity_StereoEyeIndex for us, if instancing is enabled.
Usually, in the stereo instancing path, we source unity_StereoEyeIndex from the fragment input structure's stereoTargetEyeIndex member. In fact, stereoTargetEyeIndex is needed as it is bound to the SV_RenderTargetArrayIndex semantic, which dictates which render target array slice is rasterized to.
However, for whatever reason, reading stereoTargetEyeIndex is not reliable in the fragment shader. However, if I use the raw instance ID passed into the fragment shader, that works correctly. More work probably needs to be done, but this is fine for now.
Because of stereo instancing issues with null source Blit, we can try using DrawProcedural.
Everything seems to work ok, except for some bizarre unity_StereoEyeIndex functionality inside of the fragment shader during instancing.
Our internal blit code does not want to bind all slices of a texture array if either the source of destination isn't a texture array. If we use a NULL source, then the engine won't bind all slices.
Even though we don't need a source, I can bind the screenspace shadow map texture in order to satisfy the engine. We need to fix the engine, or use another path in engine.
The screenspace shadow map generation still isn't quite working, but at least all slices are bound!