* On all APIs structs are aligned up to 16-byte alignment, and on D3D as with
arrays then elements coming after the struct can be packed into the padding
after the last struct element.
* These tests ensure that texture rendering works correctly for all different
types of texture types, and for all formats, across different APIs, including
across a remote-proxy connection.
* Even if we can map a remote format precisely to a local API format, that
doesn't mean the local API driver supports it - we need to check, otherwise
force a remap.
* When we create proxy textures on D3D we create them as typeless, but this
means we might lose the only time we are told about the type interpretation of
the texture. If we then later get asked to view the texture as typeless, be
sure to use that type info to interpret it, instead of defaulting to UNORM or
FLOAT.
* On APIs like vulkan the view casting happens from an already typed format, so
don't assume that casts are only applied when the underlying format is
typeless. When a cast is not valid the view format should never be different
from the underlying image format as the API should never make it possible to
validly create or bind a view with a different format.
* Conventionally images have an origin at the top left, opposite to GL, so we
want to flip the same as the replay proxy using GL as a proxy renderer for a
non-GL API.
* Since GL requires a concrete texture format, we create the textures as UINT
format, and then cast to the right view on display once we know.
* The cast requires a copy - ARB_texture_view isn't always supported and even
when they are they require immutable textures (ARB_texture_storage) which we
don't want to require either.
* Subresource handling is more consistent - we pass around a struct now that
contains the array slice, mip level, and sample. We remove the concept of
'MSAA textures count samples as extra slices within the real slices' and
internalise that completely. This also means we have a consistent set
everywhere that we need to refer to a subresource.
* Functions that used to be in the ReplayOutput and use a couple of implicit
parameters from the texture viewer configuration are now in the
ReplayController and take them explicitly. This includes GetMinMax,
GetHistogram, and PickPixel.
* Since these functions aren't ReplayOutput relative, if you want to decode the
custom shader texture or the overlay texture you need to pass that ID
directly.