* This is a backwards-incompatible change, so it's done here before v1.0
so that we can freely break compatibility and not need to define a lot
of ugly compatibility code.
* The primary motivation is to make the serialised data more uniform
and have fewer special cases where the serialised form is naturally
defined from the functions/structs in question.
* There are still some special cases or variances but they should be
more isolated and only where really necessary.
* Remove some cases in the D3D12 struct serialising where we were
directly serialising child struct members in the parent struct.
* We now try to match argument/struct member order as closely as
possible.
* Serialising an array with a count no longer reads the count back out
into that variable, counts must be serialised separately. This means
all members/arguments are explicitly present in the structured data
and also eliminates the awkward case where a count needed to be
serialised separately after an array if we want to have the count be
a valid number even if the array could be NULL. It also means we don't
need the FIXED_COUNT() macro since array lengths can be plain values
and don't have to be a reference type.
* GLES separable programs are completely broken, so we need to just go
back to ye-olde style of linking shaders together. On GLES this is
particularly painful as it means we have to version match whatever
shader the user was using.
* Some functions can be so quick that they register as a duration of 0.
This is expected and we should not end up omitting it when importing
or exporting because we think it was missing. As a 64-bit value,
losing a bit for signedness is not a problem.
* Previously we were relying on the pipeline info create to initialise
the reflection for an entry point, now we do it on demand wherever it
is needed.
* This is a bit less ambiguous and less confusing in the case where
someone is expecting a "compile" type button instead of "save changes"
type button.
* We can't reliably know when we can safely remove the layer property
at capture time because it's impossible to know if an android app will
use vulkan or not. So instead we fall back to unsetting it whenever we
need to - before opening a capture or when shutting down the remote
server (in case after capturing, no frame capture was actually opened)
* This means that if the UI crashes without unsetting it, we will poison
the state, but this seems unavoidable.
* As explained in the code, if we repoint an input variable to refer to
a previously declared private type, it might start referencing forward
in the SPIR-V which is invalid. So to fix this and be safe, we just
move the variable to the end.
* We want to make sure every section always has at least one word in it
so we can unambiguously tell which section we're appending to. If the
debug section is empty, it's hard to tell the difference between
appending to the entry point section and inserting into the debug
section, so we add a nop that will get stripped out later.