* Some CaptureAccess uses like enumerating GPUs happen before the replay thread
is running, in this case we can safely run on the UI thread as we know there
will be nothing to conflict with.
* We previously decided we'd normally access this only on the UI thread when
local, and only on the replay thread when remote (by neccessity), but some
actions like resolving symbols can be quite slow so we want to make sure these
are actually async and so we leave them on the replay thread so we can display
a proper UI spinner and leave the UI thread active.
* We always just hold one version of the bytecode, in the shader container
(possibly with an extra debug blob on D3D where that is necessary for DXBC).
* We also remove any attempt to fall back to the original shader blob if we have
debug search paths found and we get a debug replacement blob (mostly relevant
for Vulkan but legacy separate debug info on DXBC also does whole-blob
replacement). If the debug search paths change and we reload, but fail to find
a debug blob, we continue using the previous debug blob if we had one.
* Unclear why this was blocked on OS X clang as it clearly fires, but this means
this warning is no longer OS X only which makes iterating on normal machines easier.
* We could put everything onto the replay thread but that's unnecessary back-
and-forth pingponging for a local capture.
* This is safe to use on the UI thread if it's local, but if it's remote it uses
the same connection as the replay controller so must happen on the replay
thread.
* We add a new helper (not exposed to swig) that handles this check, and for
python we wrap the returned ICaptureAccess in an invoker that ensures we are
on one of those threads.
- Not from the current action
- This makes Prev/Next button behaviour consistent when a marker is selected
- For Next if the action has children go to the first child, otherwise the action's nextAction
- For Prev if the action has children go to the previousAction of the first child, otherwise the action's previousAction
- Change asserts to if's and errors to prevent crashes in GetGroupsharedSrc(), SetGroupsharedSrc()
- for gsm check for valid memory access using dataOffset and dataSize
- the existing check for elemIdx >= numElems is not enough i.e. 2D arrays