* 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.
* In many cases (particularly on D3D11/D3D12) the replay would simply
forward functions as-is to the debug manager for implementation. This
meant that change any of those function signatures required more
tedious copy-pasting than was necessary, and didn't make much sense.
* Now the replay class is responsible for implementing all the
functionality and owns any debug-only API resources, but can still use
the debug manager for any indirect utility functions like caching,
etc.
* The API resources are better organised by task in the replay class
rather than being all over the place.
* Finally on vulkan, added some helper functions to reduce the
boilerplate involved in initialising objects.
* We want to be able to declare a 'name' of a resource and then fetch it
later. To do this we create a tiny little reference (either an int on
windows, or a pointer+length elsewhere), then actually fetch the data
later.
* Added to the vulkan loader after 1.0.65, this lets us intercept the
enumeration of instance extensions (before our layer is actually
initialised) so that we can filter out unsupported extensions.