* We now track the values in a simple array so getting value IDs amounts to just
getting an index in this array. This avoids the need to iterate in an llvm-
identical way to enumerate values. That does mean that we need to insert new
values into the array in the correct order, which isn't too bad.
* We cheat slightly with the attributes - we combine these on load, so we lose
information about multiple groups they may reference. So we save the groups
that we read from and use that to write the attribute.
* If we hit a fatal error during initialisation, the structured file pointer
still points at the temporary serialiser's structured file. It's not until we
finish loading that we swap it into the driver-stored file that we can safely
return and detach ownership of.
* Unfortunately there isn't an easy registry key to check to see if the
2015-2019 redist that we need is installed. Instead we need to check the
major/minor version to see if it's at least 14.20.
* This is complicated by the fact that windows installer returns DWORD registry
values with an extra # but provides no built-in way to strip it so it can be
compared numerically. The solution we've used here is a custom vbscript
action, but apparently they are problematic. Worst case I believe this will
try to install the runtime when not necessary, which might require an
unnecessary reboot. Or alternatively it may misdetect the runtime as installed
but the large majority of people have a compatible redist so this isn't too
bad either.
* In the old codepath for a valid existing window we'd create a cloned DC and
use that to pop with. However that DC is then released so we have created the
'stale DC' situation. This can cause problems with subsequent context
activations when we try to push/pop to populate GL hooks and fail to pop
properly as the queried DC is invalid.
* If we save the current capture from a connection window we want to do that via
the main window so the UI can be properly updated and so we can save it
properly through the replay manager, so the old one can be removed safely.
* Normally we only check mapped memory when it's referenced during capture by
some binding, but for BDA we don't have bindings so we have to conservatively
check it every time.
* When using VS In we want to ignore the W component, but that already happens
explicitly for vulkan/GL in the shader. Mirror that same solution to D3D
instead of trying to force a 3-component format which may not be supported
(e.g. on AMD R16G16B16_*)
* This is possible when capturing a program that uses experimental feature to
allow unhashed shaders. We don't replay this so it would fail. We could enable
the feature, but this is just as easy and means it works even when
""development mode"" isn't enabled.
* We never want to inherit these, and e.g. Qt process launches are hardcoded to
always inherit handles so these need to be excluded so files don't stay open.
- Ensure there is space for the Stream Out counters at the beginning of the SO buffer
- Fix use-after-Unmap of the SO statistics data
- Reset the state correctly after syncing every 1000 instances
- Unmap the SO buffer when no output instances are found