* The example case is as follows:
- program binds a pipeline and 4 sets
- later, program rebinds a different pipeline with incompatible layout
- all 4 sets are invalid
- program only binds 2 sets as new program shaders only statically use
the first 2 sets.
* If we try to 'restore' the invalid set bindings at any point this is
invalid and can lead to crashes. We need to detect when sets have been
invalidated and bail out, assuming that the shader only statically
uses the sets that were valid.
* Of course if that is an unfounded assumption then we are not binding
sets that will be used, but this is just as invalid as leaving used
sets as invalid.
* We also need to change the PostVS data fetch, since we can't use the
set after all used sets, we have to instead see which set is the last
statically used one and use the next (even if it's in the original
layout).
* This fixes an edge case where we are connecting to a local IP that is
SSH port forwarded to a remote machine. We don't want to identify
remote files as local files and try to open them, so just do the easy
check of verifying if the file is available locally.
* This was only added because the default tree widget controls don't
render any grid lines. Now that we're custom drawing them, the row
colors are distracting and can be confusing on themes where the
selected row is very faint.
* This means that e.g. right clicking on an item in a list/tree widget
will make sure it's selected before trying to display a context menu
or anything.
* IronPython >= 2.7.5, if installed, adds a *global* redirect so all
programs (like renderdoc) that tried to reference the 2.7.4 they
provided will instead get redirected to 2.7.5. Whether or not it even
exists.
* We can point the platform plugins path at the application dir for
qwindows.dll for example, but there's no equivalent for image format
plugins which we need for qsvg.dll. So instead we shove them all under
an explicit qtplugins path.
* Also now that we have this, copy qsvg.dll into the distribution.
* Even if we don't have pyside2 to treat qwidgets as full objects and
access their methods and data, we still need to be able to pass around
the QWidget* as an opaque pointer to be able to use the API properly.
* This change falls back to just using SWIG's default opaque pointer
wrapping and unwrapping when pyside2 isn't available.
* Any work that might use Qt needs to happen on the UI thread, so when
running a python script on the python thread we need to invoke across.
We wrap the main ICaptureContext interface to block invoke onto the UI
for any function calls that aren't just returning internal data.
* The error handling code will be OK if a NULL parameter was passed in
but during cleanup it will go through tempdealloc, so we need to check
that the pointer is actually valid.
* QShortcut falls down on duplicates. It can have activatedAmbiguously
events, but these happen in arbitrary order and the shortcuts on
menu items just swallow the ambiguous activate so it's not useful.
* Instead we just let MainWindow pick up ShortcutOverride events and
consult a mapping of which shortcuts to use. We can use a smarter
selection method to choose the more 'local' shortcut if two shortcuts
that conflict exist.
There are a few places where the logical 'and' operator
was used to check if a given flag is enabled however
that is not the correct operator.
The binary 'and' operator should be used where
the enum acts as a flag.