* This allows us to more accurately display those that have been modified since
the last step, when a source-level step covers multiple instruction-level
steps.
* We also do our own sorting of source variables based on how recently they were
updated. This applies in both directions, so stepping backwards and
'reversing' a variable change will also count as a recent update.
* Since the source vars data doesn't change for a given instruction, we can pre-
calculate it and save time on re-calculating per-state.
* Note callstack *can* change per-state on SPIR-V where the same instruction can
be reached by different flow paths, so the callstack remains part of the per-
state data.
* We can't debug geometry shaders but we can scroll to them, as long as we have
the primitive. We can't differentiate instances currently without passing that
data through from the VS (and through tessellation, if it exists).
* This also disables the debug and goto buttons for printfs from shader stages
that don't support those operations.
* The GL clip origin when changed from lower left to upper left will also invert
the face culling sense. This is deliberate to counteract the fact that
otherwise CW wound triangles would be CCW wound, so the flip means that if
GL_CCW is the front face state and back faces are culled, then visibly CCW
wound triangles will be culled.
* Unifying these views means that constant buffers have all the same
reformatting and it avoids having multiple paths for what is now effectively
the same control (a buffer can either have fixed data, repeating data, or
both)
* GL and Vulkan allow buffers to have fixed variables before a trailing AoS
unbounded array. These fixed variables can't be easily displayed in a table
and previously we skipped them. Now we display these in a tree format.
* We also support formats which don't have an unbounded array at all and display
these just with the tree. This will allow the BufferViewer to subsume the
capabilities of the ConstantBufferPreviewer (though it needs to handle opaque
non-buffer-backed variables, and slot-following).
* This allows the calling code to pass a hint of what packing is known or likely
to be used, meaning less generated manual offsetting/padding when the implicit
rules cover it.
* Instead of having a global tight/non-tight we now let the format string
specify the packing rules (defaulting to scalar - i.e. tight packing as
before), and use the resulting properties to calculate packing.