* APP_CMD_INIT_WINDOW can be called when the application hasn't fully
shutdown, and the thread is still running. Hold a lock while we're
inside renderdoccmd() so that we know if the thread has exited or not.
* This would be easier if android had pthread_tryjoin_np()...
* In some cases there was an unpredictable crash when starting a replay
loop, doing a full frame replay immediately after a previous replay.
There were no debug messages, and the debug layer fixed it - as did
enabling single flush validate. It seems to me some timing/overloading
issue, and doing this sync should be relatively harmless so we use
this to avoid the crash.
* Initially add support for spirv-cross and spirv-dis.
* When possible we'll auto-detect the tools in path or in the build's
plugins folder. Otherwise the user can add it and add their
executable path.
* We still use the first disassembler for editing - in future it would
be good to allow selecting the disassembler at edit time (as well
as allowing multiple compilers).
* This means that if the driver or some other layer reports messages,
we will save them in the capture for disable - even if the validation
layers aren't enabled.
* Includes GL 4.6.
* This fixes#842 due to previous GL headers having the incorrect
signature for glClearNamedFramebufferfi. This may also explain the
vendor check VendorCheck_NV_ClearNamedFramebufferfiBugs.
* On windows, the change in a global GIT_COMMIT_HASH define in each
project needing it meant a full rebuild every time the commit changed.
* Ideally we'd set the define only on one file in each project, but
MSBuild doesn't seem to support that. Instead we make a new tiny
project that compiles a single cpp exporting a global var, and
reference that global var in each other project.
* Mobile chips are lacking in features, particularly
vertexPipelineStoresAndAtomics which is needed to manually emulate
stream-out with shader patching.
* Instead we change to transform the vertex shader into a compute shader
and dispatch it to manually fetch the vertex inputs, run the original
shader, and store the resulting outputs.
* This is useful even if we don't faithfully replay fences, because it
suppresses warnings about them being missing, and includes their
creation info in the capture.
* This lets the editor update its internal tracking, so e.g. if a type
changes then it unregisters the old type and registers the new type.
Then any declarations after that point don't accidentally duplicate
due to stale internal data.
* We use templates to reduce copy-paste between the different types
since it's the same operation of "look up a map, if not found then
declare and add to map", just with a different typed map.