I don't think I can review 4/5 without understanding why that code is there in the first place. It was introduced by a7c320d184fb, which didn't provide a reason. I'd assume that there's a Vulkan-like "all GPU commands have to be done before destroying an object" requirement, but a quick (too quick?) reading of ARB_sync (specifically § D.2.1) implies that's specifically not the case here. And that doesn't explain the glFinish() added in 3cc8147594de either. Why do we need that?
Wrt 5/5, I think that reducing the complexity of multiple contexts is a good idea (and worth the risk if it fixes bugs—do we ), but I also don't know if there are any reasons to reject it besides "churn and/or risk of regressions". From private conversation, I got the impression there's no real reason [performance advantage or anything else?] to use multiple contexts, and that it was just done because it was somehow the easiest thing to do at the time?
(Also, is it possible to split out wined3d_swapchain_gl_get_backup_dc() -> wined3d_device_gl_get_backup_dc() into a separate change?)