* The code was already handling the replay optimisation level properly, but
without a dummy initial contents we were never even getting to the apply for
memory objects created mid-frame and so without any initial contents.
* If program or shader names are very long then combining them can cause
problems with how wide the widgets get. Splitting each element into a label
that can wrap around and be truncated individually produces better behaviour.
* We also remove some legacy unused behaviour in D3D11/D3D12 that would attempt
to do this but return bogus data with the selected slice first then 1..n
slices after.
* With descriptor buffers we need to ensure images and image views also do not
get destroyed mid capture, similar to what we do for buffers and memory. The
same reasoning applies - we don't want a single BDA to refer to two different
buffers, and we also don't want a single descriptor to alias multiple
resources either.
* Most normal mesh shaders will just have plain values or structs as outputs,
but if e.g. clip distance is used it may be an array itself (then arrayed for
mesh output), so we must handle that.
* Also make the error about duplicate keys less severe - this can happen in
practice as different views boil down to the same descriptor bytes and
applications don't use only one view.
* this code is from before there was a separate section for OpModuleProcessed,
so it is now redundant and can always use the end iterator of the names
section.
* Descriptor sets are neatly independent so it's possible to process them
without needing any other state to be valid, but descriptor buffers can be
partially set state and may also have invalidated state so it's not possible
to process them unless we know we're on a correct action of the corresponding
type.
* For OpenGL we need to remap a 3D block-compressed texture to a 2D array for
display, when doing so we need to account for the mip size when calculating
the size of each chunk of data.