* In the case where blending is disabled this gives us the passing shader
output value (when blending is enabled we need to get the in between
fragments, if any.
* Uses occlusion queries to determine which events touch a given pixel
(by replaying with all tests disabled except scissor, and scissoring to
the pixel).
* Caused the render state tracking to get confused (as UAVStartSlot is
used to determine the number of RTVs) and led to weird inconsistent
states being restored. Most obviously led to RTs not being set when
they should have been on replaying and drawcalls going missing.
* NULL specifies that a gap should be made/skipped in the output data.
* This would crash before but now serialises NULL as "" since that's an
invalid SemanticName (must be NULL or name a semantic). This will still
read old logs fine but old programs will not do the right thing on new
logs.
* These often come up when you have an inline array that are dynamically
indexed into (e.g. an array of offsets in a poisson disk used in a loop
that isn't unrolled).
* The explanation is in the FAQ but the short explanation is that most
data e.g. normal maps are conventionally displayed as if they contained
SRGB data, so RenderDoc does the same so things look as expected.
* Print out the type via guid - if we can track which resources are
creating duplicates we can pass the error further back to the Create*
function so we can dump descriptor etc.
* This lets us distinguish framebuffer object 1 on context A from
FBO 1 on context B.
* At the moment we assume that all shareable objects are shared between
all contexts. I think this is sensible and fairly common, but it will
break if some contexts don't share as the objects will alias.
* This is really a spot optimisation but I have a feeling it might be
useful for more programs.
* If a program uses a single VAO and updates the attrib pointers/enables
and disables them, then this will prevent an unbounded number of chunks
building up pointlessly while READING and pushing into the record.
* A 'better' fix for this would be to gather pointer/enabled state as
initial contents and not tracking any of this except for in CAPFRAME,
but that isn't happening at the moment.
* This could be improved and moved further down, not all functions would
need a lock (only things modifying shared resources), but it suffices
for now.