* Not doing this could taint the state and even cause invalid read-write
conflicts to change bindings vs. what should happen, if a RT is left
bound when it shouldn't, and then an SRV is bound as NULL because it
would conflict.
* Intel's drivers in particular seem buggy when trying to reflect
shaders, so there's no point in reflecting shaders that aren't from
the capture as all we do is add the potential for crashes.
* VULKAN_LAYER_FOLDER points outside the prefix to /etc in absolute, so
usually if you customise one you'll want to customise the other.
* This is especially true if you're pointing the install prefix at some
non-root location, and you want make install to succeed instead of
failing to write to /etc.
* If there's a variable which is unused and has no binding declared, it
will be sorted to the end of the list and given a binding of 0. We
don't want to let this override a valid binding for 0, so make sure we
prioritise any variable which is marked as used over one that is
unused.
Before this, when binding multiple sets that use dynamic offsets, the
wrong offsets would be stored for all sets other than the first. This
caused the wrong offsets to be used when replaying individual draws.
* We need the dispatch thread dimension to be valid when creating the
shader reflection data, which may happen before we've disassembled the
bytecode.
* We do a minimal pass just to skip to that opcode and extract the dims.
* Searching down from the end for the next lowest event causes us to
sometimes replay backwards when a marker is selected (and has no
event in the array to replay directly). This can crash on vulkan, and
is unintuitive/wrong on other APIs. Instead we follow the behaviour
that we have elsewhere so that when a marker is selected we move
_forward_ in the frame to select the next event after it.
* Checking the history there doesn't seem to be any strong reason for
this direction of search.
* If we don't consistently use wrapped resources then we could get false
negatives.
* For example, views always constructed with the *unwrapped* object, but
when unbinding a backbuffer before a swapchain resize, we used the
*wrapped* backbuffer texture to search for clashes. This meant some
bindings went un-noticed, and left references dangling.