* Instead of having an N:N mapping of parts of variables to parts of registers,
instead we gather everything together under each variable and it has a list of
registers that comprise it.
* Any gaps are represented as undefined register mappings, for components that
aren't available in any register.
* Also adds support for arrays in the type info
* We allow register mapping aliasing since it can happen during function calls
if the same local is declared in two places - the PDB doesn't seem to add a
gap for the 'parent' variable unfortunately.
* CheckUnsupported handles all known compatibility GL functions and extension
functions, so this would only be true for an unpublished or completely new
extension. It might break, but if it's an internal function call it's better
to pass it through.
* We emulate the readback by creating an FBO, binding the texture, and reading
it back. Unfortunately a texture with type GL_ALPHA can't be bound to an FBO,
so the readback fails.
* As a fix, we do a manual draw to a temporary R8 texture with the same
dimensions, then read it back the conventional way. This is wasteful but the
only way.
* In future there may be other formats that can't be bound to an FBO but aren't
compressed.
* VK_EXT_shader_stencil_export and VK_EXT_shader_viewport_index_layer are
shader-only extensions that don't affect the postvs code.
* VK_EXT_depth_range_unrestricted lifts a restriction that we don't care about.
* It turns out there are some corners of the spec where *only* an unsized format
is valid, and a sized format that's at least as large will break, so the only
way to fix this is to preserve unsized formats.
* This does mean things could break if the driver at replay-time makes a
different decision about what sized format to pick, but hopefully that won't
be an issue.
* If the capture requires an external queue but never uses it (e.g. it has some
resource that's on another queue and either incorrectly accesses it on the
wrong queue or doesn't access it at all but still somehow has it referenced)
we need an external queue - if we didn't find one in the capture by the time
we get to ApplyInitialContents() we fetch it ourselves.
* We also fix up device creation info if we've remapped the queues into
duplicates by having the replay with fewer queue families than capture.