* When statically linking libstdc++ by default the symbols are all
default visibility. This causes a problem if you statically link an
old libstdc++ then inject librenderdoc.so, and the application starts
using the old libstdc++ instead of the system's.
* Really we only want to use the static one for calls from
librenderdoc.so. In theory -Wl,--exclude-libs,libstdc++ should do this
for us, but it starts to cause bizarre crashes.
* Instead, we have to resort to a manual linker script which whitelists
which symbols should be visible. Normally we can do this just for our
own symbols with -fvisibility=hidden and __attribute__((visibility))
but that doesn't work for linked symbols apparently.
* The basic idea here is to have a reasonable middleground between
ResizeToContents and Stretch. We want to show at *least* enough for
the contents, but the remaining space should be shared between the
columns according to some proportions.
* That way you don't end up with one huge column and several tiny ones
that are just big enough but no more, but all data is still visible.
* Add scroll areas for the larger tabs and allow pipe flowchart to
resize to its minimum size if needed.
* The idea here isn't that anyone will seriously try to use the pipe
view at 500x200 but more that the minimum size doesn't become a
problem while moving around windows or panels, or resizing temporarily
* This prevents a feedback loop where the label resizes wider to make
room for the margins, then the margins get bigger to keep the image
centred/scaled properly, etc.
* This way it can be used from Qt or any other UI as well.
* The pipes are created internally and just passed as stdin to the
renderdoccmd processes instead of being named pipes.
* These structs were no longer used since the memory wholeMemBuf was
added, and they had some confusing enum usage that triggered static
analysis warnings.
* When descriptor sets are invalidated and we have stale bindings around
we cannot bind them or it will lead to invalid behaviour and crashes.
* However it's possible for set 0 to be invalid/stale and set 1 to be
valid and required, so we can't bail out at the first invalid set. We
keep iterating and bind all valid compatible sets.