* blocking send/recv will not be resumed after a signal handler no matter what,
so we need to retry ourselves. This does mean extending the timeout but that's
fine since it would be pathological to have EINTR continually arrive and
extend the timeout to an unreasonable duration.
* Visual assist comes with a pre-defined interpretation of TEST() for
googletest, which conflicts with ours. We can't seem to override it with a
va_stdafx.h even
* In particular make it clear that crashes caught in the injected program may or
may not be a RenderDoc bug. Even if we could point the finger to a particular
DLL we can't necessarily tie that DLL to the responsibility of either us or
the application.
* We also make sure that if we go back to a previous event to debug, that we
look up the right output corresponding to where it's bound there (since it
might be bound to a different slot).
* EGL emulators are not sufficiently stable to run RenderDoc, so we want to be
able to fall back to EXT_create_context_es2_profile unless the libEGL.dll is
explicitly placed in our plugin path.
* When we replace a shader in GL there are a few knock-ons: we need to replace
the programs that use this shader, and then from there we need to replace the
pipelines that use the program. We also need to beware of programs created
with glCreateShaderProgramv which refer to themselves as both a program and a
shader.
* Previously we'd look at the edited shader, then recurse and look at programs,
then recurse and look at pipelines. We'd try to remember which one replaced
which so we could undo it again.
* Now we just do this in subsequent passes since there is only a one-way
dependency: First replace the shader as needed, then update any programs and
either replace or remove replacement as needed, and finally update any
pipelines.
* On Vulkan and D3D12 it's simpler as we just have shaders -> pipelines but the
same principle applies.