* 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 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.
* This helps with type checkers to know that things can be None or not (both to
silence previous warnings about "unnecessary" checks that are actually
necessary, and to ensure those checks aren't omitted by accident)
* The worst one was Persistant -> Persistent. This involved renaming
PersistentConfig but the impact of that is considered minimal enough to be
worth fixing.
* We enforce default and copy constructors where possible, this isn't very
pythonic but we can't use copy.deepcopy on our types.
* The structs that have specialised constructors e.g. FloatVector or Subresource
also have those documented though we have no way to enforce it.
* Python can't properly document fully independent overloads, only default-
parameter type overloads. Moving the tag to last as an optional parameter
means we can eliminate the different variants.
* For cleanliness in C++ code we make an internal variant that swaps the
parameters, since it is much cleaner to have a lambda callback as the last
parameter.
* This is necessary as they expect to be run on the UI thread, but can be
fetched from python scripts running on the python script thread. We block
invoke over to the UI and suspend python's GIL to avoid deadlocks.
* This doesn't cover all cases but helps with 'pythonic' cases where a list
returned from a function should be expected to be mutable. Modifying direct
'members' can still modify through const.
* In a previous update in 2021 many copyright ranges were truncated
accidentally, and some files have been copy-pasted with wrong years. These
dates have been fixed based on git history and original copyright messages.