* This prevents us from accidentally unwrapping at List2 level when List2 might
not be available, and we only need List.
* If we need higher list levels we can unwrap explicitly, and it's clearer that
it needs an availability check.
* Instead of just configuring SPIR-V disassemblers and picking only the first
one when we need to edit SPIR-V, we allow setting up any shader processor that
goes between two shader encodings.
* When editing, the default will still be to use embedded source, and then after
that the first tool that goes from the native shader format to a text format,
but the drop-down allows you to pick any of them.
* Similarly in the shader viewer you can configure the compilation options and
method, to choose the compiler you want to use. Embedded command line
parameters in the shader are automatically appended.
* This means e.g. the D3D11 back-end can accept DXBC directly if the UI can
provide it, or compile from HLSL as before.
* More importantly, the Vulkan back-end can take SPIR-V compiled from any
source, or compile from GLSL as before as a fall-back.
* This will allow the backend to specify both the native format (e.g. SPIR-V,
DXBC) as well as a language it might be able to internally compile (GLSL or
HLSL).
* The caller will then able to decide for itself whether it wants to compile to
native format and pass that down, or pass the language down and let it be
built internally.
* Currently BuildTargetShader still only accepts shader source.
* For DXBC files, we decode the D3DCOMPILE flags back into fxc parameters, and
vice-versa.
* For SPIR-V, glslang will embed command line parameters as OpModuleProcessed
strings or opcodes.
* This is stored as a "@cmdline" shader compile flag.
* This reduces code complexity and divergence between the backends, as well as
prevents internal resources in captures from being included when 'Ref All
Resources' is enabled.
* This is supported currently in the API inspector, constant buffer previewer, and resource inspector.
* The saved expansions are only saved while the capture is open, and will be reset each time.
* On win32 we can get the target control port instantly and immediately connect
before program startup, on posix systems we must wait until afterwards and
poll for open sockets.
* This means there's a small window of opportunity where the program may have
started running but we haven't connected yet to send any initial commands.
Adding a sleep should give target control time to connect.
* This allows vulkan to handle index buffers with huge differences between
minimum and maximum indices without over-allocating.
* It does mean we can no longer use the original index buffer as-is without
changes, but this is a fair trade-off.
* The new function SetCaptureFileComments allows users to add comments to a
capture after creating it at any time.
* We also use anonymous union to remove the need to duplicate API structs for
backwards compatibility.
* m_ReplayPhysicalDevices contains the physical devices enumerated on replay,
which could be arbitrary and not matching etc.
* m_PhysicalDevices contains the physical devices remapped in order to produce
the closets match to the capture's PD in each slot, using the PDs available.